web-dev-qa-db-ja.com

サーバーが再起動するのを待ってプレイブックが機能し続けるようにAnsibleを作成することはできません

ソフトウェアをインストールするためのプレイブックを作成しています。プレイブックの途中でサーバーを再起動する必要があります。

サーバーが戻るまで待機し、残りのタスクを実行するためにAnsible Hostが必要ですが、これは発生していません。

これらは再起動と待機に関連する私のAnsibleタスクです:

...
- name: restart server
  Shell: shutdown -r now
  async: 1
  poll: 0
  become: yes
  become_method: Sudo
  ignore_errors: true
- name: waiting for server to come back after reboot
  local_action: wait_for Host={{ ansible_ssh_Host }} state=started port=22 delay=30 timeout=300 connect_timeout=15
....

これは私のプレイブックを実行した結果です:

...

TASK [restart server] **********************************************************
fatal: [X.X.X.X]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the Host via ssh.", "unreachable": true}
    to retry, use: --limit @ansible_pb.retry

PLAY RECAP *********************************************************************
X.X.X.X               : ok=2    changed=0    unreachable=1    failed=0

何が間違っているのか、どうすれば修正できますか?

これは一般的に知られている問題です。 サーバーを再起動し、サーバーが戻るのを待ちます を参照してください。 Ansible 1.9.4以降、SSHは次のタスクに進む前に接続を失います。

sleepコマンドの前に遅延(shutdown)を追加する必要があります。

- name: restart server
  Shell: sleep 2 && shutdown -r now
  async: 1
  poll: 0
  become: yes
  become_method: Sudo
  ignore_errors: true
- name: waiting for server to come back after reboot
  wait_for_connection:
....
8
techraf

Ansible 2.7では、 reboot モジュールが導入され、この問題が解決されました。

以下を使用できます。

- name: restart server
  reboot:
2

私はこれがEX-407(Ansible 2.3に基づいています)でうまく機能することを発見しました:

- name: restart the server
  Shell: (sleep 2 && shutdown -r now) &
  async: 1
  poll: 0
  ignore_errors: true

- name: wait for the server to come back
  wait_for:
    Host: "{{ inventory_hostname }}"
    port: 22
    delay: 15
  delegate_to: localhost

私が驚いたのは、wait_forモジュールの「state:started」オプションが最初はすべてを失敗させていたことです。 wait_forは、ポート22が再び開いていることを検出できませんでした。しかし、その振る舞いを説明することはできません。 「状態」オプションが削除されると、プレイブックは期待どおりに機能し始めました。

0