ソフトウェアをインストールするためのプレイブックを作成しています。プレイブックの途中でサーバーを再起動する必要があります。
サーバーが戻るまで待機し、残りのタスクを実行するために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:
....
私はこれが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が再び開いていることを検出できませんでした。しかし、その振る舞いを説明することはできません。 「状態」オプションが削除されると、プレイブックは期待どおりに機能し始めました。