Ansible操作例 – Cisco IOS XRの操作方法の説明

スポンサーリンク

AnsibleでCisco IOS XRを操作する方法を説明します。showコマンドの出力を得たい時はiosxr_commandを使用し、複数の設定を投入したい時はiosxr_configを使います。その他、冪等性を担保しつつ慎重な設定を行うiosxr_ntp, iosxr_systemなどのモジュールもあります。

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

showコマンドの実行

プレイブック作成

以下のようなプレイブックを作成します。

着目して欲しいのはregister句です。Ansibleは実行結果を変数に格納する事ができ、その変数名を定義するのがregister句です。以下のプレイブックは、「show version」の実行結果を変数「iosxr_result」に格納し、変数「iosxr_result」をdebugで出力する例です。

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

  tasks:
    - name: send show version
      iosxr_command:
        commands: "show version"
      register: iosxr_results
    - name: display show version
      debug:
        var: iosxr_results
EOF

戻り値の一覧

Ansibleは実行結果を変数に格納する事ができます。この実行結果をプログラミングの文脈では「戻り値」と呼ぶ事が多く、公式ドキュメントでは「Return Value」との表現を使っています。実行結果にどのような値が格納されているかは、公式ドキュメントをマニュアルを参照ください。この場合ならば、「iosxr command モジュール」に記載されています。

iosxr commandのマニュアル

実行結果

実行結果は以下のようになります。

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

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

TASK [send show version] *******************************************************
ok: [cisco61]

TASK [display show version] ****************************************************
ok: [cisco61] => {
    "iosxr_results": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "stdout": [
            "Cisco IOS XR Software, Version 6.3.1[Default]\nCopyright (c) 2017 by Cisco Systems, Inc.\n\nROM: GRUB, Version 1.99(0), DEV RELEASE\n\nR61 uptime is 2 hours, 14 minutes\nSystem image file is \"bootflash:disk0/xrvr-os-mbi-6.3.1/mbixrvr-rp.vm\"\n\ncisco IOS XRv Series (Pentium II Stepping 1) processor with 3145343K bytes of memory.\nPentium II Stepping 1 processor at 2462MHz, Revision 2.174\nIOS XRv Chassis\n\n3 GigabitEthernet\n1 Management Ethernet\n97070k bytes of non-volatile configuration memory.\n866M bytes of hard disk.\n2321392k bytes of disk0: (Sector size 512 bytes).\n\nConfiguration register on node 0/0/CPU0 is 0x2102\nBoot device on node 0/0/CPU0 is disk0:\nPackage active on node 0/0/CPU0:\niosxr-infra, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-infra-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-fwding, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-fwding-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-routing, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-routing-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-ce, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-ce-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-os-mbi, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-os-mbi-6.3.1\n    Built on Thu Sep 14 02:24:45 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-base, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-base-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-fwding, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-fwding-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-mgbl-x, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-mgbl-x-6.3.1\n    Built on Thu Sep 14 02:24:17 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-mpls, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-mpls-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-mgbl, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-mgbl-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-mcast, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-mcast-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-mcast-supp, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-mcast-supp-6.3.1\n    Built on Thu Sep 14 02:24:13 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-bng, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-bng-6.3.1\n    Built on Thu Sep 14 02:24:14 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-bng-supp, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-bng-supp-6.3.1\n    Built on Thu Sep 14 02:24:14 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\niosxr-security, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-security-6.3.1\n    Built on Thu Sep 14 02:24:09 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie\n\nxrvr-fullk9-x, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-fullk9-x-6.3.1\n    Built on Thu Sep 14 02:24:48 UTC 2017\n    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie"
        ],
        "stdout_lines": [
            [
                "Cisco IOS XR Software, Version 6.3.1[Default]",
                "Copyright (c) 2017 by Cisco Systems, Inc.",
                "",
                "ROM: GRUB, Version 1.99(0), DEV RELEASE",
                "",
                "R61 uptime is 2 hours, 14 minutes",
                "System image file is \"bootflash:disk0/xrvr-os-mbi-6.3.1/mbixrvr-rp.vm\"",
                "",
                "cisco IOS XRv Series (Pentium II Stepping 1) processor with 3145343K bytes of memory.",
                "Pentium II Stepping 1 processor at 2462MHz, Revision 2.174",
                "IOS XRv Chassis",
                "",
                "3 GigabitEthernet",
                "1 Management Ethernet",
                "97070k bytes of non-volatile configuration memory.",
                "866M bytes of hard disk.",
                "2321392k bytes of disk0: (Sector size 512 bytes).",
                "",
                "Configuration register on node 0/0/CPU0 is 0x2102",
                "Boot device on node 0/0/CPU0 is disk0:",
                "Package active on node 0/0/CPU0:",
                "iosxr-infra, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-infra-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-fwding, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-fwding-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-routing, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-routing-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-ce, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-ce-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-os-mbi, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-os-mbi-6.3.1",
                "    Built on Thu Sep 14 02:24:45 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-base, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-base-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-fwding, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-fwding-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-mgbl-x, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-mgbl-x-6.3.1",
                "    Built on Thu Sep 14 02:24:17 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-mpls, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-mpls-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-mgbl, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-mgbl-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-mcast, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-mcast-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-mcast-supp, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-mcast-supp-6.3.1",
                "    Built on Thu Sep 14 02:24:13 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-bng, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-bng-6.3.1",
                "    Built on Thu Sep 14 02:24:14 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-bng-supp, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-bng-supp-6.3.1",
                "    Built on Thu Sep 14 02:24:14 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "iosxr-security, V 6.3.1[Default], Cisco Systems, at disk0:iosxr-security-6.3.1",
                "    Built on Thu Sep 14 02:24:09 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie",
                "",
                "xrvr-fullk9-x, V 6.3.1[Default], Cisco Systems, at disk0:xrvr-fullk9-x-6.3.1",
                "    Built on Thu Sep 14 02:24:48 UTC 2017",
                "    By iox-lnx-052 in /auto/srcarchive11/production/6.3.1/xrvr/workspace for pie"
            ]
        ]
    }
}

