如果主机无法访问,则中止ansible playbook

问题描述 投票:4回答:4

我想知道是否有任何可行的方法来要求所有主机执行一组任务以实际可以访问?

我目前正试图让它来处理一个更新,如果它们并非所有相关节点都是同步更新的话可能会很痛苦。

ansible ansible-playbook
4个回答
5
投票

当我看到这个时,我正准备发一个问题。邓肯建议的答案不起作用,至少在我的情况下。主机无法访问。我的所有剧本都指定max_fail_percentage为0。

但是,ansible将很乐意执行它能够访问并执行操作的主机上的所有任务。我真正想要的是如果任何主机无法访问,请不要执行任何任务。

我发现的是一个简单但可能被认为是hacky的解决方案,并且可以获得更好的答案。

自从作为运行剧本的一部分的第一步,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_all,则必须更改虚拟任务以反映该名称。


3
投票

您可以将qazxsw poi或qazxsw poi与qazxsw poi结合使用,然后运行一个在主机离线时将失败的任务。在剧本顶部的这样的东西应该做你需要的:

any_errors_fatal: true

奖励是,这也适用于限制匹配主机的max_fail_percentage: 0选项。


1
投票

你可以将gather_facts: false添加到你的剧本中 - 类似这样:

- hosts: all
  gather_facts: false
  max_fail_percentage: 0
  tasks:
    - action: ping

这样您就可以决定要承受多少失败。这是-l SUBSET

默认情况下,只要组中的主机尚未发生故障,Ansible将继续执行操作。在某些情况下,例如使用上述滚动更新,可能希望在达到某个故障阈值时中止播放。为实现此目的,从版本1.3开始,您可以在播放中设置最大失败百分比,如下所示:

  • hosts:webservers max_fail_percentage:30 serial:10在上面的示例中,如果组中10个服务器中的3个以上都失败,则播放的其余部分将被中止。

注意:必须超出百分比集,而不是等于。例如,如果serial设置为4并且您希望任务在2个系统发生故障时中止,则百分比应设置为49而不是50。


0
投票

灵感来自其他问题/答案。 max_fail_percentage

使用ansible-playbook 2.7.8。

检查每个所需主机是否有任何- hosts: all_boxes max_fail_percentage: 0 roles: - common pre_tasks: - include: roles/common/tasks/start-time.yml - include: roles/common/tasks/debug.yml 对我来说更明确。

relevant section from the Ansible Documentation
https://stackoverflow.com/a/55219490/457589
© www.soinside.com 2019 - 2024. All rights reserved.