見出し画像

Cisco Modeling Labs(CML)でAnsibleを使ったCisco(IOS)機器の設定を取得する方法


概要

Cisco Modeling Labs(CML)に、Ansible(Ubuntu)サーバーの構築及びAnsibleを使ったCisco(IOS)機器のCommand Line Interface(CLI)データを取得してみました。
この記事が他のエンジニアのご参考になれば幸いです。

検証環境について

・CML Version :2.6.1

◆CMLのノード情報
・サーバー :Ubuntu (Version: 20.04)
・NW機器  :CSR1000v (Version: 17.03.02)
・その他
-External Connector (Connector Type: NAT) :DHCPサーバーとして使用
-Unmanaged Switch :全てのノードを接続するために使用
Ubuntuにインストールソフト及びバージョン情報
・Ansible : 2.12.10
・Python : 3.8.5

・構成図

Cisco Modeling Labs(CML) の画面

構成図の [ext-conn-0] のDHCP機能により(192.168.255.0/24)のネットワーク範囲から使用可能なアドレスを使用して、接続されたノード(ubuntu「Ens2」及び csr1000v「G1」のインターフェース)に動的にIPアドレスが割り当てられます。 ノードのインターフェイスは、DHCP がアドレスを受信できるように構成されている必要があります。 ほとんどのサーバーノードはすぐに使用できますが、ルーターとスイッチ ノードにはこれを行うための特別な構成が必要です。

引用:Example: External Connector using NAT

事前準備

・NW機器側

Ansible から NW機器には ssh で接続するため、ssh接続できることが前提となっていますので、事前に以下の項目は設定しておいてください。
(※ここでは、細かな設定手順は割愛します。)
◆設定項目
  ・ホスト名の設定
  ・enableパスワードの設定
  ・ssh 接続の設定  
 今回の検証環境では、以下の設定とします。 
  ・ホスト名  :csr1000v
  ・enableパスワード :password
  ・ssh 接続  :admin/admin (※ログインユーザーID/パスワード)

・サーバー側

◆UbuntuへのAnsible のインストール
(※下記は、Ansible公式のインストール方法となります。)

以下のコマンドを実行します。

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible

◆Ansible の確認
Ansibleのインストール後は、以下コマンドを実行してバージョン情報が表示されればインストールが完了します。

$ ansible --version
ansible [core 2.12.10]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/cisco/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/cisco/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0]
  jinja version = 2.10.1
  libyaml = True

Ansibleは、デフォルトで /usr/bin/ ディレクトリにインストールされます。

$ which ansible
/usr/bin/ansible

Ansible実行ファイルの準備

Ansibleは、以下2つのファイル群にて構成されています。
①インベントリファイル
対象機器を記載するファイルのこと。
(※INI及びYAML形式で記述される・ 今回は、INI形式で記述する)
②Playbookファイル
対象機器に実行する一連の処理を記載するファイルのこと。
(※YAML形式で記述される)

・インベントリファイルの作成

◆ /etc/ansible/inventory.ini

[cisco_routers]
192.168.255.88

[cisco_routers:vars]
ansible_connection = 'network_cli'
ansible_network_os = 'cisco.ios.ios'
ansible_user = 'admin'
ansible_password = 'admin'
ansible_become: True
ansible_become_method: ansible.netcommon.enable
ansible_become_password: password

補足説明
・「ansible_user」と「ansible_password」は、csr1000v へ ssh 接続するためのユーザーIDとパスワードになります。
・「ansible_become_password」は、csr1000v のenableパスワードになります。

・Playbookファイルの作成

今回は、"show version" と "show ip interface brief"のコマンドを取得し、
コマンドの結果を表示する設定を入れています。

◆ /etc/ansible/cisco_ios_get-cli.yml

- name: ios get config
  hosts: cisco_routers
  gather_facts: no

  vars:
    show_clis:
      - show version
      - show ip interface brief

  tasks:
    - name: execute show clis
      ios_command:
        commands: "{{ show_clis }}"
      register: show_cli_result

    - name: show clis result output
      ansible.builtin.debug:
        msg: "{{ show_cli_result.stdout_lines[ansible_loop.index0] }}"
      loop: "{{ show_clis }}"
      loop_control:
        extended: true

Ansibleの実行

◆ 実行コマンド
$ansible-playbook -i [インベントリーファイル] [Playbookファイル]

◆ 実行結果

