以下是我的播放列表。我的疑问是,如何使用从{{ hostvars['localhost']['srv'] }}
和{{ hostvars['localhost']['srv1'] }
获得的IP
有条件的主机。
我希望使用类似的方法,如果到服务器的telnet成功,则在下一个主机中,它应该使用{{ hostvars['localhost']['srv'] }}
;如果server1的telnet失败,则主机应获得{{ hostvars['localhost']['srv1'] }
,依此类推。
我尝试在主机中使用OR,但无法正常工作。
有什么办法可以使它正常工作吗?
- hosts: localhost
tasks:
- name: Telnet to server1
shell: 'telnet 10.2.0.150 8080'
register: pass
ignore_errors: yes
- set_fact:
ip={{pass.cmd| regex_findall('[0-9./]+') | list}}
register: ip_result
- set_fact:
srv={{ip_result.ansible_facts.ip[0]}}
register: srv
- debug: msg={{srv}}
- name: Telnet to server2
shell: "telnet 10.2.0.187 8080"
register: pass1
ignore_errors: yes
when: "'Connection refused' in pass.stderr or 'Connection timed out' in pass.stderr"
- set_fact:
ip1={{pass1.cmd| regex_findall('[0-9./]+') | list}}
register: ip1_result
when: "'Connection refused' in pass.stderr or 'Connection timed out' in pass.stderr"
- set_fact:
srv1={{ip1_result.ansible_facts.ip[0]}}
register: srv1
when: "'Connection refused' in pass.stderr or 'Connection timed out' in pass.stderr"
- debug: msg={{srv1}}
when: "'Connection refused' in pass.stderr or 'Connection timed out' in pass.stderr"
- hosts: "{{ hostvars['localhost']['srv'] }}" or "{{ hostvars['localhost']['srv1'] }}"
tasks:
答案 0 :(得分:0)
您不能即时更改清单(您不能在剧本中添加或删除主机)。但是,如果所有主机都已经在清单中,则可以使用group_by模块在游戏内部创建组。
https://docs.ansible.com/ansible/2.6/modules/group_by_module.html
答案 1 :(得分:0)
我通过使用Jinja查询来解决。
- hosts: "{{ hostvars['localhost']['srv'] if 'Connection closed' in hostvars['localhost']['pass']['stderr'] else hostvars['localhost']['srv1']}}"
先停止第一台服务器进行测试,然后再使用第二台服务器并对该服务器执行任务。