现在,这已经是一个令人烦恼的问题,以至于我以为我最终会问整个社区,可能的解决方案是什么。更令人讨厌的是,我似乎是唯一遇到此问题的人。
本质上,任何时候只要在CentOS 7.x中修改sshd配置或sshd的任何部分,并且在接下来的3分钟内某个“随机点”重新启动/重新加载守护程序,ssh连接都会全部重置,然后该服务器即通过ssh几秒钟无法到达。
这对于ansible尤其是一个问题,因为它有时需要自己对sshd进行这些更改,然后重新加载它(例如在新的CentOS 7x服务器版本中)。但是后来在播放时,它只是随机地无法连接到ssh,并且它炸毁了该主机的其余剧本/剧本,但未能与之联系。这对于大型主机模式尤其不利,因为少数主机模式会随机完成,但其他主机在操作sshd之后会在剧本的各个阶段失败。值得注意的是,在CentOS 5x,6x或什至在Solaris上都没有发生这种情况。
为了避免这种情况,我能做的最好的办法是在对sshd进行任何更改后创建90秒的等待时间,即使这样也不是很简单。即使被调用7至8次,这些书也需要20分钟以上才能运行。
有关此环境的一些事实:
所有新安装均来自官方ISO DVD。每个服务器都是hyper-v 2012来宾,每个有此问题的服务器都是CentOS 7.x
这是问题的一些实际输出以及一些棘手的解决方案:
失败:
fatal: [voltron]: UNREACHABLE! => {"changed": false, "msg": "All items completed", "results": [{"_ansible_item_result": true, "item": ["rsync", "iotop", "bind-utils", "sysstat.x86_64", "lsof"], "msg": "Failed to connect to the host via ssh: Shared connection to voltron closed.\r\n", "unreachable": true}]}
sshd更改之一的示例:
- name: Configure sshd to disallow root logins for security purposes on CentOS and Redhat 7x servers.
lineinfile:
backup: yes
dest: /etc/ssh/sshd_config
regexp: '^(#PermitRootLogin)'
line: "PermitRootLogin no"
state: present
when: (ansible_distribution == "CentOS" or "RedHat") and (ansible_distribution_major_version == "7")
notify: sshd reload Linux 7x
以下处理程序:
- name: sshd reload Linux 7x
systemd:
state: restarted
daemon_reload: yes
name: sshd
最后,我的贫民窟修复程序尝试解决此问题:
- name: Wait a bit on CentOS/Redhat 7x servers to ensure changes don't mess up ssh and screw up further plays.
pause:
seconds: 90
when: (ansible_distribution == "CentOS" or "RedHat") and (ansible_distribution_major_version == "7")
必须有比我想出的更好的解决方案,而且很难相信其他所有人都会遇到并且也接受它。我需要在CentOS 7.x服务器中进行配置以防止这种情况吗?有什么需要解决的难题,例如在第一次失败时每次播放多次ssh尝试吗?
提前致谢!
Restart=on-failure
?如果是这样,退出状态是什么?而且sshd没有记录任何错误消息吗?
sshd
以及连接会如何?您还在将SSH ControlMaster
与Ansible一起使用吗?您可以在ansible.cfg中启用它ssh_args = -o ControlMaster=auto -o ControlPersist=60s
。