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

スポンサーリンク

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

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

showコマンドの実行

プレイブック作成

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

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

cat << EOF > cisco_ios_show_version.yml
---
- hosts: cisco_ios
  gather_facts: no

  tasks:
    - name: send show version
      ios_command:
        commands: "show version"
      register: ios_results
    - name: display show version
      debug:
        var: ios_results
EOF

戻り値の一覧

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

ios commandのマニュアル

実行結果

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

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

PLAY [cisco_ios] ***************************************************************

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

TASK [display show version] ****************************************************
ok: [cisco60] => {
    "ios_results": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "stdout": [
            "Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.8(3)M2, RELEASE SOFTWARE (fc2)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2019 by Cisco Systems, Inc.\nCompiled Thu 28-Mar-19 14:06 by prod_rel_team\n\n\nROM: Bootstrap program is IOSv\n\nR60 uptime is 45 minutes\nSystem returned to ROM by reload\nSystem image file is \"flash0:/vios-adventerprisek9-m\"\nLast reload reason: Unknown reason\n\n\n\nThis product contains cryptographic features and is subject to United\nStates and local country laws governing import, export, transfer and\nuse. Delivery of Cisco cryptographic products does not imply\nthird-party authority to import, export, distribute or use encryption.\nImporters, exporters, distributors and users are responsible for\ncompliance with U.S. and local country laws. By using this product you\nagree to comply with applicable laws and regulations. If you are unable\nto comply with U.S. and local laws, return this product immediately.\n\nA summary of U.S. laws governing Cisco cryptographic products may be found at:\nhttp://www.cisco.com/wwl/export/crypto/tool/stqrg.html\n\nIf you require further assistance please contact us by sending email to\nexport@cisco.com.\n\nCisco IOSv (revision 1.0) with  with 460137K/62464K bytes of memory.\nProcessor board ID 9YNM25EDN0D3OOBWAV79W\n4 Gigabit Ethernet interfaces\nDRAM configuration is 72 bits wide with parity disabled.\n256K bytes of non-volatile configuration memory.\n2097152K bytes of ATA System CompactFlash 0 (Read/Write)\n0K bytes of ATA CompactFlash 1 (Read/Write)\n11217K bytes of ATA CompactFlash 2 (Read/Write)\n0K bytes of ATA CompactFlash 3 (Read/Write)\n\n\n\nConfiguration register is 0x0"
        ],
        "stdout_lines": [
            [
                "Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.8(3)M2, RELEASE SOFTWARE (fc2)",
                "Technical Support: http://www.cisco.com/techsupport",
                "Copyright (c) 1986-2019 by Cisco Systems, Inc.",
                "Compiled Thu 28-Mar-19 14:06 by prod_rel_team",
                "",
                "",
                "ROM: Bootstrap program is IOSv",
                "",
                "R60 uptime is 45 minutes",
                "System returned to ROM by reload",
                "System image file is \"flash0:/vios-adventerprisek9-m\"",
                "Last reload reason: Unknown reason",
                "",
                "",
                "",
                "This product contains cryptographic features and is subject to United",
                "States and local country laws governing import, export, transfer and",
                "use. Delivery of Cisco cryptographic products does not imply",
                "third-party authority to import, export, distribute or use encryption.",
                "Importers, exporters, distributors and users are responsible for",
                "compliance with U.S. and local country laws. By using this product you",
                "agree to comply with applicable laws and regulations. If you are unable",
                "to comply with U.S. and local laws, return this product immediately.",
                "",
                "A summary of U.S. laws governing Cisco cryptographic products may be found at:",
                "http://www.cisco.com/wwl/export/crypto/tool/stqrg.html",
                "",
                "If you require further assistance please contact us by sending email to",
                "export@cisco.com.",
                "",
                "Cisco IOSv (revision 1.0) with  with 460137K/62464K bytes of memory.",
                "Processor board ID 9YNM25EDN0D3OOBWAV79W",
                "4 Gigabit Ethernet interfaces",
                "DRAM configuration is 72 bits wide with parity disabled.",
                "256K bytes of non-volatile configuration memory.",
                "2097152K bytes of ATA System CompactFlash 0 (Read/Write)",
                "0K bytes of ATA CompactFlash 1 (Read/Write)",
                "11217K bytes of ATA CompactFlash 2 (Read/Write)",
                "0K bytes of ATA CompactFlash 3 (Read/Write)",
                "",
                "",
                "",
                "Configuration register is 0x0"
            ]
        ]
    }
}

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

複数コマンドの実行

プレイブック作成

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

# cat << EOF > cisco_ios_add_acl_entry.yml
---
- hosts: cisco_ios
  gather_facts: no

  tasks:
    - name: load new acl into device
      ios_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 extended test
        before: no ip access-list extended test
        match: exact
EOF

プレイブック実行

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

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

PLAY [cisco_ios] ************************************************************************************************************************************************************************************

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

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

プレイブック確認

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

R60#show ip access-lists
Extended IP access list test
    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

テンプレートの利用

テンプレートの作成

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

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

cat << EOF > ios_template.j2
vrf definition VRF10
  address-family ipv4 unicast
!
interface GigabitEthernet 0/1
  no shutdown
!
interface GigabitEthernet 0/1.10
  encapsulation dot1Q 10
  vrf forwarding VRF10
  ip address 192.168.10.1 255.255.255.0
  ip address 192.168.10.11 255.255.255.0 secondary
  ip address 192.168.10.12 255.255.255.0 secondary
EOF

プレイブックの作成

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

cat << EOF > cisco_ios_add_ipv4_address.yml
---
- hosts: cisco_ios
  gather_facts: no

  tasks:
    - name: add ipv4 address
      ios_config:
        backup: yes
        src: ios_template.j2
EOF

テンプレート実行

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

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

PLAY [cisco_ios] ***************************************************************

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

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

プレイブック確認

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

R60#show running-config interface GigabitEthernet 0/1.10
Building configuration...

Current configuration : 224 bytes
!
interface GigabitEthernet0/1.10
 encapsulation dot1Q 10
 vrf forwarding VRF10
 ip address 192.168.10.11 255.255.255.0 secondary
 ip address 192.168.10.12 255.255.255.0 secondary
 ip address 192.168.10.1 255.255.255.0
end

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

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

# ls -l backup/
total 12
-rw------- 1 root root 3373 Aug 28 23:23 cisco60_config.2020-08-28@23:23:30
-rw------- 1 root root 3601 Aug 28 23:25 cisco60_config.2020-08-28@23:24:58
-rw------- 1 root root 3601 Aug 28 23:34 cisco60_config.2020-08-28@23:34:55

手堅い設定投入

概要

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

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

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

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

プレイブック作成

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

cat << EOF > cisco_ios_modify_ios_services.yml
---
- hosts: cisco_ios
  gather_facts: no

  tasks:
    - ios_ntp:
        server: 10.0.255.10
        source_int: Loopback0
        logging: false
        state: present
    - name: configure name servers
      ios_system:
        name_servers:
          - 8.8.8.8
          - 8.8.4.4
EOF

プレイブック実行

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

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

PLAY [cisco_ios] ***************************************************************

TASK [ios_ntp] *****************************************************************
changed: [cisco60]

TASK [configure name servers] **************************************************
changed: [cisco60]

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

プレイブック確認

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

R60#show ntp associations

  address         ref clock       st   when   poll reach  delay  offset   disp
 ~10.0.255.10     .INIT.          16      -     64     0  0.000   0.000 15937.
 * sys.peer, # selected, + candidate, - outlyer, x falseticker, ~ configured
R60#
R60#show ip name
8.8.8.8
8.8.4.4

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