在Ansible中选择主机时如何使用条件

时间:2018-11-05 08:15:50

标签: ansible

以下是我的播放列表。我的疑问是,如何使用从{{ 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:

2 个答案:

答案 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']}}"

先停止第一台服务器进行测试,然后再使用第二台服务器并对该服务器执行任务。