Я создаю 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.