每个主机失败时 ansible 退出

每个主机失败时 ansible 退出

我想使用 Ansible 仅在可以 ssh 进入的主机上运行某些任务。因此,我希望 Ansible 可以 ssh 进入我指定的所有主机。如果它可以成功 ssh 进入,则继续在这些主机上运行任务;对于无法 ssh 进入的主机,跳过其余的 play/playbook。顺便说一句,我对 Ansible 不是很有经验。

谢谢你,迈克

答案1

如果您有一个包含特定主机组(全部)任务的剧本并运行 Ansible,则 Ansible 首先尝试根据清单中的 Ansible 连接配置(通过收集事实)连接到主机。如果 Ansible 可以通过该连接类型访问主机,它会针对主机运行任务。如果它无法访问主机,服务器将进入故障状态(并且不会尝试在该机器上执行任务。

当然 - 对于该主机来说,在游戏结束时会出现错误/失败状态。

如果您不想在剧本结束时出现任何失败状态,您可以使用带有wait_for_connection模块的简单第一个任务,注册输出并忽略任何错误。并且不收集事实。然后所有后续任务都可以检查失败输出。

- name: "Bootstrap"
  hosts: all
  gather_facts: false
  tasks:
    - name: "Check, if server can be reached"
      wait_for_connection:
        delay: 1
        sleep: 1
      ignore_errors: true
      register: _bootstrap_result

    - name: "Gather facts on available hosts"
      setup:
      when:
        - "_bootstrap_result is not failed"

    - name: "Run my tasks"
      include_tasks: "setup.yml"
      when:
        - "_bootstrap_result is not failed"

如果您想在第一次连接尝试出现错误的情况下切换到其他连接类型wait_for_connection,那么只需为故障状态下的主机设置具体事实。

- name: "Check, if server can be reached on ssh port 2222"
  vars:
    ansible_port: 2222
  wait_for_connection:
    delay: 1
    sleep: 1
  ignore_errors: true
  register: _bootstrap2_result
  when: "_bootstrap_result is failed"

当然这只是切换 SSH 端口的一个例子。

答案2

一种方法是将 modulepingregister和结合起来使用ignore_errors。然后使用 moduleadd_host构建一个新的内存主机组,并执行仅when注册结果成功的任务。

开始新的play,使用上一步创建的内存主机组执行所有在线主机上的任务。

相关内容