ansible ad-hoc可以容忍一些主机故障吗?

时间:2015-01-24 13:26:49

标签: ansible host ansible-ad-hoc

我知道ansible playbooks可以设置max_fail_percentage,以便在至少占主机的百分比成功时允许Playbook进度。但是,如果至少有一部分主机执行没有错误,我想运行一个成功的ad-hoc命令(退出状态0)。有可能吗?

1 个答案:

答案 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