我们使用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次。我们应该怎么做?
如果在启动新服务器的过程中发生这种情况,请考虑使用'wait_for'。我们在启动新的云服务器之后使用它来等待ssh变得可用,然后继续处理这些新服务器的任务。 –
实际上,我已经有一个wait_for任务,它在创建AWS实例后立即运行,并等待ssh准备就绪。我在后面的步骤中遇到了这个问题,即在安装了一些软件包/启动一些服务之后等等。正如我上面提到的,失败的任务在不同的运行中不相同。但是,我可能会考虑向每个等待ssh的角色添加一个pre_任务,因为问题似乎发生在角色转换之间。谢谢! – turkenh