はじめに
Ansible には、対象ホストを制限するためパターンの記法があります。この記法は、Playbook 内の hosts: <pattern> にしか指定できないと思っていたのですが、ansible-playbook コマンドの -l オプション にも利用できるようです。
この記事では、ansible-playbook コマンドの -l オプションで、除外ホストを指定する方法(-l '!除外ホスト')をご紹介します。
- 動作確認環境
- Ansible 2.9.4
Playbook の準備
サンプルとして利用する Playbook は以下の通りです。
- ios_show.yml
- hosts: ios gather_facts: no tasks: - name: show command test ios_command: commands: - show version register: result - name: debug debug: msg: "{{ result.stdout_lines[0] }}"
hosts で指定している ios は、以下のインベントリファイルの ios グループを指します。3つのホストが所属しています。
[ios] ios1 ansible_host=10.0.1.254 ios2 ansible_host=10.0.2.254 ios3 ansible_host=10.0.3.254
別途、ansible_connetcion や認証情報を定義した変数ファイルも用意します。
Playbook の実行
-l オプション無しで実行すると、ios グループに所属する ios1、ios2、ios3 の3つホストが対象になります。
ここでは、 ios2 を除外するように -l オプションを指定します。
除外の指定は !除外ホスト のように、頭に ! を付けます。さらに、シェルに通常の文字列だと認識させるために、シングルクォート(') で囲います。
コマンド全体は以下の通りです。
ansible-playbook -i inventory.ini ios_show.yml -l '!ios2'
実行結果
$ ansible-playbook -i inventory.ini ios_show.yml -l '!ios2'
PLAY [ios] ********************************************************************************************************
TASK [show command test] ******************************************************************************************
ok: [ios3]
ok: [ios1]
TASK [debug] ******************************************************************************************************
ok: [ios1] => {
"msg": [
"Cisco IOS XE Software, Version 16.11.01a",
"...(略)..."
"Configuration register is 0x2102"
]
}
ok: [ios3] => {
"msg": [
"Cisco IOS XE Software, Version 16.09.03",
...(略)...
"Configuration register is 0x2102"
]
}
PLAY RECAP ********************************************************************************************************
ios1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ios3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
除外ホストとして指定した ios2 は対象とならず、ios1、ios3 のみが対象となりました。
Playbook を実行せずに対象ホストを確認する
ホストパターンは様々な書き方ができるので「この書き方で意図した通の制限ができているだろうか」と不安になるかもしれません。
そんな時は ansilbe-playbook コマンドの --list-hosts オプションを併用すると便利です。Playbook は実行せずに、対象ホストを確認できます。
以下、実行例です。
$ ansible-playbook -i inventory.ini ios_show.yml -l '!ios2' --list-hosts
playbook: ios_show.yml
play #1 (ios): ios TAGS: []
pattern: ['ios']
hosts (2):
ios3
ios1
ios2 が除外されていることが分かります。
さいごに
ansible-playbook コマンドで、-l (または --limit) オプションでパターンを指定できると、Playbook やインベントリファイルを修正せずに、柔軟に実行対象を指定できるので、便利だと思いました。