はじめに
group_by
モジュールは、Playbook 実行中に動的にグループ化できます。
用途は色々考えられますが、この記事では、複数台の Cisco IOS 機器のバージョンを収集した上で、特定のバージョン飲みを対象とする Play を実行する例をご紹介します。
インベントリファイル
以下の3台です。参考までに各機器のバージョンをコメントで記載します(変数ではありません)。
[cml]
ios01 ansible_host=192.168.1.11 # 15.9(3)M2
ios02 ansible_host=192.168.1.12 # 15.9(3)M2
iosxe01 ansible_host=192.168.1.13 # 17.03.01a
この3台の中で、17系である、iosxe01 に絞る Playbook を作ります。
Playbook
最初の Play で facts を収集して、その中の ansible_facts.net_version
をキーにしてグループ化します。
次の Playbook で グループ ios17
のみを対象としたタスクを実行します。ここではただ facts を表示するだけです。
バージョンは 17.03.01a
であれば 17
、15.9(3)M2
であれば 15
のように、系で扱うことにします。
---
- hosts: cml
gather_facts: false
tasks:
- name: gather facts
ios_facts:
gather_subset:
- min
- name: group by verion
group_by:
key: "ios{{ ansible_facts.net_version | regex_replace('^([0-9]+)\\..+$', '\\1') }}"
- hosts: ios17
gather_facts: false
tasks:
- debug:
msg: "{{ ansible_facts }}"
実行
Playbook を実行します。2つめの Playbook で 17 系である iosxe01
のみが実行対象になっていることが分かります。
$ ansible-playbook -i inventory.ini group_by.yml
PLAY [cml] ***********************************************************************************************
TASK [gather facts] **************************************************************************************
[WARNING]: default value for `gather_subset` will be changed to `min` from `!config` v2.11 onwards
ok: [iosxe01]
ok: [ios01]
ok: [ios02]
TASK [group by verion] ***********************************************************************************
changed: [ios01]
changed: [ios02]
changed: [iosxe01]
PLAY [ios17] *********************************************************************************************
TASK [debug] *********************************************************************************************
ok: [iosxe01] => {
"msg": {
"net_api": "cliconf",
"net_gather_network_resources": [],
"net_gather_subset": [
"default"
],
"net_hostname": "iosxe01",
"net_image": "bootflash:packages.conf",
"net_iostype": "IOS-XE",
"net_model": "CSR1000V",
"net_python_version": "3.6.7",
"net_serialnum": "XXXXXXXX",
"net_system": "ios",
"net_version": "17.03.01a",
"network_resources": {}
}
}
PLAY RECAP ***********************************************************************************************
ios01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ios02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
iosxe01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
なお、ansible-playbook
コマンドに -v
をつけて実行すると、group_by
モジュールどのようにグループ化された確認できます。
TASK [group by verion] **********************************************************************
changed: [ios01] => {"add_group": "ios15", "changed": true, "parent_groups": ["all"]}
changed: [iosxe01] => {"add_group": "ios17", "changed": true, "parent_groups": ["all"]}
changed: [ios02] => {"add_group": "ios15", "changed": true, "parent_groups": ["all"]}
おわりに
対象ホストを絞るときに、when
で条件を付けることがあると思いますが、場合によってはこのように動的にグループ化して Play を分けたほうがよいケースもあるかもしれません。