当主机1在ansible中失败时,如何使用组中的第二台主机?

当主机1在ansible中失败时,如何使用组中的第二台主机?,ansible,yaml,devops,ansible-2.x,Ansible,Yaml,Devops,Ansible 2.x,我有一个500多个组的清单,每个组有两台主机,一台为主,另一台为辅。在我的剧本中,我做了两件事。一个是获取无法访问的主机列表,第二个是在主服务器中执行命令 我的库存示例:(像这样,我从set1…set500有500多个组) 我能够收集无法访问的主机列表,并在主服务器中执行该命令现在,我想知道只有在无法访问主服务器时,如何在辅助服务器上执行该命令。 - delegate_to: localhost command: ping -c1 "{{ hostvars[inventor

我有一个500多个组的清单,每个组有两台主机,一台为主,另一台为辅。在我的剧本中,我做了两件事。一个是获取无法访问的主机列表,第二个是在主服务器中执行命令

我的库存示例:(像这样,我从set1…set500有500多个组)

我能够收集无法访问的主机列表,并在主服务器中执行该命令现在,我想知道只有在无法访问主服务器时,如何在辅助服务器上执行该命令。

  - delegate_to: localhost
    command: ping -c1 "{{ hostvars[inventory_hostname].ansible_host|default(inventory_hostname) }}"
    register: ping
    ignore_errors: true
    become: false

  - set_fact:
     available: "{{ ping.rc == 0 }}"

  - lineinfile:
      dest: "/tmp/available.txt"
      line: "{{ hostvars[inventory_hostname]. }} : {{ inventory_hostname }}"
      regexp: "Host: {{ inventory_hostname }}"
      create: true
    delegate_to: localhost
    become: false
    when: "{{ hostvars[inventory_hostname].available }} == False"

  - shell: date
    register: dateout
    when: "setup is search('primary')"
只有在无法访问主服务器时,我才需要在辅助服务器中执行shell任务(我提到的date命令仅供参考,我还有其他事情要做)


有人能告诉我怎么做吗?

若要仅在组中的单个主机上执行任务,请尝试使用
运行一次:true
若要执行任务,请查看详细的参考资料

如果您知道可以访问主服务器,则可以为组中的其余主机设置变量事实,如
execute\u on\u secondary=False
,并将其用于任务的
块中的when条件

- set_fact:
    execute_on_secondary: False
  delegate_to: "{{ item }}"
  with_items: "{{ play_hosts }}"
  run_once: yes
  when: ## condition for when primary is reachable ##

- block:
    # tasks here
  when: setup == "primary" or execute_on_secondary

下面的方法很琐碎。在将其用于业务关键型系统之前,先对其进行测试


先打乒乓球。无法访问的主机将从未来播放中排除:

这是我的清单:

[groupA]
AnsibleTower ansible_host=192.168.124.8
[groupB]
jaxsat ansible_host=192.168.124.111
rhel7.5 ansible_host=192.168.124.4
现在,这是没有ping的剧本:

---
- hosts: groupB
  gather_facts: no
  connection: ssh
  tasks:
  - name: Run hostname command
    command: /bin/hostname
    register: result
    run_once: yes 

  - name: Show result
    debug:
      var: result
    run_once: yes 
它失败是因为
jaxsat
关闭:

$ ansible-playbook -i inventory/ test_one_only.yml

PLAY [groupB] **********************************************************************************

TASK [Run hostname command] ********************************************************************
Tuesday 21 July 2020  13:40:38 -0400 (0:00:00.064)       0:00:00.064 ********** 
fatal: [jaxsat]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.124.111 port 22: No route to host\r\n", "unreachable": true}
 [WARNING]: Failure using method (v2_runner_on_unreachable) in callback plugin
(<ansible.plugins.callback.mail.CallbackModule object at 0x7f95688fbf10>): [Errno 111]
Connection refused


NO MORE HOSTS LEFT *****************************************************************************
    to retry, use: --limit @/home/jack/Ansible/TEST/test_one_only.retry

PLAY RECAP *************************************************************************************
jaxsat                     : ok=0    changed=0    unreachable=1    failed=0   

Tuesday 21 July 2020  13:40:42 -0400 (0:00:03.218)       0:00:03.283 ********** 
=============================================================================== 
Run hostname command -------------------------------------------------------------------- 3.22s
Playbook run took 0 days, 0 hours, 0 minutes, 3 seconds
jaxsat
未在其他任务上尝试:

