
これはかなりイライラする問題なので、最終的にコミュニティ全体に解決策は何か尋ねてみようと思いました。この問題を経験しているのは私だけのようなので、さらにイライラします。
基本的に、CentOS 7.x では、sshd 構成または sshd のいずれかの部分がいつでも変更され、次の 3 分間の「ランダムなポイント」でデーモンが再起動/再ロードされ、ssh 接続がすべてリセットされ、その後、そのサーバーは ssh 経由で数秒間アクセスできなくなります。
これは、Ansible にとって特に問題です。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 試行を行うなど、これを処理するために必要なものが Ansible にありますか?
前もって感謝します!
答え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
- name: VM を構成します...
答え2
モジュールを使用する代わりにsystemd
、次のservice
モジュールを試してください。
- name: Restart secure shell daemon post configuration
service:
name: sshd
state: restarted