■ はじめに
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 のバージョン情報
が入り、異なるものになります。