はじめに
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 やインベントリファイルを修正せずに、柔軟に実行対象を指定できるので、便利だと思いました。