■ はじめに
Ansible のネットワークモジュールは、通常のモジュールとは facts の扱いが異なります。 この記事では、ネットワークモジュール固有の facts の扱い方についてご紹介します。 想定バージョンは Ansible 2.5.2 です。
- [2019/11/14追記]
- Ansible 2.9 からの挙動はこちら
■ 通常の facts は ネットワーク機器側ではなく Ansible ホスト側
ios_command 、junos_config などのネットワークモジュールは、Ansible ホスト側で Python スクリプトが実行されます。
そのため、 gather_facts: yes (デフォルト) で取得される facts は、操作対象のネットワーク機器側ではなく、Ansible ホスト側の facts になります。
■ ネットワーク機器側の facts は専用モジュールで取得
ネットワーク機器側のホスト名や、インターフェース情報などの facts を取得するにためには、 ios_facts や junos_facts など、ネットワークプラットフォームごとに用意された専用の *_facts モジュールを利用します。
サンプルPlaybook
Junosの facts を取得するjunos_facts モジュールを利用するサンプルです。
gather_subset オプションを省略した場合は、コンフィグ以外の facts を取得します。
- hosts: junos connection: netconf gather_facts: no tasks: - name: facts junos_facts: - name: debug debug: msg: "{{ ansible_facts }}"
ここでは、Ansible ホスト側の facts は必要ないとしているので、 gather_facts: no にしています。
また、msg: "{{ ansible_facts }}" と指定しているように、Ansible 2.5 から facts は ansible_facts.* という名前空間配下でも参照可能です。
実行結果
(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory junos_test.yml --tag=d
PLAY [junos] *************************************************************************************************
TASK [facts] *************************************************************************************************
ok: [172.16.0.1]
TASK [debug] *************************************************************************************************
ok: [172.16.0.1] => {
"msg": {
"net_filesystems": [
"/dev/ad0s1a",
"devfs",
"/dev/md0",
"/cf",
"devfs",
"procfs",
"/dev/bo0s1e",
"/dev/md1",
"/cf/var/jail",
"/cf/var/log",
"devfs",
"/dev/md2"
],
"net_gather_subset": [
"hardware",
"default",
"interfaces"
],
"net_has_2RE": false,
"net_hostname": "vsrx1",
"net_interfaces": {
".local.": {
"admin-status": "up",
"macaddress": "Unspecified",
"mtu": "Unlimited",
"oper-status": "up",
"speed": "Unlimited",
"type": "Loopback"
},
"dsc": {
"admin-status": "up",
"macaddress": "Unspecified",
"mtu": "Unlimited",
"oper-status": "up",
"speed": "Unspecified",
"type": "Software-Pseudo"
},
"ge-0/0/0": {
"admin-status": "up",
"macaddress": "08:00:27:ae:**:**",
"mtu": "1514",
"oper-status": "up",
"speed": "1000mbps",
"type": null
},
"ge-0/0/1": {
"admin-status": "up",
"macaddress": "08:00:27:af:**:**",
"mtu": "1514",
"oper-status": "up",
"speed": "1000mbps",
"type": null
},
(略)
}
},
"net_memfree_mb": 76448,
"net_memtotal_mb": 1031572,
"net_model": "firefly-perimeter",
"net_modules": [
{
"name": "Midplane"
},
{
"name": "System IO"
},
{
"description": "FIREFLY-PERIMETER RE",
"name": "Routing Engine"
},
{
"description": "Virtual FPC",
"name": "FPC 0"
},
{
"name": "Power Supply 0"
}
],
"net_routing_engines": {
"null": {
"cpu_background": "0",
"cpu_idle": "100",
"cpu_interrupt": "0",
"cpu_system": "0",
"cpu_user": "0",
"last_reboot_reason": "Router rebooted after a normal shutdown.",
"load_average_fifteen": "0.00",
"load_average_five": "0.02",
"load_average_one": "0.00",
"memory_control_plane": "594",
"memory_control_plane_used": "321",
"memory_control_plane_util": "54",
"memory_data_plane": "430",
"memory_data_plane_used": "211",
"memory_data_plane_util": "49",
"memory_system_total": "1024",
"memory_system_total_used": "532",
"memory_system_total_util": "52",
"model": "FIREFLY-PERIMETER RE",
"slot": null,
"start_time": "2018-04-11 13:23:07 UTC",
"status": "Testing",
"up_time": "1 day, 17 hours, 40 minutes, 58 seconds"
}
},
"net_serialnum": "a9039f******",
"net_version": null
}
}
PLAY RECAP ***************************************************************************************************
172.16.0.1 : ok=2 changed=0 unreachable=0 failed=0
(ansible25) [vagrant@centos7 vagrant]$
ホスト名 vsrx1 や、インターフェースの情報などが facts として取得できたことが分かります。
■ 補足
https://www.ansible.com/blog/coming-soon-networking-features-in-ansible-2.5 上記の Ansible 2.5 正式リリース前の公式ブログに、
Fact gathering for network_cli and netconf connection methods are not turned on by default.
という記述がありますが、実際は異なるようです。ネットワークモジュールのベストプラクティスはあくまでも、必要でない限りは、gather_facts: no を指定しておくことのようです。