Centos

每當 ansible 在 CentOS7 中對 sshd 進行更改時,未來的隨機播放將無法連接

  • March 22, 2021

這已經是一個夠煩人的問題了,我想我最終會問整個社區可能的解決方案是什麼。更令人惱火的是,我似乎是唯一遇到此問題的人。

本質上,在 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 伺服器中配置什麼來防止這種情況發生嗎?ansible 中是否需要處理此問題,例如在第一次失敗時每次播放多次 ssh 嘗試?

提前致謝!

這似乎是一個常見的問題。 從 2016 年起重試 Ansible ssh 的更新檔

更好的解決方案可能是等待 sshd 準備好連接。 具有此 ansible 程式碼解決方案的原始執行緒:

$$ VM creation tasks… $$   - 名稱:等待 Kickstart 安裝完成並重新啟動 VM local_action:wait_for host={{ vm_hostname }} port=22 delay=30 timeout=1200 state=started

  - 名稱:現在配置虛擬機…

與其使用模組,不如systemd嘗試service模組:

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

引用自:https://unix.stackexchange.com/questions/368630