现在这已经是一个足够令人恼火的问题了,我想我最终会向整个社区询问可能的解决方案是什么。更令人恼火的是,我似乎是唯一遇到此问题的人。
本质上,在 CentOS 7.x 中的任何时候,sshd 配置或 sshd 的任何部分都会被修改,并且守护进程在接下来的 3 分钟内的某个“随机点”重新启动/重新加载,ssh 连接全部重置,然后该服务器通过 ssh 几秒钟无法访问。
对于 ansible 来说,这尤其是一个问题,因为它有时需要自行对 sshd 进行这些更改,并重新加载它(例如在新的 CentOS 7x 服务器版本中)。但在未来的游戏中,它只是随机地无法连接到 ssh,并且它会炸毁无法联系的主机的其余剧本/游戏。这对于大型主机模式来说尤其糟糕,因为其中一些会随机完成,但其他主机会在 sshd 被操纵后在剧本的各个阶段失败。值得注意的是,这种情况在 CentOS 5x、6x 甚至 Solaris 上都不会发生。
为了避免这种情况,我能做的最好的事情就是在对 sshd 进行任何更改后创建 90 秒的等待,即使这也不是完全万无一失的。如果调用 7-8 次,则这些 playbook 需要 20 多分钟才能运行。
以下是有关此环境的一些事实:
所有新安装均来自官方 ISO DVD。每台服务器都是 hyper-v 2012 guest 每台有此问题的服务器都是 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 服务器中配置一些东西来防止这种情况吗? ansible 中是否需要一些东西来处理这个问题,例如在第一次失败时每次尝试多次 ssh ?
提前致谢!
答案1
这似乎是一个常见问题。 2016 年起 Ansible ssh 重试补丁
更好的解决方案可能是等待 sshd 准备好连接。 原线使用此 ansible 代码解决方案:
[VM 创建任务...]
- name:等待 Kickstart 安装完成并且 VM 重新启动 local_action:wait_for host={{ vm_hostname }} port=22 delay=30 timeout=1200 state=started
- 名称:现在配置虚拟机...
答案2
不要使用该模块,而是systemd
尝试该service
模块:
- name: Restart secure shell daemon post configuration
service:
name: sshd
state: restarted