てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ansible-playbook コマンドの -l オプションで除外ホストを指定する方法

はじめに

Ansible には、対象ホストを制限するためパターンの記法があります。この記法は、Playbook 内の hosts: <pattern> にしか指定できないと思っていたのですが、ansible-playbook コマンドの -l オプション にも利用できるようです。

この記事では、ansible-playbook コマンドの -l オプションで、除外ホストを指定する方法(-l '!除外ホスト')をご紹介します。

  • 動作確認環境
    • Ansible 2.9.4


Playbook の準備

サンプルとして利用する Playbook は以下の通りです。

- 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 グループに所属する ios1ios2ios3 の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 は対象とならず、ios1ios3 のみが対象となりました。


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