Do While连接循环



假设我有一个N台服务器的列表

  • 服务器A
  • 服务器B
  • 服务器C

我正试图在循环中对它们发起ping,但只有在它失败的时候。意思是,如果A没有响应,请尝试B,如果没有响应,则转到C等。

---
- hosts: localhost  
vars:  
temp:  
- serverA
- serverB
- serverC
tasks:
- name: Include loop
include_tasks: pingLoop.yml
with_items: "{{ temp }}"
loop_control:
loop_var: inner_var
until: ping.ping == "pong"

pingLoop.yml

- name: Check connection
win_ping:
register: ping
delegate_to: "{{ inner_var }}"
- name: Debug
debug: var=ping

它不起作用,因为显然直到它不起include_tasks的作用,我不知道该怎么做。

让我们翻译一下用例:"在操作手册中,继续连接第一台主机">

使用wait_for_connection而不是ping。它更实用,例如

shell> cat hosts
serverA ansible_host=test_99 ansible_user=admin
serverB ansible_host=test_98 ansible_user=admin
serverC ansible_host=test_11 ansible_user=admin
shell> cat playbook.yml
- hosts: all
gather_facts: false
tasks:
- block:
- wait_for_connection:
timeout: 5
- set_fact:
connected: true
rescue:
- set_fact:
connected: false
- set_fact:
srv_conn: "{{ dict(ansible_play_hosts_all|zip(_conn)) }}"
vars:
_conn: "{{ ansible_play_hosts_all|
map('extract', hostvars, 'connected')|
list }}"
run_once: true

给出

srv_conn:
serverA: false
serverB: false
serverC: true

接下来,在同一个剧本中,使用此字典并将第一个连接的主机添加到新组活动中。然后,与该组开始新的游戏,例如

- set_fact:
srv_active: "{{ (srv_conn|dict2items|selectattr('value')|first).key }}"
run_once: true
- add_host:
name: "{{ srv_active }}"
groups: active
run_once: true
- hosts: active
gather_facts: false
tasks:
- debug:
msg: Active host is {{ inventory_hostname }}

给出

ok: [serverC] =>
msg: Active host is serverC

Q:">从服务器组建一个团队是最好的方式吗">

A: 下一个选项可能是在控制器上继续,例如

- set_fact:
srv_active: "{{ (srv_conn|dict2items|selectattr('value')|first).key }}"
run_once: true
delegate_to: localhost
delegate_facts: true
- hosts: localhost
tasks:
- debug:
msg: Active host is {{ srv_active }}

给出

ok: [localhost] => 
msg: Active host is serverC

最新更新