Ansible操作例 – Cisco IOS XRでNETCONFを併用する方法

スポンサーリンク

AnsibleでCisco IOS XRをNETCONFで接続して操作する方法を説明します。2020年時点では多くのネットワーク機器はpythonのparamikoモジュールで操作するのが殆どですが、徐々にNETCONF, RESTCONFへの移行が始まりつつあります。中でも先進的なIOS XRやJUNOS OSはNETCONF, RESTCONFでの接続が推奨されています。

Cisco IOS XRへの接続方法が分からない方は「Ansible操作例 – Cisco IOS XRへの接続方法の説明」を参照ください。

事前準備

Cisco IOS XR – NETCONFの有効化

Cisco IOS XRでNETCONFを有効にするには以下のコマンドを投入します。

netconf-yang agent ssh
!
ssh server v2
ssh server netconf port 830
ssh server netconf vrf default

NETCONFの接続確認

NETCONFはSSHの上でXMLメッセージを授受する通信プロトコルです。sshコマンドによる動作確認も可能で、以下のように「-p 830」と「-s netconf」オプションを付与する事でNETCONFによる通信が可能です。

もし、Cisco IOSからXMLのメッセージを受信できれば、NETCONFが有効になっている確認になります。

(venv-ans28) [root@ansible70 ansible]# ssh 192.168.9.61 -l cisco -p 830 -s netconf

 <ommited>

Password:
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
 <capabilities>
  <capability>urn:ietf:params:netconf:base:1.1</capability>
  <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
  <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
  <capability>urn:ietf:params:netconf:capability:validate:1.1</capability>
  <capability>urn:ietf:params:netconf:capability:confirmed-commit:1.1</capability>

ncclient

AnsibleでNETCONFによる接続を行うためには、pythonのncclientモジュールが必要です。

pip install ncclient

インベントリファイル

NETCONFを使用する場合は、ansible_connectionに「netconf」を使用します。

cat << EOF > inventory.ini
[cisco_iosxr:vars]
ansible_user = 'cisco'
ansible_password = 'cisco'
ansible_connection = 'netconf'
ansible_network_os = 'iosxr'
ansible_python_interpreter = '/root/venv-ans28/bin/python'

[cisco_iosxr]
cisco61 ansible_host=192.168.9.61
EOF

Ansible Connectionでnetconfやlocalを指定する時は、ローカルホストにpythonスクリプトを転送してそれを実行する挙動になります。このpythonスクリプトのインタプリタは”/usr/bin/env python”で探索されるpythonです。

ここで注意が必要なのは、venvで指定したpythonと異なるpythonが呼び出される可能性がある事です。もし、venvで指定したpythonと同一のpythonを呼び出したいならば、変数ansible_python_interpreterを明示指定するようにしましょう。

IOS XRだけでなく、BIG-IPやkubernetesを操作する時も同様のトラブルが発生しやすい事に注意ください。

NETCONF動作確認

動作確認のため、以下のようなプレイブックを用意します。

cat << EOF > cisco_iosxr_modify_iosxr_services.yml
---
- hosts: cisco_iosxr
  gather_facts: no

  tasks:
    - name: configure logging for syslog server host
      iosxr_logging:
        dest: host
        name: 10.10.10.1
        level: critical
        state: present
    - name: configure name servers
      iosxr_system:
        name_servers:
          - 8.8.8.8
          - 8.8.4.4
EOF

プレイブックの実行結果は以下の通りです。

# ansible-playbook -i inventory.ini cisco_iosxr_modify_iosxr_services.yml

PLAY [cisco_iosxr] *************************************************************

TASK [configure logging for syslog server host] ********************************
ok: [cisco61]

TASK [configure name servers] **************************************************
ok: [cisco61]

PLAY RECAP *********************************************************************
cisco61                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
タイトルとURLをコピーしました