Ansible команда l oop с синхронизированным массивом - PullRequest
0 голосов
/ 12 февраля 2020

Мне нужно перебрать 2 синхронизированных массива для запуска bash команд

list1: ab c

list2: 1 2 3

Я хочу получить

a1 b2 c3

, а не

a1 a2 a3 b1 b2 b2 c1 c2 c3

Я пытаюсь использовать "with_togheter", но безуспешно

this это моя задача

- name: create volume
  shell: docker volume create {{ item.0 }} {{ item.1 }}
  when: volume_exists|failed
  run_once: true
  with_togheter:
    - "{{ volumename }}"
    - "{{ volumeopts }}"
  tags:
    - dockervolumenested

это инвентарь

[pgwatch-master]
host.domain

[pgwatch-master:vars]
volumename=["pgw-master-grafana","pgw-master-influxdb","pgw-master-persistent-config","pgw-master-postgresql"]
volumeopts=["--opt o=size=10m --opt device=local --opt type=local","--opt o=size=15000m --opt device=local --opt type=local","--opt o=size=1m --opt device=local --opt type=local","--opt o=size=200m --opt device=local --opt type=local"]

это ошибка:

FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'item' is undefined\n\nThe error appears to have been in '/home/rgi/ansible/roles/promotedocker/tasks/main.yml': line 267, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: create volume\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'item' is undefined"}

Как это сделать?

спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

Это простая демонстрация фильтра zip , которая исправит вашу проблему. Я использовал 3 списка ввода, чтобы показать, что он может работать более чем с двумя (а также потому, что ваш пример «ab c, 123» посадил песню в моем мозгу до конца дня…)

Примечание: после вашего комментария вы можете получить точно такой же результат, как показано ниже в ansible 2.4, заменив loop на with_list

демонстрационную пьесу

---
- hosts: localhost
  gather_facts: false

  vars:
    list1: [a, b, c]
    list2: [1, 2, 3]
    list3: [do, re, mi]

  tasks:
    - name: Love receipe
      debug:
        msg: "{{ item.0 }}, it's easy as {{ item.1 }}, as simple as {{ item.2 }}" 
      loop: "{{ list1 | zip(list2, list3) | list }}"

И результат:

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

TASK [Love receipe] ************************************************************************************************************************************************************
ok: [localhost] => (item=['a', 1, 'do']) => {
    "msg": "a, it's easy as 1, as simple as do"
}
ok: [localhost] => (item=['b', 2, 're']) => {
    "msg": "b, it's easy as 2, as simple as re"
}
ok: [localhost] => (item=['c', 3, 'mi']) => {
    "msg": "c, it's easy as 3, as simple as mi"
}

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