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