【自動化】AnsibleによるCisco機器の管理・設定

DevNet

Ansibleの概要

Ansibleは、エージェントレスの構成管理ツールです。通常Ansibleは、管理者がYAMLで書いたAnsible Playbookを実行した際、Pythonスクリプトをリモートホストにコピーし、リモートホストでそのスクリプトを実行します。しかし、ネットワーク機器の場合は、Pythonスクリプトを実行できない機器が多いため、管理サーバからデバイスにSSH接続してCLIコマンドを実行する仕組みとなっています。その他、Netconfにも対応しています。詳しくは下記に記載があります。

インベントリファイル(inventory.ini)の作成

管理対象機器の接続先や接続方法をインベントリファイルに記載します。

[iosxe]
IOSXE1 ansible_host=**.**.**.**

[iosxr]
IOSXR1 ansible_host=**.**.**.**

[iosxe:vars]
ansible_user=cisco
ansible_password=*****
ansible_connection=network_cli
ansible_network_os=ios

[iosxr:vars]
ansible_user=cisco
ansible_password=*****
ansible_connection=network_cli
ansible_network_os=iosxr

Ansibleがinventory.iniを読み込めるかをansible-inventoryコマンドで確認します。ちゃんと読み込めている場合は、下記表示になります。

$ ansible-inventory -i inventory.ini --list
{
    "_meta": {
        "hostvars": {
            "IOSXE1": {
                "ansible_connection": "network_cli",
                "ansible_host": "**.**.**.**",
                "ansible_network_os": "ios",
                "ansible_password": "cisco",
                "ansible_user": "*****"
            },
            "IOSXR1": {
                "ansible_connection": "network_cli",
                "ansible_host": "**.**.**.**",
                "ansible_network_os": "iosxr",
                "ansible_password": "*****",
                "ansible_user": "cisco"
            }
        }
    },
    "all": {
        "children": [
            "iosxe",
            "iosxr",
            "ungrouped"
        ]
    },
    "iosxe": {
        "hosts": [
            "IOSXE1"
        ]
    },
    "iosxr": {
        "hosts": [
            "IOSXR1"
        ]
    }
}

inventory.iniファイル内にミスがある場合、下記のようなエラーが表示されます。私は「ansible_user=cisco」と記載すべきところを「ansible_user:cisco」と記載してエラーになっていました…

$ ansible-inventory -i inventory.ini --list
[WARNING]:  * Failed to parse /Users/*****/ansible/inventory/inventory.ini with ini plugin: /Users/*****/ansible/inventory/inventory.ini:8: Expected key=value, got:
ansible_user:cisco
[WARNING]: Unable to parse /Users/*****/ansible/inventory/inventory.ini as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
{
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "ungrouped"
        ]
    }
}

Ansible Playbookのサンプル

ios_configモジュールを用いたIOS-XEデバイスのコンフィグ設定

事前事後コンフィグチェックを含めたloopbackIFを設定するplaybookのサンプルです。debugでshowコマンドの結果表示、whenでコンフィグ投入の条件分岐をさせています。

---
- hosts: iosxe
  gather_facts: false

  tasks:
   - name: pre-check
     ios_command:
       commands: show run | i Loopback10
     register: pre_results

   - name: display pre-check results
     debug:
       var: pre_results.stdout

   - name: add loopback
     ios_config:
       lines:
         - ip address 5.5.5.5 255.255.255.255
       parents: interface Loopback10
     when: "'interface Loopback10' not in pre_results.stdout"

   - name: post-check
     ios_command:
       commands: show run | i Loopback10
     register: post_results

   - name: display post-check results
     debug:
       var: post_results.stdout

対象のLoopbackIFの設定が入っていない場合は、下記実行結果になります。

$ ansible-playbook -i inventory/inventory.ini add_loopback_xe.yml

PLAY [iosxe] *******************************************************************

TASK [pre-check] ***************************************************************
[WARNING]: Platform darwin on host IOSXE1 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change the meaning of that path. See https://docs.ansible.com
/ansible/2.11/reference_appendices/interpreter_discovery.html for more
information.
ok: [IOSXE1]

TASK [display pre-check results] ***********************************************
ok: [IOSXE1] => {
    "pre_results.stdout": [
        ""
    ]
}

