ansible ad-hoc 能否容忍某些主机故障?

Can ansible ad-hoc tolerate some hosts failures?

我知道 ansible 剧本可以设置 max_fail_percentage 以允许剧本在至少该百分比的主机成功时继续进行。但是,我想 运行 如果至少有一定比例的主机执行无误,则该命令成功(退出状态 0)。可能吗?

如果你有一个影响 10 台主机的 playbook,并且在执行期间的某个时候它在 1 台主机上失败,Ansible 将简单地继续(如果你根本没有设置 max_fail_percentage)在所有其他主机上.这是默认行为,通常 playbook 将停止在出现故障的主机上执行任何更多步骤。

Ansible 文档中也提到了这一点:Ansible - max_failure_percentage

此行为与临时命令完全相同。 测试,测试,测试...

编辑:

Just Ansible 不会这样做,但是您可以通过将 Ansible 的输出通过管道传输到例如 perl one-liner 并在那里使用不同的代码退出来覆盖退出状态,它非常丑陋但有效:)

参见下面的示例,仅当 > 65% 的主机成功时它才会以 0 退出,否则退出代码为 2。 为了捕获失败并以某种方式解析它们,您需要将 STDERR 从 ansible 命令重定向到 STDOUT(因此 2>&1 在 Ansible 命令末尾,否则 Perl 将看不到它)

$ ansible all -i provisioning/vagrant-inventory -u vagrant --private-key=~/.vagrant.d/insecure_private_key -m ping 2>&1 | perl -pe 'BEGIN { $failed=0; $success=0;} END { $exit_code=( $success/($success+$failed) ) > 0.65 ? 0 : 2; exit $exit_code;} $failed++ if /\| FAILED/i; $success++ if /\| success/i;'
192.168.111.210 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.111.200 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.111.211 | FAILED => SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh

$ echo $?
0