web-dev-qa-db-ja.com

再起動が完了したことをテストするにはどうすればよいですか?

現在、ベアメタルやVMなどをプロビジョニングするインフラストラクチャ管理ツールを構築しています。SSH経由でリモートノードでコマンドを(ansible経由で)実行するワーカーVM)があります。

手順の1つでは、一部の構成を適用するためにノードを再起動する必要があります。再起動が完了した後、ワーカープロセスはノードでさらにコマンドを実行する必要があります(同期的に実行する必要があります)。

私の質問は、再起動が完了したかどうかを確認するにはどうすればよいですか?

スリープタイマーを追加することもできますが(再起動が完了するまで待つため)、それはいくつかの理由で悪い解決策だと思います。

もう1つのオプションは、ワーカープロセスからリモートノードへのSSHを5秒ごとに試行することです。失敗した場合は、接続が成功するまで再試行を続けます。

これを行う別の方法はありますか?

3
grizzthedj

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
...
1
Sethos II