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
..インベントリ (Ansiblehosts
ファイル) 内。
これにより、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
ことに注意してください。