PLAY RECAP *********************************************************************
cisco61                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

複数コマンドの実行

プレイブック作成

複数のコマンドを同時に投入したい時はiosxr_configモジュールを使用すると便利です。以下は5エントリのACLを作成する例です。

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

  tasks:
    - name: load new acl into device
      iosxr_config:
        lines:
          - 10 permit ip host 192.0.2.1 any log
          - 20 permit ip host 192.0.2.2 any log
          - 30 permit ip host 192.0.2.3 any log
          - 40 permit ip host 192.0.2.4 any log
          - 50 permit ip host 192.0.2.5 any log
        parents: ip access-list test
        before: no ip access-list test
        match: exact
EOF

プレイブック実行

プレイブックを実行すると以下のように出力されます。

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

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

TASK [load new acl into device] ************************************************
changed: [cisco61]

PLAY RECAP *********************************************************************
cisco61                    : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

プレイブック確認

確かにプレイブックで記載された設定が投入されている事を確認します。

RP/0/0/CPU0:R61# show ip access-lists test
Sat Aug 29 08:10:24.427 UTC
ipv4 access-list test
 10 permit ipv4 host 192.0.2.1 any log
 20 permit ipv4 host 192.0.2.2 any log
 30 permit ipv4 host 192.0.2.3 any log
 40 permit ipv4 host 192.0.2.4 any log
 50 permit ipv4 host 192.0.2.5 any log

テンプレートの利用

テンプレートの作成

Ansibleはテンプレートを作成し、そのテンプレートに記載されたconfigを流し込む事ができます。

以下にテンプレートの例を紹介します。ここで記載したテンプレートは静的なものですが、Ansibleが内部的に使うJinja2と呼ばれるテンプレートエンジンは変数読み込みや繰り返し処理も実装する事ができます。説明は省略しますが、JavaやRubyの実装経験がある人ならばJSP, ERBなどとほぼ同等機能と思って差支えございません。

cat << EOF > iosxr_template.j2
vrf VRF10
  address-family ipv4 unicast
!
interface GigabitEthernet0/0/0/0
  no shutdown
