てくなべ (tekunabe)

ansible / network automation / 学習メモ

【Ansible】junos_facts でバージョン情報が取得できない場合の対処

■ はじめに

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_subsetofacts を指定します。

この指定により「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_hogehogeansible_facts.hogehoge は同じ値になるはずですが、今回のケースでは、

  • ansible_version にはコントロールノードの Ansible のバージョン情報
  • ansible_facts.version には Junos のバージョン情報

が入り、異なるものになります。