ansible ad-hoc能否容忍某些主机故障?
我知道ansible playbooks可以设置ansible ad-hoc能否容忍某些主机故障?,ansible,host,ansible-ad-hoc,Ansible,Host,Ansible Ad Hoc,我知道ansible playbooks可以设置max\u fail\u percentage,以允许playbook在至少该百分比的主机成功的情况下继续运行。但是,如果至少有一定百分比的主机执行时没有错误,我希望运行一个成功的特别命令(退出状态0)。有可能吗?如果您有一个影响10台主机的剧本,并且在执行过程中的某个时刻,它在1台主机上失败,Ansible将在所有其他主机上继续(如果您根本没有设置max\u fail\u percentage)。这是默认行为,通常情况下,playbooks将停止
max\u fail\u percentage
,以允许playbook在至少该百分比的主机成功的情况下继续运行。但是,如果至少有一定百分比的主机执行时没有错误,我希望运行一个成功的特别命令(退出状态0)。有可能吗?如果您有一个影响10台主机的剧本,并且在执行过程中的某个时刻,它在1台主机上失败,Ansible将在所有其他主机上继续(如果您根本没有设置max\u fail\u percentage
)。这是默认行为,通常情况下,playbooks将停止在发生故障的主机上执行更多步骤
Ansible文档中也提到了这一点:
对于特殊命令,这种行为完全相同。
测试,测试,测试
编辑:
只是Ansible不能做到这一点,但是您可以通过将Ansible的输出管道化到例如perl one liner并使用不同的代码退出来覆盖退出状态,这非常难看,但可以工作:)
请参见下面的示例,只有当超过65%的主机成功时,它才会以0退出,否则退出代码为2。
为了捕获失败并以某种方式解析它们,您需要将STDERR从ansible命令重定向到STDOUT(因此在ansible命令的末尾2>&1,否则Perl将看不到它)
在临时命令中,只有一个命令(或播放,如果您愿意)。当然,即使出现故障,临时命令也会在每台主机上执行:剧本都是一样的,
max\u fail\u percentage
会停止下一个播放,而不是当前播放。我想要的是,如果至少有X台主机正常执行,则命令退出状态为0。因此,答案是否定的,ansible无法独自容忍主机故障。但是,是的,您可以用perl magic包装它:)我也不希望它这样做,Ansible的退出代码在我看来是正确的。它的标准行为方式是,如果任何主机发生故障,退出代码为2,如果某个主机无法访问,退出代码为3。曾经在GitHub上讨论过这个问题。对于异常用例-异常解决方案;)
$ 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