TASK [add loopback] ************************************************************
[WARNING]: To ensure idempotency and correct diff the input configuration lines
should be similar to how they appear if present in the running configuration on
device
changed: [IOSXE1]

TASK [post-check] **************************************************************
ok: [IOSXE1]

TASK [display post-check results] **********************************************
ok: [IOSXE1] => {
    "post_results.stdout": [
        "interface Loopback10"
    ]
}

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

対象のLoopbackIFの設定が入っている場合は、add loopbackタスクがスキップされ、下記実行結果になります。

$ ansible-playbook -i inventory/inventory.ini add_loopback_xe.yml

PLAY [iosxe] *******************************************************************

TASK [pre-check] ***************************************************************
[WARNING]: Platform darwin on host IOSXE1 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change the meaning of that path. See https://docs.ansible.com
/ansible/2.11/reference_appendices/interpreter_discovery.html for more
information.
ok: [IOSXE1]

TASK [display pre-check results] ***********************************************
ok: [IOSXE1] => {
    "pre_results.stdout": [
        "interface Loopback10"
    ]
}

TASK [add loopback] ************************************************************
skipping: [IOSXE1]

TASK [post-check] **************************************************************
ok: [IOSXE1]

TASK [display post-check results] **********************************************
ok: [IOSXE1] => {
    "post_results.stdout": [
        "interface Loopback10"
    ]
}

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

ios_l3_interfaceモジュールを用いたIOS-XEデバイスのコンフィグ設定

汎用性のあるios_configではなく、用途別にios_bgp, ios_ntpなどのモジュールが用意されています。IOS-XEに対して使用できるモジュールの一覧は下記にあります。

  • https://docs.ansible.com/ansible/latest/collections/cisco/ios/index.html

下記はios_l3_interfaceモジュールを用いて上のplaybookと同じ動作をさせるplaybookのサンプルです。

---
- hosts: iosxe
  gather_facts: false

  tasks:
   - name: pre-check
     ios_command:
       commands: show run | i Loopback10
     register: pre_results

   - name: display pre-check results
     debug:
       var: pre_results.stdout

   - name: add loopback
     ios_l3_interface:
       name: Loopback10
       ipv4: 5.5.5.5/32
     when: "'interface Loopback10' not in pre_results.stdout"

   - name: post-check
     ios_command:
       commands: show run | i Loopback10
     register: post_results

   - name: display post-check results
     debug:
       var: post_results.stdout

外部ファイル読み込みによるIOS-XEデバイスのコンフィグ設定

jinja2テンプレートファイルを読み込んでコンフィグ投入する方法もあります。下記がplaybookのサンプルです。srcにファイルを指定しています。

---
- hosts: iosxe
  gather_facts: false

  tasks:
   - name: pre-check
     ios_command:
       commands: show run | i Loopback10
     register: pre_results

   - name: display pre-check results
     debug:
       var: pre_results.stdout

   - name: add loopback
     ios_config:
       src: xe_template.j2
     when: "'interface Loopback10' not in pre_results.stdout"

   - name: post-check
     ios_command:
       commands: show run | i Loopback10
     register: post_results

   - name: display post-check results
     debug:
       var: post_results.stdout

また、jinja2テンプレートファイル(xe_template.j2)内は下記のようにコンフィグをそのままコピペした形で記載しています。

interface Loopback10
 ip address 5.5.5.5 255.255.255.255

iosxr_configモジュールを用いたIOS-XRデバイスのコンフィグ設定

IOS-XRデバイスに対しても、使用するモジュールを変更してあげることで同じように設定できます。IOS-XRに対して使用できるモジュールは下記に記載があります。

  • https://docs.ansible.com/ansible/latest/collections/cisco/iosxr/index.html
---
- hosts: iosxr
  gather_facts: false

  tasks:
   - name: pre-check
     iosxr_command:
       commands: show run | i Loopback10
     register: pre_results

   - name: display pre-check results
     debug:
       var: pre_results.stdout

   - name: add loopback
     iosxr_config:
       lines:
         - ipv4 address 5.5.5.5 255.255.255.255
       parents: interface Loopback10
     when: "'interface Loopback10' not in pre_results.stdout"

   - name: post-check
     iosxr_command:
       commands: show run | i Loopback10
     register: post_results

   - name: display post-check results
     debug:
       var: post_results.stdout

Ansibleを基礎から体系的に学びたい方は下記の本がおすすめです。

コメント

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