是否可以容忍某些主机故障



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

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

这在 Ansible 文档中也提到过:Ansible - max_failure_percentage

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

编辑:

只是 Ansible

不会这样做,但是您可以通过将 Ansible 的输出管道连接到例如 perl 单行并在那里使用不同的代码退出来覆盖退出状态,它非常丑陋,但工作:)

请参阅下面的示例,仅当 65% 的主机成功时>它才以 0 退出,否则退出代码为 2。为了捕获故障并以某种方式解析它们,您需要从ansible命令将STDERR重定向到STDOUT(因此在Ansible命令末尾的2>&1,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

最新更新