!
interface GigabitEthernet0/0/0/0.10
  encapsulation dot1q 10
  vrf VRF10
  ipv4 address 192.168.10.1/24
EOF

プレイブックの作成

テンプレートを流し込むプレイブックの例を紹介します。backupをyesとすると設定流し込み前の設定をバックアップする事もできます。

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

  tasks:
    - name: add ipv4 address
      iosxr_config:
        backup: yes
        src: iosxr_template.j2
EOF

テンプレート実行

プレイブックを実行すると以下のように出力されます。

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

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

TASK [add ipv4 address] ********************************************************
changed: [cisco61]

PLAY RECAP *********************************************************************
cisco61                    : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

プレイブック確認

確かにプレイブックで記載された設定が投入されている事を確認します。

RP/0/0/CPU0:R61#show ipv4 vrf VRF10 interface brief
Sat Aug 29 08:16:12.743 UTC

Interface                      IP-Address      Status                Protocol
GigabitEthernet0/0/0/0.10      192.168.10.1    Up                    Up
RP/0/0/CPU0:R61#

バックアップファイルの確認

Ansible実行前の設定がバックアップされている事を確認します。

# ls -l backup/
total 32
-rw------- 1 root root 13854 Aug 30 00:58 cisco62_config.2020-08-30@00:58:24
-rw------- 1 root root 13854 Aug 30 01:00 cisco62_config.2020-08-30@01:00:54

手堅い設定投入

概要

Ansibleは、前述のiosxr_command, iosxr_config以外のモジュールを使用する事を推奨しています。iosxr_logging, iosxr_systemなどのモジュールが該当し、これらは「冪等性」が担保されたモジュールです。

「冪等性」とは「再実行しても得られる結果が同じ」という意味ですが、私個人の見解としては、「一般的な意味の冪等性」と「Ansibleの文脈での冪等性」はニュアンスが異なると理解しています。前述のiosxr_configは何度実行しても「changed」と表示されますが、iosxr_logging, iosxr_systemなどのモジュールは設定変更が発生してない場合は「ok」のみが表示されます。Ansibleの文脈での「冪等性」とは、プレイブックを何度も実行するような運用において、changeなのかokなのかが目視チェックしやすい仕組みと理解した方が良いでしょう。

例えば、以下スクリーンショットならば、syslogサーバは設定変更されたもののDNSはそのままである事が一目瞭然です。

冪等性のあるAnsibleモジュールの実行例

上記のWARNINGは、Ansible Connectionモジュールはnetwork_cliではなくnetconfを使用するようにとの警告です。netconfを使用する方法は「Ansible操作例 – Cisco IOS XRでNETCONFを併用する方法」を参照ください。

プレイブック作成

NTPサーバとDNSサーバを設定する例を紹介します。

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] ********************************
[DEPRECATION WARNING]: cli support for 'iosxr_logging' is deprecated. Use
transport netconf instead. This feature will be removed in version 2.9.
Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
changed: [cisco61]

TASK [configure name servers] **************************************************
[DEPRECATION WARNING]: cli support for 'iosxr_system' is deprecated. Use
transport netconf instead. This feature will be removed in version 2.9.
Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
changed: [cisco61]

PLAY RECAP *********************************************************************
cisco61                    : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

プレイブック確認

確かにプレイブックで記載された設定が投入されている事を確認します。

RP/0/0/CPU0:R61#show running-config | include "name-server"
Sat Aug 29 08:29:54.677 UTC
Building configuration...
domain name-server 8.8.8.8
domain name-server 8.8.4.4
RP/0/0/CPU0:R61#
RP/0/0/CPU0:R61#show logging
Sat Aug 29 08:28:50.941 UTC
Syslog logging: enabled (0 messages dropped, 0 flushes, 0 overruns)
    Console logging: level warnings, 10 messages logged
    Monitor logging: level debugging, 0 messages logged
    Trap logging: level informational, 0 messages logged
    Logging to 10.10.10.1, 0 message lines logged
    Buffer logging: level debugging, 100 messages logged

 <omitted>

タイトルとURLをコピーしました