GNU/Linux >> Linux の 問題 >  >> Linux

Ansibleを使用してサーバーの再起動を待つ方法は?

2018 アップデート

2.3 以降、Ansible には wait_for_connection が同梱されています。 まさにこの目的に使用できるモジュールです。

#
## Reboot
#

- name: (reboot) Reboot triggered
  command: /sbin/shutdown -r +1 "Ansible-triggered Reboot"
  async: 0
  poll: 0

- name: (reboot) Wait for server to restart
  wait_for_connection:
    delay: 75

shutdown -r +1 は、リターン コード 1 が返されないようにし、タスクを失敗させることができます。シャットダウンは非同期タスクとして実行されるため、wait_for_connection を遅らせる必要があります。 少なくとも 60 秒のタスク。 75 は、これらのスノーフレーク ケースのバッファーを提供します。

wait_for_connection - リモート システムが到達可能/使用可能になるまで待機します


1.9.4で得た最も信頼できるものは次のとおりです(これは更新され、元のバージョンは下部にあります):

- name: Example ansible play that requires reboot
  sudo: yes
  gather_facts: no
  hosts:
    - myhosts
  tasks:
    - name: example task that requires reboot
      yum: name=* state=latest
      notify: reboot sequence
  handlers:
    - name: reboot sequence
      changed_when: "true"
      debug: msg='trigger machine reboot sequence'
      notify:
        - get current time
        - reboot system
        - waiting for server to come back
        - verify a reboot was actually initiated
    - name: get current time
      command: /bin/date +%s
      register: before_reboot
      sudo: false
    - name: reboot system
      shell: sleep 2 && shutdown -r now "Ansible package updates triggered"
      async: 1
      poll: 0
      ignore_errors: true
    - name: waiting for server to come back
      local_action: wait_for host={{ inventory_hostname }} state=started delay=30 timeout=220
      sudo: false
    - name: verify a reboot was actually initiated
      # machine should have started after it has been rebooted
      shell: (( `date +%s` - `awk -F . '{print $1}' /proc/uptime` > {{ before_reboot.stdout }} ))
      sudo: false

async に注意してください オプション。 1.8 と 2.0 は 0 で動作する可能性があります しかし、1.9 はそれを望んでいます 1 .上記は、マシンが実際に再起動されたかどうかも確認します。再起動に失敗し、失敗の兆候がなかったタイプミスがあったため、これは良いことです。

大きな問題は、マシンが起動するのを待っていることです。このバージョンは 330 秒間そこに留まり、それ以前にホストへのアクセスを試みることはありません。他のいくつかの回答では、ポート 22 の使用が提案されています。これらの両方が当てはまる場合、これは適切です:

  • 機械に直接アクセスできます
  • ポート 22 が開くとすぐにマシンにアクセスできます

これらは常に正しいとは限らないため、5 分間の計算時間を無駄にすることにしました。時間を無駄にしないように、実際にホストの状態をチェックするように wait_for モジュールを拡張できることを願っています。

ところで、ハンドラーを使用することを提案する答えはいいです。私からのハンドラーの+1(およびハンドラーを使用するように回答を更新しました)。

これは元のバージョンですが、あまり良くなく、信頼性も高くありません:

- name: Reboot
  sudo: yes
  gather_facts: no
  hosts:
    - OSEv3:children
  tasks:
    - name: get current uptime
      shell: cat /proc/uptime | awk -F . '{print $1}'
      register: uptime
      sudo: false
    - name: reboot system
      shell: sleep 2 && shutdown -r now "Ansible package updates triggered"
      async: 1
      poll: 0
      ignore_errors: true
    - name: waiting for server to come back
      local_action: wait_for host={{ inventory_hostname }} state=started delay=30 timeout=300
      sudo: false
    - name: verify a reboot was actually initiated
      # uptime after reboot should be smaller than before reboot
      shell: (( `cat /proc/uptime | awk -F . '{print $1}'` < {{ uptime.stdout }} ))
      sudo: false

