Ansible с циклом itertools - PullRequest
       65

Ansible с циклом itertools

1 голос
/ 04 августа 2020

как я могу получить такие же результаты в ansible с l oop?

Я хочу использовать

   - debug:
       msg: "{{ item.0 }} {{ item.1 }}"
     loop: "{{ gs_hostname | product(wl_hostname) | list }}"

Но я получаю:

ok: [localhost] => {"msg": {"gs-01": "wl-01", "gs-02": "wl-02", "gs-03": null, "gs-04" ": null}}

Что я ожидал:

from itertools import cycle

gs_hostname = ["gs01", "gs02", "gs03", "gs04"]
wl_hostname = ["wl01", "wl02"]

for a,b in zip(gs_hostname, cycle(wl_hostname)):
    print (a,b)

результат:

gs01 wl01 gs02 wl02 gs03 wl01 gs04 wl02

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Я нашел другое решение:

- hosts: localhost
  connection: local
  gather_facts: False
  vars:
      gs_hostname: [gs-01, gs-02, gs-03, gs-04, gs-05, gs-06, gs-07]
      wl_hostname: [wl-01, wl-02, wl-03]
  tasks:
    - debug:
         msg: "{% set wl_list = wl_hostname %}
               {% set row_class = cycler(* wl_list) %}
               {% for gs in gs_hostname %}{{ gs }} - {{ row_class.next() }}{% endfor %}"

Подробнее здесь .

1 голос
/ 04 августа 2020

Похоже, что в Ansible нет ничего «родного» для достижения этой цели.

При этом вы можете использовать немного вычислений и по модулю в сочетании с l oop index_var, чтобы достичь этого.

Учитывая сценарий:

- hosts: all
  gather_facts: no  
        
  tasks:
    - debug:
        msg: "{{ item }} {{ wl_hostname[idx % wl_hostname | length] }}"
      loop: "{{ gs_hostname }}"
      loop_control:
        index_var: idx
      vars:
        gs_hostname: 
          - gs01
          - gs02
          - gs03
          - gs04
        wl_hostname: 
          - wl01
          - wl02

Это дает как результат:

PLAY [all] ********************************************************************************************************

TASK [debug] ******************************************************************************************************
ok: [localhost] => (item=gs01) => {
    "msg": "gs01 wl01"
}
ok: [localhost] => (item=gs02) => {
    "msg": "gs02 wl02"
}
ok: [localhost] => (item=gs03) => {
    "msg": "gs03 wl01"
}
ok: [localhost] => (item=gs04) => {
    "msg": "gs04 wl02"
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
...