我正在创建剧本,该剧本将应用于新的Docker群管理器。在运行Playbook之前未配置服务器。
我们已经有一些Swarm管理员。我可以找到所有这些(包括新的):
actual: [{"a":1,"b":"x"},{"a":2,"b":"y"}], expected: '#(^Part)', reason: actual value does not contain expected
现在我可以使用类似的方法来获取- 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
成功的shell输出看起来像这样-只有1行以“ SWMTKN-1”开头:
- 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
但是我在这里发现SWMTKN-1-11xxxyyyzzz-xxxyyyzzz
可能存在的问题:
所以我决定遍历结果直到获得连接令牌。但是我尝试过的许多代码变体无法正常工作。例如,此列表遍历所有列表而不会中断:
swarmmanager_ip
您知道如何遍历列表直到首次成功- 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
输出?
我使用Ansible 2.6.11,可以收到大约2.7的答案。
P.S .:我已经读过How to break `with_lines` cycle in Ansible?,它不适用于现代Ansible版本。