当主机1在ansible中失败时,如何使用组中的第二台主机?
我有一个500多个组的清单,每个组有两台主机,一台为主,另一台为辅。在我的剧本中,我做了两件事。一个是获取无法访问的主机列表,第二个是在主服务器中执行命令 我的库存示例:(像这样,我从set1…set500有500多个组) 我能够收集无法访问的主机列表,并在主服务器中执行该命令现在,我想知道只有在无法访问主服务器时,如何在辅助服务器上执行该命令。当主机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
- 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