清单文件内部有循环吗?

时间:2019-01-24 11:46:43

标签: ansible yaml

是否可以在清单文件中使用循环?例如,在一个inv文件中,我得到了:

---
ISPs: 
- name: ISP1
- name: ISP2
networks:
- name: network1
- name: network2
- name: network3

然后我要在相同的清单中创建类似的内容:

from ISP1 to network1 permit
from ISP1 to network2 permit
from ISP1 to network3 permit
from ISP2 to network1 permit
from ISP2 to network2 permit
from ISP2 to network3 permit

但是我认为使用循环可以更快地完成操作,而不是复制粘贴并写下所有可能的组合。可能吗

示例:

from {{ item[0] }} to {{ item[1] }} permit
with_nested:
- [ 'ISP1', 'ISP2' ]
- [ 'network1', 'network2', 'network3' ]

将创建如下内容:

from ISP1 to network1 permit
from ISP1 to network2 permit
from ISP1 to network3 permit
from ISP2 to network1 permit
from ISP2 to network2 permit
from ISP2 to network3 permit

谢谢您的回答!

2 个答案:

答案 0 :(得分:1)

这是2个变体, 参见https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-nested-with-cartesian

---
- hosts: localhost
  connection: local
  gather_facts: false
  vars:
    ISPs:
      - name: ISP1
      - name: ISP2
    networks:
      - name: network1
      - name: network2
      - name: network3

tasks:

  - name:  Using with_nested
    debug:
      msg: '{{ item.0.name }} - {{item.1.name }} '
    with_nested:
      - '{{ ISPs }}'
      - '{{ networks }}'

  - name: Using loop
    debug:
      msg: '{{ item.0.name }} - {{item.1.name }} '
    loop: "{{ ISPs | product(networks) | list }}"

输出:

PLAY [localhost] *******************************************************************************************************************************************************************************************

TASK [Using with_nested] ***********************************************************************************************************************************************************************************
ok: [localhost] => (item=[{u'name': u'ISP1'}, {u'name': u'network1'}]) => {
    "msg": "ISP1 - network1 "
}
ok: [localhost] => (item=[{u'name': u'ISP1'}, {u'name': u'network2'}]) => {
    "msg": "ISP1 - network2 "
}
ok: [localhost] => (item=[{u'name': u'ISP1'}, {u'name': u'network3'}]) => {
    "msg": "ISP1 - network3 "
}
ok: [localhost] => (item=[{u'name': u'ISP2'}, {u'name': u'network1'}]) => {
    "msg": "ISP2 - network1 "
}
ok: [localhost] => (item=[{u'name': u'ISP2'}, {u'name': u'network2'}]) => {
    "msg": "ISP2 - network2 "
}
ok: [localhost] => (item=[{u'name': u'ISP2'}, {u'name': u'network3'}]) => {
    "msg": "ISP2 - network3 "
}

TASK [Using loop] ******************************************************************************************************************************************************************************************
ok: [localhost] => (item=[{u'name': u'ISP1'}, {u'name': u'network1'}]) => {
    "msg": "ISP1 - network1 "
}
ok: [localhost] => (item=[{u'name': u'ISP1'}, {u'name': u'network2'}]) => {
    "msg": "ISP1 - network2 "
}
ok: [localhost] => (item=[{u'name': u'ISP1'}, {u'name': u'network3'}]) => {
    "msg": "ISP1 - network3 "
}
ok: [localhost] => (item=[{u'name': u'ISP2'}, {u'name': u'network1'}]) => {
    "msg": "ISP2 - network1 "
}
ok: [localhost] => (item=[{u'name': u'ISP2'}, {u'name': u'network2'}]) => {
    "msg": "ISP2 - network2 "
}
ok: [localhost] => (item=[{u'name': u'ISP2'}, {u'name': u'network3'}]) => {
    "msg": "ISP2 - network3 "
}

PLAY RECAP *************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

答案 1 :(得分:-1)

这是可行的,但是在ansible代码中应用登录会很麻烦,因此更好的主意是在ansible中调用任何bash或python脚本,并将这两个列表作为该脚本的参数传递,并从脚本结尾,并使用set_fact

将此值存储到事实中

示例:

tasks:
- set_fact: isp_networks="{{ lookup('pipe','python script.py ' + {{ISPs}}  + ' ' + {{networks}}) }}"
- debug: var={{isp_networks}}