Ansible **偶尔会因主机无法访问而失败 - 无法通过ssh连接到主机

时间:2016-06-21 22:29:15

标签: amazon-web-services ansible ansible-playbook openssh ansible-2.x

我们使用ansible将多个节点配置为群集。这些计算机是在自定义AWS类似基础架构上创建的实例。 我们在不同的剧本上有大约一百个任务,它们在每个节点上执行。

问题是,我们遇到零星的主机无法访问错误,并且播放器执行因以下故障而停止:

TASK [common : install basic packages] *************************
fatal: [fqdn.for.a.node]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true}

使用-vvv输出:

TASK [common : install basic packages] *******************************
task path: /jenkins/workspace/Cluster-Deployment/91/roles/common/tasks/install-basic-packages.yml:1
<fqdn.for.a.node> ESTABLISH SSH CONNECTION FOR USER: root
<fqdn.for.a.node> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=root -o ConnectTimeout=600 -o ControlPath=/home/turkenh/.ansible/cp/ansible-ssh-%h-%p-%r fqdn.for.a.node '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1466523588.96-210828884892875 `" && echo ansible-tmp-1466523588.96-210828884892875="` echo $HOME/.ansible/tmp/ansible-tmp-1466523588.96-210828884892875 `" ) && sleep 0'"'"''
failed: [fqdn.for.a.node] (item=[u'unzip']) => {"item": ["unzip"], "msg": "Failed to connect to the host via ssh.", "unreachable": true}

这是我们的ansible.cfg文件:

[defaults]
forks = 50
sudo_flags=-i
nocows=1

# do not check host key while doing ssh
host_key_checking = False
# use openssh not paramiko
transport = ssh
private_key_file = id_rsa
remote_user = root

请参阅下面的说明:

  • 当我们在失败后尝试ping(使用ansible ping模块,而不是ping shell命令)主机与ansible时,它会抛出相同的错误,但如果我们等待大约一分钟左右,我们可以ping它。

  • 我们可以说明我们基于AWS的自定义基础架构,不知何故,可能会不时出现一些零星的连接问题,而且不会超过1-2分钟。

  • 在ansible.cfg中尝试将超时参数设置为较大的数字(即600),但没有帮助。

  • 我们正在配置节点ubuntu,redhat和suse,但无论操作系统如何,我们都会在20%的概率下获得此错误。

  • 在我的剧本中,它不是相同或类似的任务,它失败了,它只是随机失败。 (有时在设置模块中,有时在包模块中,......)

  • 我们的ansible版本是2.1(用pip安装),工作站的操作系统是Ubuntu 14.04

所以,我们需要的是,不知何故,对ansible说,如果你看到一个节点无法访问,请不要放弃失败。请等待一段时间或重试n次,然后再放弃无法访问。我们怎么做到这一点?

1 个答案:

答案 0 :(得分:5)

正式回答您的问题:您可以使用ansible_ssh_common_args="-o ConnectionAttempts=20"增加广告资源文件中的ssh尝试次数。为问题主机,主机组或all虚拟组指定它(例如在group_vars/all.yml文件中)。

还有ssh_args配置选项,但我不想修改它,因为它会覆盖ansible默认的ssh参数。