康斯坦丁给出了一个很好的答案。这是它的另一种风味。
我通常将列表定义为变量,并在同一变量上编写两个单独的循环:
┌─[jamesph@geror] - [~/temp] - [Sat Jan 13, 10:06]
└─[$]> cat loops-1.yml
- hosts: localhost
gather_facts: no
vars:
menu:
- Egg and Spam
- Spam, bacon, sausage and Spam
- Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam
tasks:
- debug:
msg: "We have {{ item }}"
with_items: "{{ menu }}"
- debug:
msg: "I love {{ item }}!"
with_items: "{{ menu }}"
┌─[jamesph@geror] - [~/temp] - [Sat Jan 13, 10:06]
└─[$]> ansible-playbook loops-1.yml
[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: all
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [localhost] **********************************************************************************************************************
TASK [debug] **************************************************************************************************************************
ok: [localhost] => (item=Egg and Spam) => {
"changed": false,
"item": "Egg and Spam",
"msg": "We have Egg and Spam"
}
ok: [localhost] => (item=Spam, bacon, sausage and Spam) => {
"changed": false,
"item": "Spam, bacon, sausage and Spam",
"msg": "We have Spam, bacon, sausage and Spam"
}
ok: [localhost] => (item=Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam) => {
"changed": false,
"item": "Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam",
"msg": "We have Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam"
}
TASK [debug] **************************************************************************************************************************
ok: [localhost] => (item=Egg and Spam) => {
"changed": false,
"item": "Egg and Spam",
"msg": "I love Egg and Spam!"
}
ok: [localhost] => (item=Spam, bacon, sausage and Spam) => {
"changed": false,
"item": "Spam, bacon, sausage and Spam",
"msg": "I love Spam, bacon, sausage and Spam!"
}
ok: [localhost] => (item=Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam) => {
"changed": false,
"item": "Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam",
"msg": "I love Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam!"
}
PLAY RECAP ****************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
这可以很好地与变量优先级配合使用,例如通过为每个环境定义不同的服务器集。当您需要在两个循环之间执行各种其他非循环任务时,它也可以工作。
loop
上的东西block
。这似乎是有要求的,但通过Ansible GH问题13262拒绝了。:-(