如果无法访问主机,则中止ansible playbook
我想知道是否有合适的方法要求一组任务应该执行的所有主机实际上都是可访问的如果无法访问主机,则中止ansible playbook,ansible,ansible-playbook,Ansible,Ansible Playbook,我想知道是否有合适的方法要求一组任务应该执行的所有主机实际上都是可访问的 我目前正试图让它处理一个更新,如果不是所有相关节点都同步更新,这可能会很痛苦。您可以将max\u fail\u percentage添加到您的剧本中-类似这样的内容: - hosts: all_boxes max_fail_percentage: 0 roles: - common pre_tasks: - include: roles/common/tasks/start-time.yml
我目前正试图让它处理一个更新,如果不是所有相关节点都同步更新,这可能会很痛苦。您可以将
max\u fail\u percentage
添加到您的剧本中-类似这样的内容:
- hosts: all_boxes
max_fail_percentage: 0
roles:
- common
pre_tasks:
- include: roles/common/tasks/start-time.yml
- include: roles/common/tasks/debug.yml
这样你就可以决定你要容忍多少失败。以下是:
默认情况下,只要存在,Ansible将继续执行操作
是组中尚未失败的主机。在某些情况下,
例如,使用上述滚动更新,这可能是可取的
在达到某个故障阈值时中止播放
达到。为了实现这一点,从1.3版开始,您可以设置最大
播放的失败百分比如下所示:
- hosts:webservers max_fail_percentage:30 serial:10在上面的示例中,如果组中的10台服务器中有3台以上需要 如果失败,游戏的其余部分将被中止
我正要发帖,这时我看到了这个问题。邓肯建议的答案不起作用,至少对我来说是这样。无法访问主机。我的所有剧本都指定了0的最大失败百分比 但是ansible将愉快地在主机上执行它能够到达并执行操作的所有任务。我真正想要的是,如果无法访问任何主机,请不要执行任何任务 我发现的是一个简单但可能被认为是骇客的解决方案,并且是一个更好答案的开放式解决方案 作为运行剧本的第一步,ansible为所有主持人收集事实。如果无法访问主机,则无法访问。 我在剧本一开始就写了一个简单的剧本,它将使用一个事实。如果无法访问主机,该任务将失败,并出现“未定义变量错误”。该任务只是一个虚拟任务,如果所有主机都可以访问,它将始终通过 请参见下面我的示例:
- name: Check Ansible connectivity to all hosts
hosts: host_all
user: "{{ remote_user }}"
sudo: "{{ sudo_required }}"
sudo_user: root
connection: ssh # or paramiko
max_fail_percentage: 0
tasks:
- name: check connectivity to hosts (Dummy task)
shell: echo " {{ hostvars[item]['ansible_hostname'] }}"
with_items: groups['host_all']
register: cmd_output
- name: debug ...
debug: var=cmd_output
如果无法访问主机,则会出现如下错误:
TASK: [c.. *****************************************************
fatal: [172.22.191.160] => One or more undefined variables: 'dict object' has no attribute 'ansible_hostname'
fatal: [172.22.191.162] => One or more undefined variables: 'dict object' has no attribute 'ansible_hostname'
FATAL: all hosts have already failed -- aborting
注意:如果您的主机组没有被称为
host\u all
,您必须更改虚拟任务以反映该名称。您可以将任何错误\u致命:true
或最大失败百分比:0
与收集事实:false
,然后运行一个在主机脱机时将失败的任务。剧本顶部的类似内容应满足您的需要:
- hosts: all
gather_facts: false
max_fail_percentage: 0
tasks:
- action: ping
另一个好处是,它还可以与
-l SUBSET
选项一起使用,以限制匹配主机。受其他问题/答案的启发。
使用ansible playbook 2.7.8
检查每个所需主机是否有任何ansible\u事实
,对我来说更为明确
# my-playbook.yml
- hosts: myservers
tasks:
- name: Check ALL hosts are reacheable before doing the release
fail:
msg: >
[REQUIRED] ALL hosts to be reachable, so flagging {{ inventory_hostname }} as failed,
because host {{ item }} has no facts, meaning it is UNREACHABLE.
when: "hostvars[item].ansible_facts|list|length == 0"
with_items: "{{ groups.myservers }}"
- debug:
msg: "Will only run if all hosts are reacheable"
为什么需要收集事实?默认情况下,Ansible将仅在可访问的主机上运行,并在收集事实时确定这一点。后续的
ping
将始终成功,因为Ansible仅尝试在其知道已启动的主机上运行playbook。Ansible的运行行为在2.0中发生了变化,因此不再工作。实际上,只确定2.1,而不是2.0(无法再编辑以前的评论)谢谢,最后,我将此作为一个预任务使用。如果您使用的是角色:如果使用ansible playbook 2.1.1.0,您可能希望在以下情况下使用:“'ansible_system'不在hostvars[item]中”
$ ansible-playbook -i my-inventory.yml my-playbook.yml
PLAY [myservers] *************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************
fatal: [my-host-03]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname my-host-03: Name or service not known", "unreachable": true}
fatal: [my-host-04]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname my-host-04: Name or service not known", "unreachable": true}
ok: [my-host-02]
ok: [my-host-01]
TASK [Check ALL hosts are reacheable before doing the release] ********************************************************************************************************************************************************************************************************************
failed: [my-host-01] (item=my-host-03) => {"changed": false, "item": "my-host-03", "msg": "[REQUIRED] ALL hosts to be reachable, so flagging my-host-01 as failed, because host my-host-03 has no facts, meaning it is UNREACHABLE."}
failed: [my-host-01] (item=my-host-04) => {"changed": false, "item": "my-host-04", "msg": "[REQUIRED] ALL hosts to be reachable, so flagging my-host-01 as failed, because host my-host-04 has no facts, meaning it is UNREACHABLE."}
failed: [my-host-02] (item=my-host-03) => {"changed": false, "item": "my-host-03", "msg": "[REQUIRED] ALL hosts to be reachable, so flagging my-host-02 as failed, because host my-host-03 has no facts, meaning it is UNREACHABLE."}
failed: [my-host-02] (item=my-host-04) => {"changed": false, "item": "my-host-04", "msg": "[REQUIRED] ALL hosts to be reachable, so flagging my-host-02 as failed, because host my-host-04 has no facts, meaning it is UNREACHABLE."}
skipping: [my-host-01] => (item=my-host-01)
skipping: [my-host-01] => (item=my-host-02)
skipping: [my-host-02] => (item=my-host-01)
skipping: [my-host-02] => (item=my-host-02)
to retry, use: --limit @./my-playbook.retry
PLAY RECAP *********************************************************************************************************************************************************************************************************************
my-host-01 : ok=1 changed=0 unreachable=0 failed=1
my-host-02 : ok=1 changed=0 unreachable=0 failed=1
my-host-03 : ok=0 changed=0 unreachable=1 failed=0
my-host-04 : ok=0 changed=0 unreachable=1 failed=0