Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ansible ad-hoc能否容忍某些主机故障?_Ansible_Host_Ansible Ad Hoc - Fatal编程技术网

ansible ad-hoc能否容忍某些主机故障?

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将停止

我知道ansible 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