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: testhosts: node1vars:aa: 1cc:tasks:- name: test1debug:msg: 111when: aa is defined- name: test2debug:msg: 222when: cc is undefined- name: test3debug:msg: 333when: 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: testhosts: node1vars:aa: 11tasks:- name: shellshell:cmd: ls /mntwhen: aa == 11register: dd- name: create debug1 successdebug:msg: chenyu successwhen: dd is success- name: create debug2 faildebug:msg: chenyu failedwhen: dd is failed- name: create debug3 changedebug:msg: chenyu changedwhen: dd is changed- name: create debug4 skipdebug:msg: chenyu skipwhen: 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: testhosts: node1vars:aa: 11tasks:- name: shellshell:cmd: ls /mntwhen: aa == 111register: dd- name: create debug1 successdebug:msg: chenyu successwhen: dd is success- name: create debug2 faildebug:msg: chenyu failedwhen: dd is failed- name: create debug3 changedebug:msg: chenyu changedwhen: dd is changed- name: create debug4 skipdebug:msg: chenyu skipwhen: 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": []}
...ignoringTASK [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: testhosts: node1vars:aa: 11tasks:- name: shellshell:cmd: ls /mntttwhen: aa == 11register: ddignore_errors: yes- name: create debug1 successdebug:msg: chenyu successwhen: dd is success- name: create debug2 faildebug:msg: chenyu failedwhen: dd is failed- name: create debug3 changedebug:msg: chenyu changedwhen: dd is changed- name: create debug4 skipdebug:msg: chenyu skipwhen: 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: testhosts: node1vars:a1: /test/file1a2: /test/a3: /test/softlinkaa4: /test/hardlinkaa5: /boot/tasks:- name: debug1debug:msg: this is filewhen: a1 is file- name: debug2debug:msg: "this is directory"when: a2 is directory- name: debug3debug:msg: "this is softlink"when: a3 is link- name: debug4debug:msg: "this is hardlink"when: a4 is link- name: debug5debug:msg: "this is mount directory"when: a5 is mount- name: debug6debug: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: testhosts: node1vars:a1: abca2: ABCa3: a1btasks:- name: debug1debug:msg: this string is all lowerwhen: a1 is lower- name: debug2debug:msg: this string is all upperwhen: a2 is upper- name: debug3debug:msg: chenyuwhen: 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: testhosts: node1vars:a1: 1a2: "1"a3: atasks:- name: debug1debug:msg: this is numberwhen: a1 is number- name: debug2debug:msg: this is stringwhen: a2 is string- name: debug3debug:msg: this is stringwhen: 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: repohosts: alltasks:- name: repo1yum_repository:name: aadescription: aa1baseurl: http://ansible.example.com/rhel9/BaseOSenabled: yesgpgcheck: no- name: repo2yum_repository:name: bbdescription: bb1baseurl: http://ansible.example.com/rhel9/AppStreamenabled: yesgpgcheck: no- name: install lvm2yum:name: lvm2state: 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 node1hosts: node1tasks:- name: create partedparted:device: /dev/vdbnumber: 1part_type: primarypart_start: 10MiBpart_end: 2010MiBstate: present- name: create vglvg:vg: researchpvs: /dev/vdb1- name: create vg for node2hosts: node2tasks:- name: create parted1parted:device: /dev/vdbnumber: 1part_type: primarypart_start: 10MiBpart_end: 1010MiBstate: present- name: create vg1lvg:vg: researchpvs: /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 lvhosts: alltasks:- name: create lv1block:- name: create 1500 lvlvol:lv: datavg: researchsize: 1500rescue:- name: output fail messagedebug:msg: Could not create logical volume of that size- name: create 800 lvlvol:lv: datavg: researchsize: 800always:- name: mkfsfilesystem:fstype: ext4dev: /dev/research/datawhen: "'research' in ansible_lvm.vgs"- name: vg not existsdebug:msg: Volume group does not existwhen: "'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: testhosts: node1tasks:- name: shellshell:cmd: echo 'this is a string for testing--error'register: return_value- name: failfail:msg: Conditions established,Interrupt running playbookwhen: "'error' in return_value.stdout"   - name: debugdebug: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: testhosts: node1vars:aa: 1tasks:- name: debug1debug:msg: 123- name: debug2debug:msg: 234failed_when: aa is defined- name: debug3debug: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
}
...ignoringTASK [debug3] **************************************************************************
ok: [node1] => {"msg": 345
}PLAY RECAP *****************************************************************************
node1                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   
---
- name: testhosts: node1vars:aa: 1tasks:- name: debug1debug:msg: 123- name: debug2debug:msg: 234failed_when: aa is definedignore_errors: yes- name: debug3debug:msg: 345
十、Changed_when:可以修改任务执行后的最终状态
---
- name: testhosts: node1vars:aa: 1tasks:- name: debug1debug:msg: 123- name: debug3debug:msg: 345

