Ansible:如何在第一次成功shell输出之前遍历ip地址?

时间:2018-12-25 16:28:23

标签: amazon-ec2 ansible docker-swarm

我正在创建剧本,该剧本将应用于新的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 可能存在的问题:

  • 它可以是尚未配置的新实例,
  • 它可能是实例不起作用的Swarm管理器。

所以我决定遍历结果直到获得连接令牌。但是我尝试过的许多代码变体无法正常工作。例如,此列表遍历所有列表而不会中断:

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版本。

0 个答案:

没有答案