ansible playbook 循环
with_items
---
- hosts: testservers
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items:
- 1
- 2
- 3
- debug:
msg: "{{item}}"
with_items: [ 1, 2, 3 ]
- debug:
msg: "{{item}}"
with_items: # with_items 将嵌套在大列表中的每个小列表都 `展开`,与 with_flattened 效果相同
- [ 1, 2, 3 ]
- [ a, b ]
- debug:
msg: "{{item}}"
with_list: # with_list 不展开嵌套的小列表
- [ 1, 2, 3 ]
- [ a, b ]
- debug:
msg: "{{item}}"
with_together: # with_together 将两个列表中的元素 `对齐合并` [1,a], [2, b], [3, null]
- [ 1, 2, 3 ]
- [ a, b ]
with_cartesian
- 将每个小列表中的元素按照
笛卡尔的方式
组合后,循环的处理每个组合
- file:
state: directory
path: "/tmp/{{item.0}}/{{item.1}}"
with_cartesian:
- [ a, b, c ]
- [ test1, test2 ]
效果同
mkdir -p /testdir/{a,b,c}/{test1,test2}
with_nested
功能同 with_cartesian
with_indexed_items
with_indexed_items
在循环处理列表时为列表中的每一项添加 数字索引
,从0开始
with_indexed_items
会将嵌套的两层列表 展开
,并按照顺序为每一项编号
- debug:
msg: "idnex is :{{item.0}},value is {{item.1}}"
with_indexed_items:
- test1
- [test2, test3]
ok: [h-1] => (item=[0, 'test1']) => {
"msg": "idnex is :0,value is test1"
}
ok: [h-1] => (item=[1, 'test2']) => {
"msg": "idnex is :1,value is test2"
}
ok: [h-1] => (item=[2, 'test3']) => {
"msg": "idnex is :2,value is test3"
}
with_sequence
with_sequence
按照顺序生成数字序列
- “start=1 end=5 stride=1”,从1开始,到5结束(包括),步长为1,即从1到5每次增加1
format
参数支持格式化输出,如 format="number is %0.2f"
tasks:
- debug:
msg: "{{item}}"
with_sequence: start=1 end=5 stride=1
# with_sequence: # 以下两个和上面通效果
# start=1
# end=5
# stride=1
# with_sequence: count=5
with_random_choice
with_random_choice
从列表的多个值中随机返回一个值
- debug:
msg: "{{item}}"
with_random_choice:
- 1
- 2
- 3
- 4
- 5
with_dict
with_dict
操作字典
- 键值对中:
键
被放入 key
关键字中,值
被放入 value
关键字中
value
支持嵌套,通过 item.<value>.<key>
获取值
---
- hosts: testservers
remote_user: root
gather_facts: no
vars:
users:
alice: female
bob: male
tasks:
- debug:
msg: "User name: {{item.key}}, User grnder: {{item.value}}"
with_dict: "{{users}}"
输出
ok: [h-1] => (item={'key': 'alice', 'value': 'female'}) => {
"msg": "User name: alice, User grnder: female"
}
ok: [h-1] => (item={'key': 'bob', 'value': 'male'}) => {
"msg": "User name: bob, User grnder: male"
}
with_subelements
with_subelements
---
- hosts: testservers
remote_user: root
gather_facts: no
vars:
users:
- name: bob
gender: male
hobby:
- Skateboard
- VideoGame
- name: alice
gender: female
hobby:
- Music
tasks:
- debug:
msg: "{{ item.0.name }} 's hobby is {{item.1}}"
with_subelements:
- "{{users}}"
- hobby
输出
ok: [h-1] => (item=[{'name': 'bob', 'gender': 'male'}, 'Skateboard']) => {
"msg": "bob 's hobby is Skateboard"
}
ok: [h-1] => (item=[{'name': 'bob', 'gender': 'male'}, 'VideoGame']) => {
"msg": "bob 's hobby is VideoGame"
}
ok: [h-1] => (item=[{'name': 'alice', 'gender': 'female'}, 'Music']) => {
"msg": "alice 's hobby is Music"
}
with_file
with_file
循环获取文件的内容,即 {{item}}
为文件的内容
tasks:
- debug:
msg: "{{item}}"
with_file:
- /testdir/testdir/a.log
- /etc/hosts
with_fileglob
with_fileglob
获取指定目录中匹配符合模式的文件名
tasks:
- debug:
msg: "{{item}}"
with_fileglob:
- /testdir/*
- /etc/test*.???