概念介绍
幂等性
以结果为导向,如果目标主机已经做过操作了,Ansible 不会再做一遍
有些模块有幂等性的参数,例如 command
的 creates
removes
命令
# 使用 -s 查看模块的基本功能
ansible -s ping
# 检查语法
ansible-playbook --syntax-check /testdir/ansible/test.yml
模块
文件类
fetch
从受控主机上拿文件到 ansible 主机
使用示例
ansible ecs -m fetch -a "src=/etc/fstab dest=."
file
copy
示例
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/"
# 拷贝文本内容到远程主机
ansible ecs -m copy -a "content="aaa\nbbb\n" dest=/root/ip_list"
# force 表示,如果远程主机已经有同名的文件,则不进行覆盖
ansible ecs -m copy -a "content="aaa\nbbb\nccc" dest=/root/ip_list force=no"
# 如果有同名文件,则先备份文件,再拷贝
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ backup=yes"
Blockinfile
可以在文本文件中添加一段文字
示例
ansible ecs -m blockinfile -a 'path=/root/ip_list block="houmingming@mMacBook-Pro mark"'
# #{mark} 表示BEGIN 和 END
ansible ecs -m blockinfile -a 'path=/root/ip_list block="houmingming@mMacBook-Pro mark" marker="#{mark} service is start"'
也可以将文件插入到最上边或结尾,或者是用正则表达式匹配后插入到指定位置
也可以判断文件是否存在,如果不存在的话创建文件
lineinfile
类似 sed 命令
用于在源文件中插入、删除、替换行,也支持正则表达式匹配和替换
示例
# 添加一行内容
ansible -i inventory demo -m lineinfile -a 'path=/root/.ssh/authorized_keys line="ssh-rsa AAy2CHBhV tiops-login-key"'
# 删除某一行内容
ansible -i inventory demo -m lineinfile -a "dest=/root/.ssh/authorized_keys regexp='(.*)houmingming@MacBook-Pro.local' state=absent"
# 替换内容
ansible -i inventory demo --limit 10.1.1.1 -m replace -a "path=/etc/sysconfig/tcconfig regexp='BW=500mbps' replace='BW=100mbps'"
可以结合 insertbefore
和 insertafter
插入到指定行的前面或后面
示例如下
- name: test inlinefile
hosts: localhost
gather_facts: false
tasks:
- lineinfile:
path: "a.txt"
line: "LINE2"
insertbefore: '^para.*2'
# insertbefore 和 insertafter 指定正则表达式时,如果匹配到了多行,默认选中最后一个匹配行
# 如果要指定选中第一次匹配的行,则指定参数 `firstmatch=yes`
# 替换内容示例
- name: test inlinefile
hosts: localhost
gather_facts: false
tasks:
- lineinfile:
path: "a.txt"
line: "demo1"
regexp: '^para.*2'
- lineinfile:
path: "a.txt"
line: "hello line"
regexp: '^hello'
insertbefore: '^para.* 1'
# 用 `regexp` 替换时,可以实现幂等性
find
就像 find 模块一样
replace
可以用正则表达式替换文本中的字符串
命令类
command
不识别 shell 的管道符、重定向等
ansible -i inventory demo -m command -a 'systemctl start keepalived'
shell
script
可以在远程主机上执行 Ansible 主机上的脚本,注意,脚本是不用复制到远程主机上的
debug
系统类
hostname
- name: set hostname
hosts: drbd
gather_facts: false
vars:
hostnames:
- host: 172.19.10.110
name: new1
- host: 172.19.10.111
name: new2
tasks:
- name: set hostname
hostname:
name: "{{item.name}}"
when: item.host == inventory_hostname
loop: "{{hostnames}}"
cron
service
可以管理远程主机的服务
user
group
authorized_key
分发 key 的模块,经常使用,使用示例如下
- name: config ssh connection
hosts: ecs
gather_facts: false
tasks:
- authorized_key:
key: "{{lookup('file', '~/.ssh/id_rsa.pub')}}"
state: present
user: root
# root 表示放到目标主机 root 用户下
# present 表示如果对方文件中已有完全相同的公钥信息时,不写入,否则进行写入
lookup() 或 query()
lookup() 是 ansible 的一个插件,可用于外部读取数据,这里的外部定义比较广泛
lookup 后面跟括号和参数,具体参数使用如下
- file:从磁盘读取文件
即使hosts
写了远端的服务器,也只能读取本地文件
- name: debug fileglob
hosts: ecs
gather_facts: false
tasks:
- name: task2
debug:
msg: "file connect: {{lookup('file','/etc/hosts')}}"
- fileglob:通过通配符匹配本地端的文件名,不可以同配目录,不会递归通配,如果要查询目标主机的文件,可使用
find
模块
- name: debug fileglob
hosts: ecs
gather_facts: false
tasks:
- name: task1
debug:
msg: "filenames: {{lookup('fileglob','/etc/*.conf')}}"
- redis:从 redis 中读取
- pipe:可以在本地端执行命令,并从结果中读取数据
- 从 ansible 变量中读取
- 从 ansible 列表中读取
- 从 ansible 字典中读取
具体从哪些 “外部” 读取,可以参考这个链接 https://docs.ansible.com/ansible/latest/plugins/lookup.html#plugin-list
query()
query 是 ansible 2.5 添加的新功能,写法和 lookup 类似,运行时会自动调用 lookup 插件,并且总是以列表方式返回,不需要加上 wantlist=True
参数
包管理模块
yum_repository
yum
可以安装包、卸载包或升级
功能
tags
如果有一段很长的 playbook,但某次运行时,只希望执行部分功能,可以用 tags 解决