2

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

4

1 回答 1

1

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

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

对于 ad hoc 命令,此行为完全相同。测试,测试,测试……

编辑:

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

请参见下面的示例,仅当 > 65% 的主机成功时它以 0 退出,否则退出代码为 2。为了捕获失败并以某种方式解析它们,您需要从 ansible 命令将 STDERR 重定向到 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
于 2015-01-24T13:33:49.973 回答