我知道ansible playbooks可以设置max_fail_percentage
,以便在至少占主机的百分比成功时允许Playbook进度。但是,如果至少有一部分主机执行没有错误,我想运行一个成功的ad-hoc命令(退出状态0)。有可能吗?
答案 0 :(得分:1)
如果你有影响10个主机的剧本,并且在执行期间的某个时刻它在1个主机上失败,Ansible将继续(如果你没有在所有其他主机上设置max_fail_percentage
)。这是默认行为,通常Playbooks将停止在出现故障的主机上执行更多步骤。
Ansible文档中也提到了这一点:Ansible - max_failure_percentage
对于即席命令,此行为完全相同。 测试,测试,测试......
修改强>
Just Ansible不会这样做,但你可以通过将Ansible的输出管道输出到例如perl one-liner并使用不同的代码退出来覆盖退出状态,这很难看但是有效:)
参见下面的示例,仅当>时才退出0 65%的主机成功,否则退出代码为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