循环
循环迭代任务
1.简单循环
loop:
- westosdir1
- westosdir2
- westosdir3
...
迭代变量名称: {{item}}
实例:
在172.25.29.1中创建目录westosdir1、westosdir2、westosdir3
vim loop.yml
---
- name: loop
hosts: 172.25.29.1
tasks:
- name: directory create
file:
name: /mnt/{{item}}
state: directory
loop:
- westosdir1
- westosdir2
- westosdir3
运行结果
2、循环散列或字典列表
实例:将httpd服务重启,并将防火墙关闭
---
- name: loop
hosts: 172.25.29.1
tasks:
- name: service control
service:
name: "{{item.service}}"
state: "{{item.state}}"
loop:
- service: httpd
state: restarted
- service: firewalld
state: stopped
条件控制
when:
- 条件1
- 条件2
条件判断
条件 | 判断 |
---|---|
= | value == ”字符串“,value = 数字 |
< | value < 数字 |
> | value > 数字 |
<= | value <= 数字 |
>= | value >= 数字 |
!= | value !=数字 |
is defined value | value is defined 变量存在 |
is not defined | value is not defined 变量不存在 |
bool变量为true | value value的值为true |
实例1
---
- name: when
hosts: 172.25.29.1
tasks:
- name: echo westos
shell: echo westos
register: echo_westos
ignore_errors: yes
- name: debug
debug:
msg: "{{echo_westos.rc}}"
when: echo_westos.rc ==1
实例2
---
- name: when
hosts: 172.25.29.1
tasks:
- name: debug
debug:
msg: "{{ansible_facts['br0']['ipv4']['address']}}"
when: ansible_facts.br0.ipv4 is defined
触发器
notify和handlers
notify:触发器当遇到更改时触发handlers动作
handlers: 触发器触发后执行的动作
实例
---
- name: handlers
hosts: 172.25.29.1
tasks:
- name: restart firewalld
service:
name: firewalld
state: restarted
notify:
- debug ipv4
handlers:
- name: debug ipv4
debug:
msg: "{{ansible_facts['br0']['ipv4']['address']}} firewalld is restarted"
对照
---
- name: handlers
hosts: 172.25.29.1
tasks:
- name: restart firewalld
service:
name: firewalld
state: started
notify:
- debug ipv4
handlers:
- name: debug ipv4
debug:
msg: "{{ansible_facts['br0']['ipv4']['address']}} firewalld is restarted"
force_handlers
作用:当任务失败后play被终止也会调用触发器进程
实例
---
- name: handlers
hosts: 172.25.29.1
force_handlers: yes
tasks:
- name: restart firewalld
service:
name: firewalld
state: restarted
notify:
- debug ipv4
- name: error
dnf:
name: westos
state: latest
handlers:
- name: debug ipv4
debug:
msg: "{{ansible_facts['br0']['ipv4']['address']}} firewalld is restarted"
changed_when
作用:控制任务在何时报告它已进行更改
实例
- name: change
host: 192.168.43.33
tasks:
- name: start
service:
name: firewalld
start: started
change_when: true
notify:
debug
handlers:
- name: debug
debug:
msg: "{{ansible_facts['ens160']['ipv4']['address']}}"
- name: change
host: 192.168.43.33
tasks:
- name: start
service:
name: firewalld
start: started
change_when: false
notify:
debug
handlers:
- name: debug
debug:
msg: "{{ansible_facts['ens160']['ipv4']['address']}}"
failed_when
作用: 当符合条件时强制任务失败
---
- name: failed
hosts: all
tasks:
- name:
shell: echo westos
register: westos
failed_when: "{{ansible_facts}} is not defined"
---
- name: failed
hosts: all
tasks:
- name:
shell: echo westos
register: westos
failed_when: "{{ansible_facts}} is defined"
block
block: 定义要运行的任务
rescue: 定义block句子中出现失败任务后运行的任务
always:定义最终独立运行的任务
实例
---
- name: block
hosts:
192.168.43.33
192.168.43.40
tasks:
- name: 192.168.43.33
block:
- name dnf ansible
dnf:
name: ansible
state: latest
rescue:
- name: show error
debug:
msg: "{{ansible_facts['ens160']['ipv4']['address']}} is install error"
always:
- shell: echo westos