$ ansible-playbook -i inventory.ini cisco_ios_get-cli.yml
[WARNING]:  * Failed to parse /etc/ansible/inventory.ini with ini plugin:
/etc/ansible/inventory.ini:9: Expected key=value, got: ansible_become: True
[WARNING]: Unable to parse /etc/ansible/inventory.ini as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [ios get config] **********************************************************

TASK [execute show clis] *******************************************************
ok: [192.168.255.88]

TASK [show clis result output] *************************************************
ok: [192.168.255.88] => (item=show version) => {
    "msg": [
        "Cisco IOS XE Software, Version 17.03.02",
        "Cisco IOS Software [Amsterdam], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 17.3.2, RELEASE SOFTWARE (fc3)",
        "Technical Support: http://www.cisco.com/techsupport",
        "Copyright (c) 1986-2020 by Cisco Systems, Inc.",
        "Compiled Sat 31-Oct-20 13:16 by mcpre",
        "",
        "",
        "Cisco IOS-XE software, Copyright (c) 2005-2020 by cisco Systems, Inc.",
        "All rights reserved.  Certain components of Cisco IOS-XE software are",
        "licensed under the GNU General Public License (\"GPL\") Version 2.0.  The",
        "software code licensed under GPL Version 2.0 is free software that comes",
        "with ABSOLUTELY NO WARRANTY.  You can redistribute and/or modify such",
        "GPL code under the terms of GPL Version 2.0.  For more details, see the",
        "documentation or \"License Notice\" file accompanying the IOS-XE software,",
        "or the applicable URL provided on the flyer accompanying the IOS-XE",
        "software.",
        "",
        "",
        "ROM: IOS-XE ROMMON",
        "",
        "csr1000v uptime is 1 day, 52 minutes",
        "Uptime for this control processor is 1 day, 54 minutes",
        "System returned to ROM by reload",
        "System image file is \"bootflash:packages.conf\"",
        "Last reload reason: factory-reset",
        "",
        "",
        "",
        "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.",
        "",
        "License Level: ax",
        "License Type: N/A(Smart License Enabled)",
        "Next reload license Level: ax",
        "",
        "The current throughput level is 1000 kbps ",
        "",
        "",
        "Smart Licensing Status: UNREGISTERED/No Licenses in Use",
        "",
        "cisco CSR1000V (VXE) processor (revision VXE) with 1105351K/3075K bytes of memory.",
        "Processor board ID 9M0X9DWCWLW",
        "Router operating mode: Autonomous",
        "4 Gigabit Ethernet interfaces",
        "32768K bytes of non-volatile configuration memory.",
        "3012036K bytes of physical memory.",
        "6188032K bytes of virtual hard disk at bootflash:.",
        "",
        "Configuration register is 0x2102"
    ]
}
ok: [192.168.255.88] => (item=show ip interface brief) => {
    "msg": [
        "Interface              IP-Address      OK? Method Status                Protocol",
        "GigabitEthernet1       192.168.255.88  YES DHCP   up                    up      ",
        "GigabitEthernet2       unassigned      YES unset  administratively down down    ",
        "GigabitEthernet3       unassigned      YES unset  administratively down down    ",
        "GigabitEthernet4       unassigned      YES unset  administratively down down"
    ]
}

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

・実行時SSH接続エラーの回避策

◆ エラーメッセージ例

$ ansible-playbook -i inventory.ini cisco_ios_get-cli.yml
[WARNING]:  * Failed to parse /etc/ansible/inventory.ini with ini plugin:
/etc/ansible/inventory.ini:9: Expected key=value, got: ansible_become: True
[WARNING]: Unable to parse /etc/ansible/inventory.ini as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [ios get config] **********************************************************

TASK [execute show clis] *******************************************************
fatal: [192.168.255.88]: FAILED! => {"changed": false, "msg": "paramiko: The authenticity of host '192.168.255.88' can't be established.\nThe ssh-rsa key fingerprint is b'b0ca49bd48f7153f2ad8ace477384d1d'."}

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

◆ 回避策
/etc/ansible/ansible.cfg ファイルに、以下の設定を記載します。

   [defaults]
   host_key_checking = False

まとめ

Cisco Modeling Labs(CML)上で、Ansibleの構築及びAnsibleを使ったCisco(IOS)関連モジュールの基本的な操作を確認することが出来ました。





この記事が気に入ったらサポートをしてみませんか?