■ はじめに
Ansible には junos_facts
という Juniper Junos の機器のファクトを収集するモジュールがあります。
通常であれば、 ansible_net_version
または、 ansible_facts.net_version
という変数で、Junos のバージョンを取得できるのですが、(そそらく)古いバージョンの Junos の場合は取得できません。
この記事では、どうにかして取得する方法をご紹介します。
動作確認環境: Ansible 2.6.2
(junos_facts
モジュールの gather_subest
オプションで ofacts
を指定できる Ansible 2.6.2以上のバージョンである必要があります。 )
■ 正常に取得できる場合
Junos の 15.1F4.15 というバージョンでの確認です。
- Playbook
- hosts: junos gather_facts: no tasks: - junos_facts: - name: ansible_net_version debug: var=ansible_net_version - name: ansible_facts.net_version debug: var=ansible_facts.net_version vars: ansible_connection: netconf ansible_network_os: junos ansible_user: testuser ansible_ssh_pass: testpass
- 実行
TASK [ansible_facts.net_version] *********************************************** ok: [172.16.0.15]] => { "msg": "15.1F4.15" } TASK [ansible_net_version] ***************************************************** ok: [172.16.0.15] => { "msg": "15.1F4.15" }
無事にバージョン情報が取得できました。
■ 取得できない場合
一方、Junos の 12.1X47-D15.4 というバージョンでの確認です。(vsrxのvagrant box)
先ほどと同じ Playbook を実行します。
- 実行
TASK [ansible_facts.net_version] *********************************************** ok: [172.16.0.1] => { "msg": "" } TASK [ansible_net_version] ***************************************************** ok: [172.16.0.1] => { "msg": null }
空文字や null
になってしまいました。
対策
junos_facts
モジュールの、どのようなファクトを取得するか指定するオプション gather_subset
で ofacts
を指定します。
この指定により「old style facts」(ドキュメント上の表記)を取得できるようになります。このオプションのデフォルトは ['!config', '!ofacts']
なので、ofacts
は含まれません。(!
は否定表現)
また、この ofacts
を取得する場合は、 junos_facts
モジュールに provider
オプションによる、認証情報の指定が必要になります。Ansible 2.5 からこの指定方法は推奨はされていませんが、制約がある以上は仕方なしとします。
- hosts: junos gather_facts: no tasks: - name: gather junos facts junos_facts: gather_subset: ofacts # point! provider: host: "{{ inventory_hostname }}" username: "{{ ansible_user }}" password: "{{ ansible_ssh_pass }}" - name: ansible_facts.version debug: msg: "{{ ansible_facts.version }}" vars: ansible_connection: netconf ansible_network_os: junos ansible_user: testuser ansible_ssh_pass: testpass
- 実行
TASK [ansible_facts.version] ****************************************************************** ok: [172.16.0.1] => { "msg": "12.1X47-D15.4" }
無事、ansible_facts.version
という変数名で Junos のバージョン情報が取得できました。
注意点
ansible_version と ansible_facts.version が別物に
Ansible 2.5 で ファクト は ansible_facts.* という名前空間でも参照できるようになりました。 https://www.ansible.com/blog/ansible-2.5-traveling-space-and-time
そのため、通常であれば ansible_hogehoge
と ansible_facts.hogehoge
は同じ値になるはずですが、今回のケースでは、
ansible_version
にはコントロールノードの Ansible のバージョン情報ansible_facts.version
には Junos のバージョン情報
が入り、異なるものになります。