ansible判断
一、判断运算符
“==” “!=” “>” “<” “>=” “<=” “and” “or” “not” is in
每次执行完一个任务,不管成功与失败,都会将执行的结果进行注册,可以使用这个注册的变量来判断
when:真命题(运行这个任务)
when:假命题(跳过这个任务)
二、判断变量的一些tests
Defined:判断变量是否已经定义,已定义则返真
Undefined:判断变量是否已经定义,未定义则返真
None:判断变量值是否为空,如果变量已经定义,但是变量值为空,则返真
真命题运行假命题跳过
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [test1] ***************************************************************************
ok: [node1] => {
"msg": 111
}
TASK [test2] ***************************************************************************
skipping: [node1]
TASK [test3] ***************************************************************************
ok: [node1] => {
"msg": 333
}
PLAY RECAP *****************************************************************************
node1 : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
aa: 1
cc:
tasks:
- name: test1
debug:
msg: 111
when: aa is defined
- name: test2
debug:
msg: 222
when: cc is undefined
- name: test3
debug:
msg: 333
when: cc is none
三、判断执行结果的一些tests
Success/successed:通过任务的返回信息判断执行状态,任务执行成功返回真
Failure/failed:通过执行任务的返回信息判断执行状态,任务执行失败则返回真
Change/changed:通过任务的返回信息判断执行状态,任务返回状态为changed则返回真
Skip/skipped:通过任务的返回信息判断执行状态,当任务没有满足条件,而被跳过执行,则返回真。
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [shell] ***************************************************************************
changed: [node1]
TASK [create debug1 success] ***********************************************************
ok: [node1] => {
"msg": "chenyu success"
//success中包含success和change状态,只要运行shell模块,一般success都会被触发
}
TASK [create debug2 fail] **************************************************************
skipping: [node1] //没有失败,是假命题不触发,跳过
TASK [create debug3 change] ************************************************************
ok: [node1] => {
"msg": "chenyu changed" //shell模块,每运行一次状态都会改变,真命题
}
TASK [create debug4 skip] **************************************************************
skipping: [node1] //假命题,注册变量没有跳过
PLAY RECAP *****************************************************************************
node1 : ok=4 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
aa: 11
tasks:
- name: shell
shell:
cmd: ls /mnt
when: aa == 11
register: dd
- name: create debug1 success
debug:
msg: chenyu success
when: dd is success
- name: create debug2 fail
debug:
msg: chenyu failed
when: dd is failed
- name: create debug3 change
debug:
msg: chenyu changed
when: dd is changed
- name: create debug4 skip
debug:
msg: chenyu skip
when: dd is skip
将shell模块中的(aa == 11改为 aa == 111,其余不变)
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [shell] ***************************************************************************
skipping: [node1]
TASK [create debug1 success] ***********************************************************
ok: [node1] => {
"msg": "chenyu success"
//这里的success是指register已经注册(不管结果是失败还是成功,register都会注册)
}
TASK [create debug2 fail] **************************************************************
skipping: [node1]
TASK [create debug3 change] ************************************************************
skipping: [node1] //没有运行shell模块的任务,不改变状态,假命题
TASK [create debug4 skip] **************************************************************
ok: [node1] => {
"msg": "chenyu skip" //这里是指shell模块这一个任务会跳过,是真命题
}
PLAY RECAP *****************************************************************************
node1 : ok=3 changed=0 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
aa: 11
tasks:
- name: shell
shell:
cmd: ls /mnt
when: aa == 111
register: dd
- name: create debug1 success
debug:
msg: chenyu success
when: dd is success
- name: create debug2 fail
debug:
msg: chenyu failed
when: dd is failed
- name: create debug3 change
debug:
msg: chenyu changed
when: dd is changed
- name: create debug4 skip
debug:
msg: chenyu skip
when: dd is skip
将shell模块中cmd中的/mnt目录改为一个不存在的目录/mnttt,然后忽略错误
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [shell] ***************************************************************************
fatal: [node1]: FAILED! => {"changed": true, "cmd": "ls /mnttt", "delta": "0:00:00.012883", "end": "2025-09-03 15:31:31.179016", "msg": "non-zero return code", "rc": 2, "start": "2025-09-03 15:31:31.166133", "stderr": "ls: cannot access '/mnttt': No such file or directory", "stderr_lines": ["ls: cannot access '/mnttt': No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [create debug1 success] ***********************************************************
skipping: [node1] //执行过程中报错,不属于success,只属于change,是假命题
TASK [create debug2 fail] **************************************************************
ok: [node1] => {
"msg": "chenyu failed" //任务执行失败,是真命题
}
TASK [create debug3 change] ************************************************************
ok: [node1] => {
"msg": "chenyu changed" //状态改变,是真命题
}
TASK [create debug4 skip] **************************************************************
skipping: [node1] //执行了shell任务,只是执行失败了,没有跳过,假命题
PLAY RECAP *****************************************************************************
node1 : ok=4 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=1
---
- name: test
hosts: node1
vars:
aa: 11
tasks:
- name: shell
shell:
cmd: ls /mnttt
when: aa == 11
register: dd
ignore_errors: yes
- name: create debug1 success
debug:
msg: chenyu success
when: dd is success
- name: create debug2 fail
debug:
msg: chenyu failed
when: dd is failed
- name: create debug3 change
debug:
msg: chenyu changed
when: dd is changed
- name: create debug4 skip
debug:
msg: chenyu skip
when: dd is skip
四、判断路径的一些tests
注意:以下tests的判断均对ansible主机中的路径,与目标主机无关
file:判断路径是否是一个文件
directory:判断路径是否是一个目录
link:判断路径是否是一个软连接
mount:判断路径是否是一个挂载点
exists:判断路径是否存在
[root@master ~]# mkdir /test
[root@master ~]# cd /test
[root@master test]# ls
[root@master test]# touch file1
[root@master test]# ln file1 hardlinka
[root@master test]# ln -s file1 softlinka
[root@master test]# ls /boot
config-5.14.0-284.11.1.el9_2.x86_64
efi
grub2
initramfs-0-rescue-2f9f0077c581410cb49dd25158683ea3.img
initramfs-5.14.0-284.11.1.el9_2.x86_64.img
loader
symvers-5.14.0-284.11.1.el9_2.x86_64.gz
System.map-5.14.0-284.11.1.el9_2.x86_64
vmlinuz-0-rescue-2f9f0077c581410cb49dd25158683ea3
vmlinuz-5.14.0-284.11.1.el9_2.x86_64
[root@master test]# su - student
Last login: Wed Sep 3 10:04:10 CST 2025 on pts/0
[student@master ~]$ cd ansible/
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": "this is file"
}
TASK [debug2] **************************************************************************
ok: [node1] => {
"msg": "this is directory"
}
TASK [debug3] **************************************************************************
ok: [node1] => {
"msg": "this is softlink"
}
TASK [debug4] **************************************************************************
skipping: [node1]
TASK [debug5] **************************************************************************
ok: [node1] => {
"msg": "this is mount directory"
}
TASK [debug6] **************************************************************************
ok: [node1] => {
"msg": "this is exists"
}
PLAY RECAP *****************************************************************************
node1 : ok=6 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
a1: /test/file1
a2: /test/
a3: /test/softlinka
a4: /test/hardlinka
a5: /boot/
tasks:
- name: debug1
debug:
msg: this is file
when: a1 is file
- name: debug2
debug:
msg: "this is directory"
when: a2 is directory
- name: debug3
debug:
msg: "this is softlink"
when: a3 is link
- name: debug4
debug:
msg: "this is hardlink"
when: a4 is link
- name: debug5
debug:
msg: "this is mount directory"
when: a5 is mount
- name: debug6
debug:
msg: "this is exists"
when: a1 is exists
五、判断字符串的一些tests
lower:判断包含字母的字符串中的字母是否纯小写
upper:判断包含字母的字符串中的字母是否纯大写
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": "this string is all lower"
}
TASK [debug2] **************************************************************************
ok: [node1] => {
"msg": "this string is all upper"
}
TASK [debug3] **************************************************************************
ok: [node1] => {
"msg": "chenyu"
}
PLAY RECAP *****************************************************************************
node1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
a1: abc
a2: ABC
a3: a1b
tasks:
- name: debug1
debug:
msg: this string is all lower
when: a1 is lower
- name: debug2
debug:
msg: this string is all upper
when: a2 is upper
- name: debug3
debug:
msg: chenyu
when: a3 is lower
六、其他的一些tests
string:判断对象是否是一个字符串
number:判断对象是否一个数字
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": "this is number"
}
TASK [debug2] **************************************************************************
ok: [node1] => {
"msg": "this is string"
}
TASK [debug3] **************************************************************************
ok: [node1] => {
"msg": "this is string"
}
PLAY RECAP *****************************************************************************
node1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
a1: 1
a2: "1"
a3: a
tasks:
- name: debug1
debug:
msg: this is number
when: a1 is number
- name: debug2
debug:
msg: this is string
when: a2 is string
- name: debug3
debug:
msg: this is string
when: a3 is string
七、block、rescue、always
重点:block/rescue/always: 限制性block,如果执行失败,则执行rescue,无论是block还是rescue执行失败还是成功,在最后都执行always
block(成功)----- always
block(失败)------ rescue ------- always
例题:
创建一个名为/etc/ansible/lv.yml 的playbook,它将在所有受管节点上运行以执行下列任务:
创建符合以下要求的逻辑卷:
逻辑卷创建在research卷组中
逻辑卷名称为data
逻辑卷大小为1500MiB
使用ext4文件系统格式化逻辑卷
如果无法创建请求的逻辑卷大小:
应显示错误消息: Could not create logical volume of that size,并且应改为使用大小 800MiB。
如果卷组research 不存在 :
应显示错误消息: Volume group does not exist。
不要以任何方式挂载逻辑卷
1、步骤
前提:在node1、node2上添加一块硬盘,然后新建卷组
Node1的卷组大小为2G 卷组名为research
Node2的卷组大小为1G 卷组名为research
(1)对所有主机配置yum仓库,并安装lvm2
[student@master ansible]$ vim repo.yml
[student@master ansible]$ ansible-playbook repo.yml
PLAY [repo] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node4]
ok: [node1]
ok: [node2]
ok: [node5]
ok: [node3]
TASK [repo1] ***************************************************************************
changed: [node5]
changed: [node3]
ok: [node1]
changed: [node2]
changed: [node4]
TASK [repo2] ***************************************************************************
ok: [node1]
changed: [node3]
changed: [node2]
changed: [node5]
changed: [node4]
TASK [install lvm2] ********************************************************************
changed: [node1]
changed: [node4]
changed: [node3]
changed: [node5]
changed: [node2]
PLAY RECAP *****************************************************************************
node1 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
---
- name: repo
hosts: all
tasks:
- name: repo1
yum_repository:
name: aa
description: aa1
baseurl: http://ansible.example.com/rhel9/BaseOS
enabled: yes
gpgcheck: no
- name: repo2
yum_repository:
name: bb
description: bb1
baseurl: http://ansible.example.com/rhel9/AppStream
enabled: yes
gpgcheck: no
- name: install lvm2
yum:
name: lvm2
state: present
(2)Node1的卷组大小为2G 卷组名为research ,Node2的卷组大小为1G 卷组名为research
[student@master ansible]$ vim vg.yml
[student@master ansible]$ ansible-playbook vg.yml
PLAY [create vg for node1] *************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [create parted] *******************************************************************
changed: [node1]
TASK [create vg] ***********************************************************************
changed: [node1]
PLAY [create vg for node2] *************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node2]
TASK [create parted1] ******************************************************************
changed: [node2]
TASK [create vg1] **********************************************************************
changed: [node2]
PLAY RECAP *****************************************************************************
node1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
---
- name: create vg for node1
hosts: node1
tasks:
- name: create parted
parted:
device: /dev/vdb
number: 1
part_type: primary
part_start: 10MiB
part_end: 2010MiB
state: present
- name: create vg
lvg:
vg: research
pvs: /dev/vdb1
- name: create vg for node2
hosts: node2
tasks:
- name: create parted1
parted:
device: /dev/vdb
number: 1
part_type: primary
part_start: 10MiB
part_end: 1010MiB
state: present
- name: create vg1
lvg:
vg: research
pvs: /dev/vdb1
(3)
<1> when:卷组存在:‘research’ in ansible_lvm.vgs
block:创建1500M逻辑卷
rescue:显示错误信息: Could not create logical volume of that size、创建800M逻辑卷
always:格式化:ext4
<2> when:卷组不存在:‘research’ not in ansible_lvm.vgs
显示错误消息:Volume group does not exist
[student@master ansible]$ vim lv.yml
[student@master ansible]$ ansible-playbook lv.yml
PLAY [creat lv] ************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node5]
ok: [node4]
ok: [node2]
ok: [node1]
ok: [node3]
TASK [create 1500 lv] ******************************************************************
skipping: [node3]
skipping: [node4]
skipping: [node5]
fatal: [node2]: FAILED! => {"changed": false, "err": " Volume group \"research\" has insufficient free space (249 extents): 375 required.\n", "msg": "Creating logical volume 'data' failed", "rc": 5}
changed: [node1]
TASK [output fail message] *************************************************************
ok: [node2] => {
"msg": "Could not create logical volume of that size"
}
TASK [create 800 lv] *******************************************************************
changed: [node2]
TASK [mkfs] ****************************************************************************
skipping: [node3]
skipping: [node4]
skipping: [node5]
changed: [node1]
changed: [node2]
TASK [vg not exists] *******************************************************************
skipping: [node1]
skipping: [node2]
ok: [node3] => {
"msg": "Volume group does not exist"
}
ok: [node4] => {
"msg": "Volume group does not exist"
}
ok: [node5] => {
"msg": "Volume group does not exist"
}
PLAY RECAP *****************************************************************************
node1 : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
node2 : ok=4 changed=2 unreachable=0 failed=0 skipped=1 rescued=1 ignored=0
node3 : ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
node4 : ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
node5 : ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
---
- name: creat lv
hosts: all
tasks:
- name: create lv1
block:
- name: create 1500 lv
lvol:
lv: data
vg: research
size: 1500
rescue:
- name: output fail message
debug:
msg: Could not create logical volume of that size
- name: create 800 lv
lvol:
lv: data
vg: research
size: 800
always:
- name: mkfs
filesystem:
fstype: ext4
dev: /dev/research/data
when: "'research' in ansible_lvm.vgs"
- name: vg not exists
debug:
msg: Volume group does not exist
when: "'research' not in ansible_lvm.vgs"
八、判断与错误处理
fail模块可用于中断剧本,但我们一般是不会无故中断,除非在满足条件的情况下可以中断,经常和when一起用
(1)fail模块和when搭配使用
[student@master ansible]$ vim c.yml
[student@master ansible]$ ansible-playbook c.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [shell] ***************************************************************************
changed: [node1]
TASK [fail] ****************************************************************************
fatal: [node1]: FAILED! => {"changed": false, "msg": "Conditions established,Interrupt running playbook"} //这里fail模块是真命题会执行,中断后后面的任务不执行
PLAY RECAP *****************************************************************************
node1 : ok=2 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
---
- name: test
hosts: node1
tasks:
- name: shell
shell:
cmd: echo 'this is a string for testing--error'
register: return_value
- name: fail
fail:
msg: Conditions established,Interrupt running playbook
when: "'error' in return_value.stdout"
- name: debug
debug:
msg: I never execute,because the playbook has stopped
(2)使用failed_when
[student@master ansible]$ ansible-playbook e.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": 123
}
TASK [debug2] **************************************************************************
fatal: [node1]: FAILED! => {
"msg": 234
}
PLAY RECAP *****************************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
---
- name: test
hosts: node1
vars:
aa: 1
tasks:
- name: debug1
debug:
msg: 123
- name: debug2
debug:
msg: 234
failed_when: aa is defined
- name: debug3
debug:
msg: 345
九、ignore_errors: yes 跳过错误、忽略错误
[student@master ansible]$ vim e.yml
[student@master ansible]$ ansible-playbook e.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": 123
}
TASK [debug2] **************************************************************************
fatal: [node1]: FAILED! => {
"msg": 234
}
...ignoring
TASK [debug3] **************************************************************************
ok: [node1] => {
"msg": 345
}
PLAY RECAP *****************************************************************************
node1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
---
- name: test
hosts: node1
vars:
aa: 1
tasks:
- name: debug1
debug:
msg: 123
- name: debug2
debug:
msg: 234
failed_when: aa is defined
ignore_errors: yes
- name: debug3
debug:
msg: 345
十、Changed_when:可以修改任务执行后的最终状态
---
- name: test
hosts: node1
vars:
aa: 1
tasks:
- name: debug1
debug:
msg: 123
- name: debug3
debug:
msg: 345
---
- name: test
hosts: node1
vars:
aa: 1
tasks:
- name: debug1
debug:
msg: 123
changed_when: true
- name: debug3
debug:
msg: 345
或者可以让任务执行状态显示失败: changed_when: false
一些循环和判断的案例:
案例一:
从 http://ansible.example.com/materials/newhosts.j2 下载模板文件
完成该模板文件,用来生成新主机清单(主机的显示顺序没有要求),结构如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.122.10 node1.example.com node1
192.168.122.20 node2.example.com node2
192.168.122.30 node3.example.com node3
192.168.122.40 node4.example.com node4
192.168.122.50 node5.example.com node5
创建剧本/home/student/ansible/newhosts.yml,它将使用上述模板在 node1 主机组的主机上
生成文件/etc/newhosts
(1)下载模板
[student@master ansible]$ curl -O http://ansible.example.com/materials/newhosts.j2
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 158 100 158 0 0 2468 0 --:--:-- --:--:-- --:--:-- 2548
[student@master ansible]$ ls
aaa.ymlstw a.yml b.yml c.yml e.yml lv.yml pass roles
ansible.cfg bbb.ymlstw collections d.yml inventory newhosts.j2 repo.yml vg.yml
[student@master ansible]$ cat newhosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
(2)在这个模版里面写一个for循环(使用hostvars:里面包含所有受控主机)
(i:变量,一次为node1、node2、node3、node4、node5)
把所有受控主机的IP地址 完全合格域名 主机名 都输出一遍
[student@master ansible]$ vim newhosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for i in groups.all %}
{{ hostvars[i].ansible_default_ipv4.address }} {{ hostvars[i].ansible_fqdn }} {{ hostvars[i].ansible_hostname }}
{% endfor %}
(3)写newhosts.yml剧本
[student@master ansible]$ vim newhosts.yml
---
- name: get fact
hosts: all
- name: cp file
hosts: node1
tasks:
- name: cp file1
template:
src: /home/student/ansible/newhosts.j2
dest: /etc/newhosts
(4)执行newhosts.yml剧本,并查看
[student@master ansible]$ ansible-playbook newhosts.yml
PLAY [get fact] ************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
ok: [node4]
ok: [node5]
ok: [node3]
ok: [node2]
PLAY [cp file] *************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
TASK [cp file1] ************************************************************************
changed: [node1]
PLAY RECAP *****************************************************************************
node1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ ansible node1 -m shell -a 'cat /etc/newhosts'
node1 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.122.10 node1.example.com node1
192.168.122.20 node2.example.com node2
192.168.122.30 node3.example.com node3
192.168.122.40 node4.example.com node4
192.168.122.50 node5.example.com node5
案例二:
编写剧本修改远程文件内容
创建剧本 /home/student/ansible/newissue.yml,满足下列要求:
1)在所有清单主机上运行,替换/etc/issue 的内容
2)对于 test01 主机组中的主机,/etc/issue 文件内容为 test01
3)对于 test02 主机组中的主机,/etc/issue 文件内容为 test02
4)对于 web 主机组中的主机,/etc/issue 文件内容为 Webserver
(1)编辑主机清单
[student@master ansible]$ vim inventory
[student@master ansible]$ cat inventory
[test01]
node1
[test02]
node2
[web]
node3
node4
[test05]
node5
[webtest:children]
web
(2)编写newissue.yml剧本,并测试结果
[student@master ansible]$ vim newissue.yml
[student@master ansible]$ ansible-playbook newissue.yml
PLAY [replace file] ********************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node4]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node2]
TASK [test1] ***************************************************************************
changed: [node1]
changed: [node3]
changed: [node2]
changed: [node5]
changed: [node4]
PLAY RECAP *****************************************************************************
node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ ansible all -m shell -a 'cat /etc/issue'
node3 | CHANGED | rc=0 >>
Webserver
node2 | CHANGED | rc=0 >>
test02
node1 | CHANGED | rc=0 >>
test01
node4 | CHANGED | rc=0 >>
Webserver
node5 | CHANGED | rc=0 >>
---
- name: replace file
hosts: all
tasks:
- name: test1
copy:
content: |
{% if 'test01' in group_names %}
test01
{% elif 'test02' in group_names %}
test02
{% elif 'web' in group_names %}
Webserver
{% endif %}
dest: /etc/issue