实施任务控制
1.编写循环和条件任务
1.1 利用循环迭代任务
通过利用循环,我们无需编写多个使用同一模块的任务。
Ansible支持使用loop关键字对一组项目迭代任务。可以配置循环以利用列表中的各个项目、列表中各个文件的内容、生成的数字序列或更为复杂的结构来重复任务。
1.2 简单循环
简单循环对一组项目迭代任务。loop关键字添加到任务中,将应对其迭代任务的项目列表取为值。循环变量item保存每个迭代过程中使用的值。
playbook中使用循环:
---
- name: loop
hosts: all
gather_facts: no
tasks:
- name: 启动服务
service:
name: "{{ item }}"
state: started
loop:
- httpd
- mariadb
使用变量方式编写:
---
- name: 构建lamp
hosts: 192.168.237.168
gather_facts: no
vars_files: //指定变量文件位置
- /etc/ansible/playbook/vars/service_vars.yml
tasks:
- name: "{{ install_service }}" //引用变量
yum:
name: "{{ item }}" //循环
state: present
loop: "{{ install_service }}"
- name: "{{ start_service }}"
service:
name: "{{ item }}" //循环
state: started
enabled: yes
loop: "{{ start_service }}"
1.3 循环散列或字典列表
loop列表不需要是简单值列表。在以下示例中,列表中的每个项实际上是散列或字典。示例中的每个散列或字典具有两个键,即name和groups,当前item循环变量中每个键的值可以分别通过item.name和item.groups变量来检索。
---
- name: loop
hosts: all
gather_facts: no
tasks:
- name: create user
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
loop:
- name: akl
group: za
- name: weien
group: cx
[root@localhost ansible]# ansible-playbook playbook/loop.yml
PLAY [loop] *********************************************************************************************
TASK [create user] **************************************************************************************
changed: [localhost] => (item={'name': 'akl', 'groups': 'za'})
changed: [localhost] => (item={'name': 'weien', 'groups': 'cx'})
PLAY RECAP **********************************************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.4 较早样式的循环关键字
在Ansible2.5之前,大多数playbook使用不同的循环语法。提供了多个循环关键字,前缀为whth_,后面跟Ansible查找插件的名称。
较早样式的Ansible循环
循环关键字 | 描述 |
---|---|
with_items | 行为与简单列表的loop关键字相同,例如字符串列表或散列/字典列表。 但与loop不同的是,如果为with_items提供了列表的列表,它们将被扁平化为单级列表。循环变量item保存每次迭代过程中使用的列表项。 |
with_file | 此关键字需要控制节点文件名列表。循环变量item在每次迭代过程中保存文件列表中相应文件的内容。 |
with_sequence | 此关键字不需要列表,而是需要参数来根据数字序列生成值列表。 循环变量item在每次迭代过程中保存生成的序列中的一个生成项的值。 |
示例:
vars:
data:
- user0
- user1
- user2
tasks:
- name: "with_items"
debug:
msg: "{{ item }}"
with_items: "{{ data }}"
1.5 将Register变量与Loop一起使用
register关键字也可以捕获循环任务的输出。以下代码片段显示了循环任务中register变量的结构:
---
- name: Loop Register Test
gather_facts: no
hosts: all
tasks:
- name: Looping Echo Task
shell: "echo This is my item: {{ item }}"
loop:
- one
- two
register: echo_results # 注册echo_results变量
- name: Show echo_results variable //显示变量echo_results
debug:
var: echo_results # echo_results变量的内容显示在屏幕上
[root@localhost ansible]# ansible-playbook loop.yml
PLAY [Loop Register Test] *******************************************************************************
TASK [Looping Echo Task] ********************************************************************************
changed: [localhost] => (item=one)
changed: [localhost] => (item=two)
......
}
},
"item": "one",
"rc": 0,
"start": "2021-07-27 08:40:00.624946",
"stderr": "",
"stderr_lines": [],
"stdout": "This is my item: one",
"stdout_lines": [
"This is my item: one"
......
"item": "two",
"rc": 0,
"start": "2021-07-27 08:40:00.946702",
"stderr": "",
"stderr_lines": [],
"stdout": "This is my item: two",
"stdout_lines": [
"This is my item: two"
]
}
]
}
}
PLAY RECAP **********************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0