Ansible>=2.7 (2018 年 10 月にリリース)

組み込みの再起動モジュールを使用します:

- name: Wait for server to restart
  reboot:
    reboot_timeout: 3600

アンシブル <2.7

タスクとして再開

- name: restart server
  shell: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
  async: 1
  poll: 0
  become: true

これにより、シェル コマンドが非同期タスクとして実行されるため、Ansible はコマンドの終了を待機しません。通常 async param はタスクの最大時間を poll として指定します が 0 に設定されている場合、コマンドが終了した場合、Ansible は決してポーリングしません。これにより、このコマンドは「ファイア アンド フォーゲット」になります。 shutdown の前後にスリープします Ansible がまだリモート ホストに接続されている間、再起動中に SSH 接続が切断されないようにするためのものです。

タスクとして待機

以下を使用できます:

- name: Wait for server to restart
  local_action:
    module: wait_for
      host={{ inventory_hostname }}
      port=22
      delay=10
    become: false

..しかし、 {{ ansible_ssh_host }} を使用することを好むかもしれません ホスト名および/または {{ ansible_ssh_port }} としての変数 次のようなエントリを使用する場合の SSH ホストおよびポートとして:

hostname         ansible_ssh_host=some.other.name.com ansible_ssh_port=2222 

..インベントリ内 (Ansible hosts ファイル)

これにより、Ansible を実行しているマシンで wait_for タスクが実行されます。このタスクは、リモート ホストでポート 22 が開かれるのを待ち、10 秒後に開始します。

再起動してハンドラーとして待機

しかし、これらの両方をタスクではなくハンドラーとして使用することをお勧めします。

これを行う主な理由は 2 つあります:

  • コードの再利用 - 多くのタスクにハンドラーを使用できます。 例: タイムゾーンの変更後およびカーネルの変更後にサーバーの再起動をトリガーする

  • 一度だけトリガーする - いくつかのタスクにハンドラーを使用し、それらの複数が何らかの変更を行う場合 => ハンドラーをトリガーすると、ハンドラーが行うことは一度だけ発生します。 例: httpd 構成の変更と SSL 証明書の更新に httpd 再起動ハンドラーが関連付けられている場合、構成と SSL 証明書の両方が変更された場合、httpd は 1 回だけ再起動されます。

ハンドラーの詳細については、こちらをご覧ください。

再起動し、ハンドラとして再起動を待機しています:

  handlers:

    - name: Restart server
      command: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
      async: 1
      poll: 0
      ignore_errors: true
      become: true

    - name: Wait for server to restart
      local_action:
        module: wait_for
          host={{ inventory_hostname }}
          port=22
          delay=10
        become: false

..そして、このように順番にタスクで使用します。ここでは、サーバー ハンドラーの再起動と組み合わせて使用​​します。

  tasks:
    - name: Set hostname
        hostname: name=somename
        notify:
          - Restart server
          - Wait for server to restart

ハンドラは、notify にリストされている順序ではなく、定義されている順序で実行されることに注意してください。 !


wait_for タスクを local_action として実行するように変更し、待機しているホストを指定する必要があります。例:

- name: Wait for server to restart
  local_action:
    module: wait_for
      host=192.168.50.4
      port=22
      delay=1
      timeout=300

Linux
  1. 自動化のためにAnsibleとanacronを使用する方法

  2. 安全なファイル転送のためにFileZillaを使用してSFTPに接続する方法

  3. Ansibleを使用してLinuxユーザーを作成する方法

  1. Ansibleを使用してDebian/UbuntuLinuxを更新/アップグレードする方法

  2. 別のサーバーを使用してサーバーにSSH接続する方法は??

  3. SSH サーバーが起動するのを待つ Linux コマンド

  1. Ansibleを使用してUbuntu20.04にRedis6をインストールおよび構成する方法

  2. コマンドラインを使用してLinuxを再起動する方法

  3. s_client を使用してサーバーに文字列を送信する方法