1. 简介
我们在编写playbook的时候,不可避免的要执行一些重复性操作,比如指安装软件包,批量创建用户,操作某个目录下的所有文件等。正如我们所说,ansible一门简单的自动化语言,所以流程控制、循环语句这些编程语言的基本元素它同样都具备。
2. 旧循环语句(版本在2.5之前仅有的)
在Ansible 2.5以前,playbook通过不同的循环语句以实现不同的循环,这些语句使用with_作为前缀。这些语法目前仍然兼容,但在未来的某个时间点,会逐步废弃。
循环语句关键字 描述
with_items 简单的列表循环
with_nested 嵌套循环
with_dict 循环字典
with_fileglob 循环指定目录中的所有文件
with_lines 循环一个文件中的所有行
with_sequence 生成一个自增的整数序列,可以指定起始值和结束值以及步长。参数以key=value的形式指定,format指定输出的格式。数字可以是十进制、十六进制、八进制
with_subelement 遍历子元素
with_together 遍历数据并行集合
3. with_items
4. 自定义with_list循环列表
5. 小练习:在受管主机中创建4个文件
(1) 在没有学会循环之前,我们会这样写
---
- hosts: test70
remote_user: root
gather_facts: no
tasks:
- file:
path: "/opt/a"
state: touch
- file:
path: "/opt/b"
state: touch
- file:
path: "/opt/c"
state: touch
- file:
path: "/opt/d"
state: touch
(2) 在使用循环之后,我们这样写
6. 借助注册函数,多次执行循环中的不同命令
7. for循环实现遍历
---
- hosts: test70
gather_facts: no
tasks:
- shell: "{{item}}"
with_items:
- "ls /opt"
- "ls /home"
register: returnvalue
- debug:
msg:
"{% for i in returnvalue.results %}
{{ i.stdout }}
{% endfor %}"
8. 嵌套列表的定义
(将使用with_items的两种语法结合)
9. with_list关键字
10. with_flattened关键字
11. 上述三种关键字的区别
12. with_together关键字
13. with_cartesian关键字
1.我们可以这样 mkdir -p {a,b,c}/{test1,test2}
2
14. with_indexed_items关键字
14-1 单层列表时
---
- hosts: test70
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "index is : {{ item.0 }} , value is {{ item.1 }}"
with_indexed_items:
- test1
- test2
- test3
执行结果如下:
TASK [debug] **********************************
ok: [test70] => (item=(0, u'test1')) => {
"changed": false,
"item": [
0,
"test1"
],
"msg": [
0,
"test1"
]
}
ok: [test70] => (item=(1, u'test2')) => {
"changed": false,
"item": [
1,
"test2"
],
"msg": [
1,
"test2"
]
}
ok: [test70] => (item=(2, u'test3')) => {
"changed": false,
"item": [
2,
"test3"
],
"msg": [
2,
"test3"
]
}
14-2 两层列表嵌套时
---
- hosts: testA
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "index is : {{ item.0 }} , value is {{ item.1 }}"
with_indexed_items:
- [ test1, test2 ]
- [ test3, test4, test5 ]
- [ test6, test7 ]
执行结果:
14-3 多层列表嵌套时
15. with_sequence关键字
count
---
- hosts: test70
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_sequence: start=2 end=6 stride=2 format="number is %0.2f"
16. with_random_choice关键字
17. with_dict关键字
18. 字典的嵌套
19. with_subelements关键字