Ansible: как зациклить IP-адреса до первого успешного вывода оболочки? - PullRequest
0 голосов
/ 25 декабря 2018

Я создаю Playbook, который будет применяться к новым менеджерам Docker Swarm.Сервер (ы) настроен / не настроен до запуска playbook.

У нас уже есть несколько менеджеров Swarm.Я могу найти их все (включая новый) с помощью:

- name: 'Search for SwarmManager server IPs'
  ec2_instance_facts:
    region: "{{ ec2_region }}"
    filters:
      vpc-id: "{{ ec2_vpc_id }}"
      "tag:aws:cloudformation:logical-id": "AutoScalingGroupSwarmManager"
  register: swarmmanager_instance_facts_result

Теперь я могу использовать что-то вроде этого, чтобы получить join-token:

- set_fact:
    swarmmanager_ip: "{{ swarmmanager_instance_facts_result.instances[0].private_ip_address }}"

- name: 'Get the docker swarm join-token'
  shell: docker swarm join-token -q manager
  changed_when: False
  register: docker_swarm_token_result
  delegate_to: "{{ swarmmanager_ip }}"
  run_once: true

Вывод оболочки успеха выглядит следующим образом- только 1 строка началась с "SWMTKN-1":

SWMTKN-1-11xxxyyyzzz-xxxyyyzzz

Но я вижу некоторые возможные проблемы здесь с swarmmanager_ip:

  • это может быть новый экземпляр, который все еще не настроен,
  • это может быть экземпляр с неработающим менеджером Swarm.

Поэтому я решил перебрать результаты , пока не получу токен соединения .Но многие варианты кода, которые я пробовал, не работают.Например, этот работает по всему списку без перерыва:

- name: 'Get the docker swarm join-token'
  shell: docker swarm join-token -q manager
  changed_when: False
  register: docker_swarm_token_result
  delegate_to: "{{ item.private_ip_address }}"
  loop: "{{ swarmmanager_instance_facts_result.instances }}"
  # ignore_errors: true
  # until: docker_swarm_token_result.stdout_lines|length == 1
  when: docker_swarm_token_result is not defined or docker_swarm_token_result.stdout_lines is not defined or docker_swarm_token_result.stdout_lines|length == 1
  run_once: true
  check_mode: false

Вы знаете, как перебирать список до первого успеха shell вывод?

Я использую Ansible 2.6.11,можно получить ответ о 2.7.

PS: я уже прочитал Как разбить цикл with_lines в Ansible? , он не работает для современных версий Ansible.

...