$ ansible-playbook -i inventory/ test_one_only.yml

PLAY [groupB] **********************************************************************************

TASK [ping all hosts] **************************************************************************
Tuesday 21 July 2020  13:42:12 -0400 (0:00:00.057)       0:00:00.057 ********** 
ok: [rhel7.5]
fatal: [jaxsat]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.124.111 port 22: No route to host\r\n", "unreachable": true}
 [WARNING]: Failure using method (v2_runner_on_unreachable) in callback plugin
(<ansible.plugins.callback.mail.CallbackModule object at 0x7f07f21ad850>): [Errno 111]
Connection refused


TASK [Run hostname command] ********************************************************************
Tuesday 21 July 2020  13:42:15 -0400 (0:00:03.217)       0:00:03.275 ********** 
changed: [rhel7.5]

TASK [Show result] *****************************************************************************
Tuesday 21 July 2020  13:42:15 -0400 (0:00:00.348)       0:00:03.623 ********** 
ok: [rhel7.5] => {
    "result": {
        "changed": true, 
        "cmd": [
            "/bin/hostname"
        ], 
        "delta": "0:00:00.001530", 
        "end": "2020-07-21 13:42:15.921749", 
        "failed": false, 
        "rc": 0, 
        "start": "2020-07-21 13:42:15.920219", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "localhost.localdomain.localdomain", 
        "stdout_lines": [
            "localhost.localdomain.localdomain"
        ]
    }
}
    to retry, use: --limit @/home/jack/Ansible/TEST/test_one_only.retry

PLAY RECAP *************************************************************************************
jaxsat                     : ok=0    changed=0    unreachable=1    failed=0   
rhel7.5                    : ok=3    changed=1    unreachable=0    failed=0   

Tuesday 21 July 2020  13:42:15 -0400 (0:00:00.037)       0:00:03.661 ********** 
=============================================================================== 
ping all hosts -------------------------------------------------------------------------- 3.22s
Run hostname command -------------------------------------------------------------------- 0.35s
Show result ----------------------------------------------------------------------------- 0.04s
Playbook run took 0 days, 0 hours, 0 minutes, 3 seconds
$ansible playbook-i库存/测试\u仅限一个\u.yml
播放[组B]**********************************************************************************
任务[ping所有主机]**************************************************************************
2020年7月21日星期二13:42:12-0400(0:00:00.057)0:00:00.057********
ok:[rhel7.5]
致命:[jaxsat]:无法访问!=>{“changed”:false,“msg”:“未能通过ssh连接到主机:ssh:connect to host 192.168.124.111端口22:没有到主机的路由\r\n”,“unreachable”:true}
[警告]:在回调插件中使用方法(v2\u runner\u on\u unreachable)失败
():[Errno 111]
拒绝连接
任务[运行主机名命令]********************************************************************
2020年7月21日星期二13:42:15-0400(0:00:03.217)0:00:03.275********
更改:[rhel7.5]
任务[显示结果]*****************************************************************************
2020年7月21日星期二13:42:15-0400(0:00:00.348)0:00:03.623********
ok:[rhel7.5]=>{
“结果”:{
“改变”:对,
“cmd”:[
“/bin/hostname”
], 
“增量”:“0:00:00.001530”,
“结束”:“2020-07-2113:42:15.921749”,
“失败”:错误,
“rc”:0,
“开始”:“2020-07-2113:42:15.920219”,
“标准”:“,
“标准行”:[],
“stdout”:“localhost.localdomain.localdomain”,
“标准线”:[
“localhost.localdomain.localdomain”
]
}
}
要重试,请使用:--limit@/home/jack/Ansible/TEST/TEST\u one\u。重试
重演*************************************************************************************
jaxsat:ok=0 changed=0 unreachable=1 failed=0
rhel7.5:正常=3更改=1无法访问=0失败=0
2020年7月21日星期二13:42:15-0400(0:00:00.037)0:00:03.661*********
=============================================================================== 
ping所有主机-------------------------------------------------------------------3.22s
运行hostname命令-------------------------------------------0.35s
显示结果--------------------------------------------0.04s
Playbook运行耗时0天0小时0分3秒

