1

我们使用ansible将多个节点配置为一个集群。这些机器是在定制的AWS类似基础设施上创建的实例。 我们在不同的剧本上有大约100个任务,并且它们在每个节点上执行。Ansible **零星**失败,无法访问主机 - 无法通过ssh连接到主机

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通shell命令),该主机与失败后ansible正确的,它会引发同样的错误,但是如果我们等待大约一分钟左右,就可以ping它。

  • 我们可以说我们定制的基于AWS的基础架构是,在某种程度上,可能会偶尔出现一些零星的连接问题,这不会比1-2分钟更长的时间。

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

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

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

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

那么,我们需要什么对某个人来说,如果你看到一个节点无法到达,请不要放弃失败。在放弃无法访问之前,请等待一段时间或重试n次。我们应该怎么做?

+1

如果在启动新服务器的过程中发生这种情况,请考虑使用'wait_for'。我们在启动新的云服务器之后使用它来等待ssh变得可用,然后继续处理这些新服务器的任务。 –

+0

实际上,我已经有一个wait_for任务,它在创建AWS实例后立即运行,并等待ssh准备就绪。我在后面的步骤中遇到了这个问题,即在安装了一些软件包/启动一些服务之后等等。正如我上面提到的,失败的任务在不同的运行中不相同。但是,我可能会考虑向每个等待ssh的角色添加一个pre_任务,因为问题似乎发生在角色转换之间。谢谢! – turkenh

回答

2

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

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

+0

等待是两次尝试之间的超时时间?即如果它是1秒而不是越来越多的尝试可能没有意义。我们是否也可以用ansible_ssh_common_args增加它? – turkenh

+0

1秒钟,根据手册页。 –