Ansible 具有多个主机的播放具有阻止/始终。在任一主机上播放失败后,如何让剧本退出?

Ansible 具有多个主机的播放具有阻止/始终。在任一主机上播放失败后,如何让剧本退出?,ansible,Ansible,我的剧本里有两个剧本(第一部和第二部)。 第一次播放play1有两个任务(A/B)。 如果任务A失败,我需要任务B也被执行,然后playbook退出。 换句话说,将跳过第2场比赛。 所以我使用了block/always方法。 当主机是单主机时,它可以正常工作。 但当我指定多个主机播放时,play2仍然被执行。 虽然play2只针对一个主机执行,但我希望playbook在play2之前退出 我试图将任何错误添加到任务A中,但是它不起作用 #单主机剧本 名称:试块1 主持人:pltB 收集事实:不

我的剧本里有两个剧本(第一部和第二部)。 第一次播放play1有两个任务(A/B)。 如果任务A失败,我需要任务B也被执行,然后playbook退出。 换句话说,将跳过第2场比赛。 所以我使用了block/always方法。 当主机是单主机时,它可以正常工作。 但当我指定多个主机播放时,play2仍然被执行。 虽然play2只针对一个主机执行,但我希望playbook在play2之前退出

我试图将任何错误添加到任务A中,但是它不起作用

#单主机剧本
  • 名称:试块1

    主持人:pltB

    收集事实:不

    任务:

    • 区块:

      • 命令:“/usr/bin/hostname1”
      寄存器:主机名\u res

      任何致命错误:正确

      始终:

      • 调试:msg=“来自始终块1”
  • 名称:试块2

    主持人:pltB

    收集事实:不

    任务:

    • 区块:

      • 调试:msg=“结果是{{hostname\u res.stdout}”
      始终:

      • 调试:msg=“来自始终块2”
单主机输出 ansible playbook test.yml-i../inventory/serverhosts

播放[测试块1]**************************************************************************************

任务[命令]*************************************************************************************** 致命:[192.168.111.25]:失败!=>{“changed”:false,“cmd”:“/usr/bin/hostname1”,“msg”:“[Errno 2]没有这样的文件或目录”,“rc”:2}

任务[调试]************************************************************************************* 确定:[192.168.111.25]=>{ “msg”:“始终来自块1” } 要重试,请使用:--限制@/home/playbooks/test。重试

重演************************************************************************************* 192.168.111.25:确定=1更改=0无法访问=0失败=1

主机中有多台服务器
  • 名称:试块1

    主持人:pltB、pltA

    收集事实:不

    任务:

    • 区块:

      • 命令:“/usr/bin/hostname1”
      寄存器:主机名\u res

      任何致命错误:正确

      始终:

      • 调试:msg=“来自始终块1”
  • 名称:试块2

    主持人:pltB、pltA

    收集事实:不

    任务:

    • 区块:

      • 调试:msg=“结果是{{hostname\u res.stdout}”
      始终:

      • 调试:msg=“来自始终块2”
多台服务器的输出 播放[测试块1]***********************************************************************************

任务[命令]*************************************************************************************** 致命:[192.168.111.25]:失败!=>{“changed”:false,“cmd”:“/usr/bin/hostname1”,“msg”:“[Errno 2]没有这样的文件或目录”,“rc”:2} 更改:[192.168.111.24]

任务[调试]*************************************************************************************** 确定:[192.168.111.25]=>{ “msg”:“始终来自块1” } 确定:[192.168.111.24]=>{ “msg”:“始终来自块1” }

播放[测试块2]*********************************************************************************

任务[调试]*************************************************************************************** 好:[192.168.111.24]=>{ “msg”:“结果为plt001” }

任务[调试]************************************************************************************** 确定:[192.168.111.24]=>{ “msg”:“始终来自块2” } 要重试,请使用:--limit@/home/playbooks/test.retry

重演******************************************************************************************************* 192.168.111.24:确定=4更改=1无法访问=0失败=0
192.168.111.25:ok=1 changed=0 unreachable=0 failed=1

我认为这种行为是Ansible中的一个错误,但是我将从一个解决方法开始,以获得我认为您想要的行为

变通办法 在
之前的
ansible\u play\u batch
中用主机数注册一个事实,并在块后有一个任务/始终有一个任务在活动主机数减少时失败

来自Ansible特殊变量文档

ansible\u play\u batch
当前播放运行中受序列(也称为“batch”)限制的活动主机列表。失败/无法访问的主机不被视为“活动”

---
-主持人:全部
收集事实:不
任务:
-名称:使用播放批量大小设置事实
地方行动:
模块:设置事实
播放批次大小:{{ansible_播放批次}长度}整数}
跑一次:是的
-区块:
-名称:某些主机上的任务失败
命令:“cat test.txt”
任何致命错误:正确
始终:
-名称:来自“始终”部分的消息
调试:
msg:“调试任务成功”
-名称:如果批次大小已减小,则失败
地方行动:
模块:失败
msg:{{ansible_play_batch{length{int}}<{{play_batch_size}时,由于先前的错误而停止playbook执行
时间:ansible_play_batch | length | int
除了在控制台播放重播中正确识别故障主机外,本手册的工作原理与预期一致

问题解释 您看到的行为以及我在Ansible v2.8.1中重现的行为是,
始终
部分成功完成时正在擦除错误状态,而不会触发任何错误致命条件

清除错误状态是使用
重新CU的一项记录在案的功能
---
- hosts: all
  gather_facts: no
  tasks:
    - name: set fact with play batch size
      local_action:
        module: set_fact
        play_batch_size: "{{ ansible_play_batch|length|int }}"
      run_once: yes
    - block:
      - name: failing task on some hosts
        command: "cat test.txt"
        any_errors_fatal: true
      always:
      - name: message from always section
        debug:
          msg: "Debug task success"

    - name: fail if the batch size has decreased
      local_action:
        module: fail
        msg: "Halting playbook execution due to prior error, when {{ ansible_play_batch|length|int }} < {{ play_batch_size }}"
      when: ansible_play_batch|length|int < play_batch_size
      run_once: true

    - name: this should never run
      debug:
        msg: "Epic fail"