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