1、ansible中的循环
[root@foundation50 .ansible]# vim westos.yml
1 ---
2 - name: create user
3 hosts: 172.25.254.100
4 tasks:
5 - name: create user
6 user:
7 name: "{{item}}" item迭代变量名称,表示取loop里面user1,user2,user3某一个,loop里面有几个直,他就取几次
8 state: present
9 loop: loop表示赋值表, oop会取user1,user2,user3三个直
10 - user1
11 - user2
12 - user3
[root@foundation50 .ansible]# ansible-playbook westos.yml
PLAY [create user] ***********************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [172.25.254.100]
TASK [create user] ***********************************************************************************************
changed: [172.25.254.100] => (item=user1) 依次循环成功
changed: [172.25.254.100] => (item=user2)
changed: [172.25.254.100] => (item=user3)
[root@node1 ~]# id user1
uid=6671(user1) gid=6671(user1) groups=6671(user1) 用户建立成功
[root@node1 ~]# id user2
uid=6672(user2) gid=6672(user2) groups=6672(user2) 用户建立成功
[root@node1 ~]# id user3
uid=6673(user3) gid=6673(user3) groups=6673(user3) 用户建立成功
[root@foundation50 .ansible]# vim westos.yml
1 ---
2 - name: create user
3 hosts: 172.25.254.100
4 tasks:
5 - name: create user
6 user:
7 name: "{{item}}"
8 state: absent 删除用户
9 loop:
10 - user1
11 - user2
12 - user3
[root@foundation50 .ansible]# ansible-playbook westos.yml
循环散列或字典列表
[root@foundation50 .ansible]# vim westos.yml 多个元素的迭代循环
---
- name: create user
hosts: 172.25.254.100
tasks:
- name: create user
user:
name: "{{item['name']}}"
uid: "{{item['uid']}}"
state: present
loop:
- name: user1 字典列表,两个元素
uid: 2000
- name: user2
uid: 3000
- name: user3
uid: 4000
[root@foundation50 .ansible]# ansible-playbook westos.yml
[root@node1 ~]# id user1
uid=2000(user1) gid=6671(user1) groups=6671(user1)
[root@node1 ~]# id user2
uid=3000(user2) gid=3000(user2) groups=3000(user2)
[root@node1 ~]# id user3
uid=4000(user3) gid=4000(user3) groups=4000(user3)
2、ansible中的条件判断
[root@foundation50 .ansible]# vim westos.yml
---
- name: test
hosts: 172.25.254.100
tasks:
- name: ping
shell:
ping -c1 -w1 172.25.254.300
ignore_errors: yes 表示如果报错,可以跳过继续执行,不会中断
register: WESTOS 组册变量
- debug:
msg: host is up
when: WESTOS.rc == 0 当rc等于0,msg就不会执行
[root@foundation50 .ansible]# ansible-playbook westos.yml
PLAY [test] ******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [172.25.254.100]
TASK [ping] ******************************************************************************************************
fatal: [172.25.254.100]: FAILED! => {"changed": true, "cmd": "ping -c1 -w1 172.25.254.300", "delta": "0:00:00.006348", "end": "2021-11-25 22:25:20.049234", "msg": "non-zero return code", "rc": 2, "start": "2021-11-25 22:25:20.042886", "stderr": "ping: 172.25.254.300: Name or service not known", "stderr_lines": ["ping: 172.25.254.300: Name or service not known"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [debug] *****************************************************************************************************
skipping: [172.25.254.100] ping不同msg就不执行了
PLAY RECAP *******************************************************************************************************
172.25.254.100 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0
[root@foundation50 .ansible]# vim westos.yml
---
- name: test
hosts: 172.25.254.100
tasks:
- name: ping
shell:
ping -c1 -w1 172.25.254.300
ignore_errors: yes 表示如果报错,可以跳过继续执行,不会中断
register: WESTOS 组册变量
- debug:
msg: host is up
when: WESTOS.rc == 0 当rc等于0,msg就不会执行
- debug:
msg: host is down
when: WESTOS.rc != 0 当rc不等于0,msg就会执行
[root@foundation50 .ansible]# ansible-playbook westos.yml
PLAY [test] ******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [172.25.254.100]
TASK [ping] ******************************************************************************************************
fatal: [172.25.254.100]: FAILED! => {"changed": true, "cmd": "ping -c1 -w1 172.25.254.300", "delta": "0:00:00.006149", "end": "2021-11-25 22:30:55.945330", "msg": "non-zero return code", "rc": 2, "start": "2021-11-25 22:30:55.939181", "stderr": "ping: 172.25.254.300: Name or service not known", "stderr_lines": ["ping: 172.25.254.300: Name or service not known"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [debug] *****************************************************************************************************
skipping: [172.25.254.100]
TASK [debug] *****************************************************************************************************
ok: [172.25.254.100] => {
"msg": "host is down" msg会执行
}
PLAY RECAP *******************************************************************************************************
172.25.254.100 : ok=3 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=1
[root@foundation50 .ansible]# vim westos.yml
---
- name: test
hosts: 172.25.254.100
tasks:
- debug:
msg: vdb is exist
when: ansible_facts['devices']['vdb'] is defined vba被定义,变量存在,则取vdb is exist
- debug:
msg: vdb is not exit
when: ansible_facts['devices']['vdb'] is not defined vdb没有被定义,变量不存在,则取vdb is not exit
[root@foundation50 .ansible]# ansible-playbook westos.yml
PLAY [test] *******************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************
ok: [172.25.254.100]
TASK [debug] ******************************************************************************************************************
skipping: [172.25.254.100]
TASK [debug] ******************************************************************************************************************
ok: [172.25.254.100] => {
"msg": "vdb is not exit" vdb不存在则取vdb is not exit
}
PLAY RECAP ********************************************************************************************************************
172.25.254.100 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
root@foundation50 .ansible]# vim westos.yml
1 ---
2 - name: test
3 hosts: westos
4 tasks:
5 - debug:
6 msg: vdb is exist
7 when:
8 - ansible_facts['devices']['vda'] is defined
9 - inventory_hostname is in "172.25.254.100" 表示受控主机指定为172.25.254.100, in表示变量为的意思
10 - debug:
11 msg: vdb is not exit
12 when:
13 - ansible_facts['devices']['vda'] is not defined 表示是否存在vda设备并且指定受控主机为100,执行msg操作
14 - inventory_hostname is in "172.25.254.100"
[root@foundation50 .ansible]# ansible-playbook westos.yml 运行
PLAY [test] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.25.254.200]
ok: [172.25.254.100]
TASK [debug] *******************************************************************
ok: [172.25.254.100] => {
"msg": "vdb is exist"
}
skipping: [172.25.254.200] 200没有指定,不执行
3、anisble中任务失败处理
changed_when : true 表示控制任务无论改没改,触发器都会被触发,执行后显示黄色
fiaild_when " ‘hello’ in TEST.stdout "当符合任务条件时无论执行成功或不成功都会报错
示例:
[root@foundation50 .ansible]# cat westos1.yml
---
- name: test
hosts: westos
tasks:
- name: check vg
debug:
msg: vg westos is not exist
when: ansible_facts['lvm']['vgs']['westos'] is not defined
- name: create lv
lvol:
vg: westos
lv: exam_lvm
size: 1500m
when: ansible_facts['lvm']['vgs']['westos'] is defined
ignore_errors: yes
register: LAG_LVM
- name: create 800 lv
lvol:
vg: westos
lv: exam_lvm
size: 800m
when:
- ansible_facts['lvm']['vgs']['westos'] is defined
- LAG_LVM.rc != 0
ignore_errors: yes
register: SMALL_LVM
[root@foundation50 .ansible]# cat westos1.yml
---
- name: test
hosts: westos
tasks:
- name: create lvm
block: 如果block不能执行
- name: create 1500 lv
lvol:
vg: westos
lv: exam_lvm
size: 1500m
when: ansible_facts['lvm']['vgs']['westos'] is defined
rescue: 就执行rescue
- name: create 800 lv
lvol:
vg: westos
lv: exam_lvm
size: 800m
when: ansible_facts['lvm']['vgs']['westos'] is defined
always: 如果block和rescue不管那个不能执行,always都会执行
- debug:
msg: vg westos is not exist
when: ansible_facts['lvm']['vgs']['westos'] is not defined
[root@foundation50 .ansible]# ansible-playbook westos1.yml