Ansible中ssh_connection的retries是否会被any_errors_fatal覆盖?
我们有一份用于部署的Ansible Playbook,通过SSH连接堡垒机后向多台后端服务器部署内容。偶尔会出现某台服务器短暂连接失败的情况,重试操作应该可以解决该问题。当前我们的ansible.cfg配置如下:
[defaults] private_key_file = <Key_location> remote_user = <remote_user> host_key_checking = False any_errors_fatal = True [ssh_connection] pipelining=true control_path = %(directory)s/%%C retries = 3
问题:在[ssh_connection]段添加retries选项后,该选项是否仍会生效,还是会被any_errors_fatal配置覆盖?
别担心,这两个配置其实管的是完全不同的环节,不会互相覆盖,各自都会正常生效。
我来拆解下两者的作用范围和优先级:
retries = 3(ssh_connection段):这个是针对SSH连接建立阶段的重试设置。当Ansible尝试和目标服务器建立SSH连接失败时(比如临时网络闪断、服务器短时间不可达),它会严格按照你设置的次数重试连接,直到成功或者耗尽重试次数。这是底层连接层面的处理,还没进入Playbook任务执行的阶段。any_errors_fatal = True(defaults段):这个是针对Playbook任务执行阶段的全局规则。一旦任何一台目标服务器上的任务执行失败(注意,这里是指任务本身执行出错,而非连接建立失败),整个Playbook会立刻终止,不会继续在其他服务器上执行后续任务。但它根本管不到SSH连接建立时的重试逻辑。
举个实际场景的例子你就懂了:
假设你有3台后端服务器,其中一台临时SSH连不上。Ansible会先按照retries=3的设置,尝试连这台机器3次。如果3次都失败了,这时才会触发错误;而因为any_errors_fatal=True,整个Playbook会直接停止,不会再去处理另外两台服务器。但如果第2次重试就成功了,那Playbook就会正常在这台机器上执行任务,完全不受any_errors_fatal的影响。
总结一下核心逻辑:
ssh_connection里的retries负责处理连接建立前的重试,是先执行的底层逻辑;any_errors_fatal只负责处理任务执行阶段的错误终止,只有当连接重试耗尽后仍失败,才会触发它的终止规则。
内容的提问来源于stack exchange,提问作者Jason Watt

