Циклы внутри инвентарных файлов? - PullRequest
0 голосов
/ 24 января 2019

Можно ли использовать петли в файлах инвентаризации?Например, в одном файле 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 голосов
/ 25 января 2019

вот 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   
0 голосов
/ 24 января 2019

Это можно сделать, но применение логина внутри ANSIBLE кода будет грязным, поэтому лучшая идея - вызвать любой скрипт Bash или Python в ANSIBLE и передать эти два списка в качестве аргумента этому скрипту и вернуть ожидаемый массив изСценарий в конце и сохранить это значение в факт, используя set_fact

Пример:

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