在这里插入图片描述

---
- name: testhosts: node1vars:aa: 1tasks:- name: debug1debug:msg: 123changed_when: true- name: debug3debug: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  CurrentDload  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 facthosts: all
- name: cp filehosts: node1tasks:- name: cp file1template:src: /home/student/ansible/newhosts.j2dest: /etc/newhosts

在这里插入图片描述

(4)执行newhosts.yml剧本,并查看
[student@master ansible]$ ansible-playbook newhosts.ymlPLAY [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 filehosts: alltasks:- name: test1copy:content: |{% if 'test01' in group_names %}test01{% elif 'test02' in group_names %}test02{% elif 'web' in group_names %}Webserver{% endif %}dest: /etc/issue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95453.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95453.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95453.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口设计标准化流程,结合RESTful最佳实践和实际开发经验,涵盖从需求分析到部署的全过程

目录一、接口设计流程二、需求分析阶段1. 功能需求2. 非功能性需求三、接口设计规范四、详细实现步骤1. 选择Web框架2. 接口路由设计3. 请求参数定义4. 请求参数验证5. 业务逻辑分层6. 错误处理机制7. 异步任务处理8. 安全策略9. 接口文档10. 测试策略11. 服务部署11.1 生产环境…

LeetCode 1023.驼峰式匹配

给你一个字符串数组 queries&#xff0c;和一个表示模式的字符串 pattern&#xff0c;请你返回一个布尔数组 answer 。只有在待查项 queries[i] 与模式串 pattern 匹配时&#xff0c; answer[i] 才为 true&#xff0c;否则为 false。 如果可以将 小写字母 插入模式串 pattern 得…

【IQA技术专题】 无参考自然图像IQA:NIQE

无参考自然图像IQA&#xff1a;NIQE&#xff1a;Making a “Completely Blind” Image Quality Analyzer&#xff08;2012 IEEE&#xff09;专题介绍一、研究背景二、NIQE方法2.1 NSS model2.2 Patch Selection2.3 Characterizing Image Patches2.4 Multivariate Gaussian Mode…

变位齿轮:分度圆、节圆与中心距的 “特殊关联”

接着上回的话题&#xff0c;在标准齿轮中&#xff0c;我们追求的是“节圆与分度圆重合”的理想状态。但当实际工程提出更苛刻的要求时&#xff0c;比如&#xff1a;需要避免齿轮根切&#xff08;齿数过少时&#xff09;。要配凑一个非标准的中心距。需要大幅提高小齿轮的强度和…

Spring Boot集成Kafka常见业务场景最佳实践实战指南

一、基础集成与核心组件解析 &#xff08;一&#xff09;环境搭建与依赖配置 在 Spring Boot 项目中集成 Kafka&#xff0c;首先需通过 Maven 添加核心依赖&#xff1a; <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>…

黑芝麻智能与云深处科技达成战略合作,共推具身智能平台全球市场应用

8月28日&#xff0c;智能汽车计算芯片引领者黑芝麻智能与具身智能创新技术与行业应用引领者云深处科技达成战略合作。双方将围绕具身智能控制平台开发、行业智能解决方案共建与国际市场拓展三大方向展开深度合作&#xff0c;携手推进高性能机器人在多行业场景的规模化落地与应用…

AI零售创业公司:零眸智能

零眸智能公司分析 引言 “这次融资与合作&#xff0c;让我们的全球化节奏更坚实也更有确定性。秉持‘让热爱与科技成就无限可能’&#xff0c;我们坚持真诚合作、长期主义与价值共享&#xff0c;把行业垂直AI能力按里程碑推进并沉淀为可复制的标准。” —— 零眸智能CEO樊凌云①…

学习插入排序+希尔排序并使用java写代码

目录 插入排序 例子时间复杂度java代码 希尔排序&#xff08;缩小增量排序&#xff09; 例子时间复杂度java代码 相关文章 学习数据结构理论算法时间复杂度学习有序二叉树平衡二叉树红黑树学习冒泡排序选择排序并使用java写代码学习插入排序希尔排序并使用java写代码学习堆…

win10虚拟机报错打不开和ubuntu空间不足

ubuntu主机安装的win10虚拟机报错如下&#xff0c;导致虚拟机无法打开解决办法 如上图&#xff0c;找到ubuntu主机home目录中win10的路径&#xff0c;将红色框的文件删除&#xff0c;然后将绿色框中的文件.prev后缀去掉&#xff0c;如下图所示。重新打开虚拟机就可以了 ubuntu空…

指纹手机技术:破解亚马逊多账号运营痛点的底层逻辑与实践

在亚马逊平台运营中&#xff0c;账号关联、行为异常、网络不合规是卖家绕不开的三大核心风险。随着亚马逊反作弊系统&#xff08;如 A9 算法&#xff09;对设备指纹、操作轨迹、网络特征的识别精度持续提升&#xff0c;传统 “普通手机 VPN” 的多账号运营模式已频繁触发风控&…

《UE5_C++多人TPS完整教程》学习笔记46 ——《P47 蹲伏行走(Crouching Walking)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P47 蹲伏行走&#xff08;Crouching Walking&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; S…

TiDB v8.5.3 单机集群部署指南

前言 最近在做 TiDB 的恢复演练&#xff0c;需要在单台 Linux 服务器上部署一套 TiDB 最小的完整拓扑的集群&#xff0c;本文记录一下安装过程。 环境准备 开始部署 TiDB 集群前&#xff0c;准备一台部署主机&#xff0c;确保其软件满足需求&#xff1a; 推荐安装 CentOS 7…

ClickHouse常见问题——ClickHouseKeeper配置listen_host后不生效

ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效 3节点部署ClickHouse集群后&#xff0c;ClickHouse Server执行报错&#xff1a; Poco::Exception. Code: 1000, e.code() 111, Connection refuse…

《Python × MongoDB 实战指南:从连接到查询,构建高效数据操作流程》

《Python MongoDB 实战指南:从连接到查询,构建高效数据操作流程》 一、引言:当 Python 遇上 MongoDB 在当今数据驱动的开发世界里,MongoDB 以其灵活的文档结构、强大的查询能力和良好的扩展性,成为 NoSQL 数据库中的佼佼者。而 Python,作为一门简洁优雅、生态丰富的编…

【Flask + Vue3 前后端分离管理系统】

Flask Vue3 前后端分离管理系统 项目概述 本项目是一个基于 Flask 后端和 Vue3 前端的前后端分离管理系统。项目实现了用户管理、角色管理、菜单管理、权限控制等完整的后台管理功能。 技术栈 后端技术栈&#xff1a; Flask 3.0.0 - Python Web框架Flask-SQLAlchemy 3.1.1 - O…

51c视觉~3D~合集5

自己的原文哦~ https://blog.51cto.com/whaosoft/14165531 #AnimateAnyMesh 文本驱动通用网格动画新范式&#xff0c;实现高效高质量4D内容生成 4D 内容生成&#xff0c;即包含时间维度信息的 3D 内容创建&#xff0c;在 VR/AR、游戏等领域具有广阔的应用前景。…

开悟篇Docker从零到实战一篇文章搞定

目录 一:概述 1:why docker 2:Docker是什么? 3:Docker核心概念 二:初步体验 1:Docker核心架构图 2:准备工作 1:服务器 2:Docker安装 3:阿里云docker安装 4:镜像加速 三:Docker命令和帮助文档的使用 1:帮助文档 2:镜像的基本操作 1:查看本地…

LINUX驱动篇(二)驱动开发

系列文章目录 文章目录系列文章目录总结介绍字符设备驱动工作原理驱动框架加载卸载注册注销设备号详解打开关闭等操作实例分析led驱动编写地址映射LED驱动改进驱动方式总结自动注册注销设备号自动创建设备节点设备树设备树LED驱动实验pinctrl和gpio并发和竞争原子操作自旋锁块设…

【工具】开源大屏设计器 自用整理

【工具】开源大屏设计器 自用整理 GoView低代码数据可视化 GoView 说明文档 | 低代码数据可视化开发平台 JimuReport积木报表(免费报表工具) https://github.com/jeecgboot/JimuReport 「数据可视化&#xff1a;报表、大屏、数据看板」积木报表是一款类Excel操作风格&#xf…

.NetCore MVC

这个是我自己记得笔记&#xff0c;最好有点基础看我的。 html 辅助标签 Html.DropList 分布视图 使用 RenderPartialAsync 呈现分部视图。 此方法不返回 IHtmlContent。 它将呈现的输出直接流式传输到响应。 因为该方法不返回结果&#xff0c;所以必须在 Razor 代码块内调用它…