这只能对一个组运行,不是吗?如果我一次为所有500个组运行此作业(对我的整个库存),这将只在一个组中运行,因为我们使用的是run_once,对吗?@Rajesh如果您在playbook文件中使用
-hosts:all
run_once
将使该任务仅在
all
组中的单个主机上运行(ansible不按组处理任务,它处理一个名为
all
的特殊组,默认情况下该组包含清单中的所有主机)。为了更清楚地了解这一点,请尝试在剧本中使用
debug
模块打印
{{groups}
变量值(别忘了在这里使用
run_once
,否则,该变量将被打印500次)。@Rajesh一个简单的黑客可以工作-如果每个主机组只有2个主机条目(一个主项和一个辅助项),您可以在剧本中使用
serial:2
,以获得所需的结果。请参阅我上面回答中的第二部分。感谢您的评论。您已在剧本中指出该剧在hostB上手动运行。我该怎么做?我有500多个组,无法将这些组手动添加到剧本中,对吗?不是hostB,而是GROUPB。有吗顺便说一句,我假设您对不同的组有不同的任务。(否则,为什么他们在不同的组中?)。
$ ansible-playbook -i inventory/ test_one_only.yml

PLAY [groupB] **********************************************************************************

TASK [Run hostname command] ********************************************************************
Tuesday 21 July 2020  13:40:38 -0400 (0:00:00.064)       0:00:00.064 ********** 
fatal: [jaxsat]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.124.111 port 22: No route to host\r\n", "unreachable": true}
 [WARNING]: Failure using method (v2_runner_on_unreachable) in callback plugin
(<ansible.plugins.callback.mail.CallbackModule object at 0x7f95688fbf10>): [Errno 111]
Connection refused


NO MORE HOSTS LEFT *****************************************************************************
    to retry, use: --limit @/home/jack/Ansible/TEST/test_one_only.retry

PLAY RECAP *************************************************************************************
jaxsat                     : ok=0    changed=0    unreachable=1    failed=0   

Tuesday 21 July 2020  13:40:42 -0400 (0:00:03.218)       0:00:03.283 ********** 
=============================================================================== 
Run hostname command -------------------------------------------------------------------- 3.22s
Playbook run took 0 days, 0 hours, 0 minutes, 3 seconds
---
- hosts: groupB
  gather_facts: no
  connection: ssh
  tasks:
  - name: ping all hosts
    ping:

  - name: Run hostname command
    command: /bin/hostname
    register: result
    run_once: yes 

  - name: Show result
    debug:
      var: result
    run_once: yes 
$ ansible-playbook -i inventory/ test_one_only.yml

PLAY [groupB] **********************************************************************************

TASK [ping all hosts] **************************************************************************
Tuesday 21 July 2020  13:42:12 -0400 (0:00:00.057)       0:00:00.057 ********** 
ok: [rhel7.5]
fatal: [jaxsat]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.124.111 port 22: No route to host\r\n", "unreachable": true}
 [WARNING]: Failure using method (v2_runner_on_unreachable) in callback plugin
(<ansible.plugins.callback.mail.CallbackModule object at 0x7f07f21ad850>): [Errno 111]
Connection refused


TASK [Run hostname command] ********************************************************************
Tuesday 21 July 2020  13:42:15 -0400 (0:00:03.217)       0:00:03.275 ********** 
changed: [rhel7.5]

TASK [Show result] *****************************************************************************
Tuesday 21 July 2020  13:42:15 -0400 (0:00:00.348)       0:00:03.623 ********** 
ok: [rhel7.5] => {
    "result": {
        "changed": true, 
        "cmd": [
            "/bin/hostname"
        ], 
        "delta": "0:00:00.001530", 
        "end": "2020-07-21 13:42:15.921749", 
        "failed": false, 
        "rc": 0, 
        "start": "2020-07-21 13:42:15.920219", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "localhost.localdomain.localdomain", 
        "stdout_lines": [
            "localhost.localdomain.localdomain"
        ]
    }
}
    to retry, use: --limit @/home/jack/Ansible/TEST/test_one_only.retry

PLAY RECAP *************************************************************************************
jaxsat                     : ok=0    changed=0    unreachable=1    failed=0   
rhel7.5                    : ok=3    changed=1    unreachable=0    failed=0   

Tuesday 21 July 2020  13:42:15 -0400 (0:00:00.037)       0:00:03.661 ********** 
=============================================================================== 
ping all hosts -------------------------------------------------------------------------- 3.22s
Run hostname command -------------------------------------------------------------------- 0.35s
Show result ----------------------------------------------------------------------------- 0.04s
Playbook run took 0 days, 0 hours, 0 minutes, 3 seconds