現在、ベアメタルやVMなどをプロビジョニングするインフラストラクチャ管理ツールを構築しています。SSH経由でリモートノードでコマンドを(ansible経由で)実行するワーカーVM)があります。
手順の1つでは、一部の構成を適用するためにノードを再起動する必要があります。再起動が完了した後、ワーカープロセスはノードでさらにコマンドを実行する必要があります(同期的に実行する必要があります)。
私の質問は、再起動が完了したかどうかを確認するにはどうすればよいですか?
スリープタイマーを追加することもできますが(再起動が完了するまで待つため)、それはいくつかの理由で悪い解決策だと思います。
もう1つのオプションは、ワーカープロセスからリモートノードへのSSHを5秒ごとに試行することです。失敗した場合は、接続が成功するまで再試行を続けます。
これを行う別の方法はありますか?
Ansibleを介してコマンドを実行しているとおっしゃっていましたが、これがプレイブックの再起動に使用するものです(Ubuntu 14/16.04マシンを管理しています)。
---
# execute like:
# ansible-playbook reboot.yaml --inventory hosts --extra-vars "hosts=all user=admin"
# or
# ansible-playbook reboot.yaml -i hosts -e "hosts=all user=admin"
- hosts: "{{ hosts }}"
remote_user: "{{ user }}"
become: yes
tasks:
# add this to to guard you from yourself ;)
#- name: "ask for verification"
# pause:
# Prompt: "Are you sure you want to restart all specified hosts?"
# here comes the juicy part
- name: "reboot hosts"
Shell: "sleep 2 && shutdown -r now 'Reboot triggered by Ansible'" # sleep 2 is needed, else this task might fail
async: "1" # run asynchronously
poll: "0" # don't ask for the status of the command, just fire and forget
ignore_errors: yes # this command will get cut off by the reboot, so ignore errors
- name: "wait for hosts to come up again"
wait_for:
Host: "{{ inventory_hostname }}"
port: "22" # wait for ssh as this is what is needed for ansible
state: "started"
delay: "120" # start checking after this amount of time
timeout: "360" # give up after this amount of time
delegate_to: "localhost" # check from the machine executing the playbook
...
Ansible 2.7には reboot module があるので、自分でコマンドを作成する必要はありません。上からのプレイブックはこれに翻訳されます:
---
# execute like:
# ansible-playbook reboot.yaml --inventory hosts --extra-vars "hosts=all user=admin"
# or
# ansible-playbook reboot.yaml -i hosts -e "hosts=all user=admin"
- hosts: "{{ hosts }}"
remote_user: "{{ user }}"
become: yes
tasks:
# add this to to guard you from yourself ;)
#- name: "ask for verification"
# pause:
# Prompt: "Are you sure you want to restart all specified hosts?"
- name: "reboot hosts"
reboot:
msg: "Reboot triggered by Ansible"
reboot_timeout: 360
...