Назад | Перейти на главную страницу

Двойной цикл в Ansible, как с этим бороться?

У меня такая конструкция:

- name: Run validation query on db localy
  shell: >
    docker exec postgres.1.$(docker service ps -f "name=postgres.1" postgres -q) bash -c 'psql -v --username "{{ pg_connection_speruser }}" --dbname "{{ pg_db }}" -c "select 1"'
  register: validation_query
  delegate_to: "{{ item }}"
  with_items: "{{ groups.postgres_server }}"
  until: validation_query.stderr == ''
  retries: 6
  delay: 10
  ignore_errors: false
  changed_when: false

Что мне нужно сделать:

- name: Run validation query on db localy
  shell: >
    docker exec postgres.{{ item }}.$(docker service ps -f "name=postgres.{{ item }}" postgres -q) bash -c 'psql -v --username "{{ pg_connection_speruser }}" --dbname "{{ pg_db }}" -c "select 1"'
  register: validation_query
  with_sequence: start=1 end="{{ pg_docker_service_replicas }}"
  delegate_to: "{{ item }}"
  with_items: "{{ groups.postgres_server }}"
  until: validation_query.stderr == ''
  retries: 6
  delay: 10
  ignore_errors: false
  changed_when: false

Но, конечно, есть проблема с двойным циклом with_sequence и with_items.

А можно по-другому? Спасибо

Вы можете сделать это с помощью with_nested и lookup:

---
- hosts: localhost
  gather_facts: no
  vars:
    max_num: 3
    delegates:
      - host1
      - host2
  tasks:
    - debug:
        msg: "delegate={{ item[0] }} seq={{ item [1] }}"
      with_nested:
        - "{{ delegates }}"
        - "{{ lookup('sequence','start=1 end='+max_num|string,wantlist=True) }}"

Это сгенерирует вложенный цикл: внешний - по каждому элементу в delegates список (доступен через item[0]), внутренний - над последовательностью 1-max_num.