每当ansible在CentOS7中对sshd进行更改时,将来的随机播放都无法连接


8

现在,这已经是一个令人烦恼的问题,以至于我以为我最终会问整个社区,可能的解决方案是什么。更令人讨厌的是,我似乎是唯一遇到此问题的人。

本质上,任何时候只要在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尝试吗?

提前致谢!


1
您确定已经看到它重置了现有的 ssh连接吗?通常,重新启动ssh不应影响现有连接,因此这可能是某种线索。
sourcejedi

请说明您正在使用的确切ansible版本(例如,如果有在systemd模块中的错误,人们会感兴趣的是什么版本)。
sourcejedi

@sourcejedi ansible --version ansible 2.2.0.0配置文件= /etc/ansible/ansible.cfg配置的模块搜索路径=默认值未覆盖好,我的意思是说它“可能”是一个错误,但是如果是这样,我为什么唯一经历过吗?除非那里没有其他人使用ansible的CentOS 7x...。不过,您是对的,因为服务刷新不会影响现有的连接。确实,在我的CentOS 6x服务器上,所有内容都可以在同一本Playbook上完美运行。
粘度

当您说它重新启动时-在系统日志中,您是否已获得全部?还是systemd报告sshd已退出,并根据重新启动Restart=on-failure?如果是这样,退出状态是什么?而且sshd没有记录任何错误消息吗?
sourcejedi

这不是一个Ansible问题,而是SSH或某些网络问题。重新启动SSH不会影响当前的SSH连接,因此这里有其他作用。您是否尝试过从终端通过SSH定期连接,重新启动sshd以及连接会如何?您还在将SSH ControlMaster与Ansible一起使用吗?您可以在ansible.cfg中启用它ssh_args = -o ControlMaster=auto -o ControlPersist=60s
Strahinja Kustudic'17年

Answers:


0

systemd尝试使用该模块,而不是使用该service模块:

- name: Restart secure shell daemon post configuration
  service: 
    name: sshd
    state: restarted

1
有趣的是,我会尝试一下并返回此页面让人们知道。但是服务模块不是只操作实际上通过systemctl重定向的“服务”二进制文件吗?好吧,我会试一试。
粘度

DopeGhoti,很遗憾您的建议没有用。我得到与以前完全相同的问题,并且它似乎与服务或systemd模块之间的模块无关。其他人有什么建议吗?
粘度

0

这似乎是一个常见的问题。 从2016年开始对Ansible SSH重试的补丁

更好的解决方案可能是等待sshd准备连接。 原始线程带有此可解决的代码解决方案:

[VM创建任务...]

  -名称:等待Kickstart安装完成,然后VM重新启动local_action:wait_for host = {{vm_hostname}} port = 22 delay = 30 timeout = 1200 state = started

  -名称:现在配置虚拟机...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.