ちょっと話題の記事

AnsibleでCiscoルータのIOSバージョン情報を一括取得してみた

2014.11.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、梶です。 今日は覚えておくと便利なバージョン情報の一括取得です。 「Ansibleを使ってネットワーク機器の情報を取得できないか?」と思い、誰もネットワーク機器に対してAnsibleを使ってなさそうなのでやってみました。 サーバでも使えると思います。

TeraTermマクロなどで行うケースが多いと思われますが、Ansible環境からルータにsshログイン可能なら、できるのではないかと思い試してみました。

お試し環境について

最後にAWS VPCに構築したCSR1000VのIOSバージョン情報の取得も実施していますが、 今回Ciscoルータがなくても試すことができるよう、Cisco DevNetからonePKの「All-in-One-VM」をダウンロードして一撃構築して試します。 *Ciscoへのユーザ登録が必要です。

「All-in-one VM」とは、Cicso製品向けアプリケーションを開発するための仮想環境です。 ダウンロードするOVF(Open Virtualization Format)のファイルを仮想環境に VM 展開すると、SDK入りのUbuntuと仮想 IOSルータを含む環境がすぐに利用できます。 なお、サポートしている仮想環境は次のとおりです。

  • VMWare ESXi 5 or later
  • VMWare Workstation 9 or later
  • VMWare Fusion 5 or later
  • Oracle VirtualBox 4.2 or later

弊社ではVMware Fusionを標準インストールしてるため利用しましたが、Virtual Boxでもできるのでお手軽です。

<参考情報> Ciscoのブログページ http://gblogs.cisco.com/jp/2014/04/developing-applications-with-onepk-all-in-one-vm/

Ciscoページから、ovfファイルをダウンロードして、VMware FusionやVirtualBoxへ展開するのみです。

kaji-Ansible-onePK-01

kaji-Ansible-onePK-02

kaji-Ansible-onePK-03

仮想ルータの起動

default passwordはcisco123でVMにログイン kaji-Ansible-onePK-04

Start 3nodeのアイコンをクリックし、ルータ3台起動 kaji-Ansible-onePK-05

起動した状態の構成図 kaji-Ansible-onePK-07

前提条件

上記、「onePK All-in-one VM」でルータ3台が起動している状態とします。 「onePK All-in-one VM」のルータ3台のバージョンを取得します。 のちほど、VPCに構築したCSR1000Vのバージョンを別途取得します。

All-in-one VMのUbuntuへAnsibleのインストール

cisco@onepk:~$ sudo apt-get install python-pip
cisco@onepk:~$ sudo apt-get install sshpass
cisco@onepk:~$ sudo pip install ansible
cisco@onepk:~$ ansible --version
ansible 1.7.2

All-in-one VMへホストPCからsshログイン可能なように、Ubuntuへsshのインストール

cisco@onepk:~$ sudo apt-get install ssh

VM(Ubuntu)とホストPCのそれぞれで、ifconfigで確認し、接続可能なIPアドレスを確認しssh接続します。 構成によるかもしれませんが、私の環境では最初から上記のルータネットワーク用とは別にssh接続用のインターフェイスがあり、sshのインストールのみでログインできました。

sshログイン用に各ルータのconfig 設定

SSH接続でVTYポートにログインする際に、line vtyに設定されたパスワードではなく、 設定されているユーザ名とパスワードを認証を使用するようにするため、line vtyにローカル認証を設定し、保存

> enable
# conf t
(config)#line vty 0 4
(config-line)#login local
(config-line)#exit
設定保存
# wr mem

AnsibleのPlaybook作成

各コマンド結果をファイル出力するようにしています。出力部分の記述方法が不明でかなり苦労しました。 調べても私個人では解決できなかったので、望月さんにご支援頂きました。この場を借りてお礼したく、ありがとうございました。

cisco@onepk:~$ mkdir ansible
cisco@onepk:~$ cd ansible
cisco@onepk:~/ansible$ vi get-version.yml
---
- hosts: router
  gather_facts: no
  tasks:
  - name: sh clock
    raw : "show clock"
    register: show_clock
  - name: sh clock output
    local_action: shell /bin/echo "{{ show_clock.stdout }}" > /home/cisco/ansible/shclock_{{ inventory_hostname }}.txt 
  - name: sh ver
    raw : "show ver"
    register: show_ver
  - name: sh ver output
    local_action: shell /bin/echo "{{ show_ver.stdout }}" > /home/cisco/ansible/shver_{{ inventory_hostname }}.txt

Ansible用のhostsファイル作成

cisco@onepk:~/ansible$ vi hosts
[router]
10.10.10.110
10.10.10.120
10.10.10.130

エラー対応

各ルータにsshでの初回ログイン時のため、以下のエラーが発生します。

fatal: [10.10.10.xxx] => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

手動でsshで一度ログインし、known_hostに登録された状態で、行います。

cisco@onepk:~/ansible$ ssh cisco@10.10.10.1xx
<省略>
password:cisco
router > exit

ansibleの実行結果

$ ansible-playbook -i hosts get-version.yml --ask-pass
cisco@onepk:~/ansible$ SSH password:cisco

PLAY [router] *****************************************************************

TASK: [sh clock] **************************************************************
ok: [10.10.10.110]
ok: [10.10.10.120]
ok: [10.10.10.130]

TASK: [sh clock output] *******************************************************
changed: [10.10.10.130 -> 127.0.0.1]
changed: [10.10.10.120 -> 127.0.0.1]
changed: [10.10.10.110 -> 127.0.0.1]

TASK: [sh ver] ****************************************************************
ok: [10.10.10.130]
ok: [10.10.10.110]
ok: [10.10.10.120]

TASK: [sh ver output] *********************************************************
changed: [10.10.10.110 -> 127.0.0.1]
changed: [10.10.10.120 -> 127.0.0.1]
changed: [10.10.10.130 -> 127.0.0.1]

PLAY RECAP ********************************************************************
10.10.10.110               : ok=4    changed=2    unreachable=0    failed=0
10.10.10.120               : ok=4    changed=2    unreachable=0    failed=0
10.10.10.130               : ok=4    changed=2    unreachable=0    failed=0

cisco@onepk:~/ansible$

ansibleのバージョン確認

実行結果ファイルが作成されるため、結果を確認

cisco@onepk:~/ansible$ ls -ltr
total 32
-rw-rw-r-- 1 cisco cisco   48 Nov  5 04:16 hosts
-rw-rw-r-- 1 cisco cisco  461 Nov  5 17:19 get-version.yml
-rw-rw-r-- 1 cisco cisco   33 Nov  5 17:55 shclock_10.10.10.130.txt
-rw-rw-r-- 1 cisco cisco   35 Nov  5 17:55 shclock_10.10.10.120.txt
-rw-rw-r-- 1 cisco cisco   35 Nov  5 17:55 shclock_10.10.10.110.txt
-rw-rw-r-- 1 cisco cisco 1688 Nov  5 17:55 shver_10.10.10.110.txt
-rw-rw-r-- 1 cisco cisco 1688 Nov  5 17:55 shver_10.10.10.120.txt
-rw-rw-r-- 1 cisco cisco 1688 Nov  5 17:55 shver_10.10.10.130.txt
cisco@onepk:~/ansible$ grep Version shver_*.txt
shver_10.10.10.110.txt:Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Experimental Version 15.4(20140730:011659) [lucylee-pi25-2 107]
shver_10.10.10.120.txt:Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Experimental Version 15.4(20140730:011659) [lucylee-pi25-2 107]
shver_10.10.10.130.txt:Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Experimental Version 15.4(20140730:011659) [lucylee-pi25-2 107]
cisco@onepk:~/ansible$ grep ID shver_*.txt
shver_10.10.10.110.txt:Processor board ID 9ZK2Y0HYELSW5SK8EXDXU
shver_10.10.10.120.txt:Processor board ID 9WAAWI2EICLM8D4K798KJ
shver_10.10.10.130.txt:Processor board ID 9FCORJDHCTTC1A74Y7TIK
cisco@onepk:~/ansible$

VPCに構築したCisco CSR1000Vのバージョン調査用の追加設定

実機でも確認してみました。 VPCにCSR1000Vを構築する方法はここを参照 ホスト名でログインできるようにsshのconfig設定しました。 VPCへCSR1000V構築時の鍵の保存場所などを追記します。

$ cat ~/.ssh/config
Host csr1000v
 HostName xxx.xxx.xxx.xxx
 Port 22
 User ec2-user
 IdentityFile /home/cisco/<VPC CSR1000V用の鍵ファイル>

ssh csr1000vでログインできることを確認。

ansible用のhostsファイルにcsr1000vを追記

cisco@onepk:~/ansible$ cat hosts
[router]
10.10.10.110
10.10.10.120
10.10.10.130
[csr1000v]
csr1000v

ansible-playbookも以下の差分を修正

cisco@onepk:~/ansible$ cp -ip get-version.yml get-version-csr1000v.yml
cisco@onepk:~/ansible$ diff get-version-csr1000v.yml get-version.yml
2c2
< - hosts: csr1000v
---
> - hosts: router

AnsibleでVPCに構築したCisco CSR1000Vのバージョン確認

cisco@onepk:~/ansible$ ansible-playbook -i hosts get-version-csr1000v.yml

PLAY [csr1000v] ***************************************************************

TASK: [sh clock] **************************************************************
ok: [csr1000v]

TASK: [sh clock output] *******************************************************
changed: [csr1000v]

TASK: [sh ver] ****************************************************************
ok: [csr1000v]

TASK: [sh ver output] *********************************************************
changed: [csr1000v]

PLAY RECAP ********************************************************************
csr1000v                   : ok=4    changed=2    unreachable=0    failed=0

cisco@onepk:~/ansible$ ls -ltr *csr1000v*
-rw-rw-r-- 1 cisco cisco  464 Nov  5 18:34 get-version-csr1000v.yml
-rw-rw-r-- 1 cisco cisco  258 Nov  5 18:41 shclock_csr1000v.txt
-rw-rw-r-- 1 cisco cisco 2597 Nov  5 18:41 shver_csr1000v.txt
cisco@onepk:~/ansible$
cisco@onepk:~/ansible$ grep Version shver_csr1000v.txt
Cisco IOS XE Software, Version 03.13.00a.S - Extended Support Release
Cisco IOS Software, CSR1000V Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 15.4(3)S0a, RELEASE SOFTWARE (fc2)
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
GPL code under the terms of GPL Version 2.0.  For more details, see the
cisco@onepk:~/ansible$

感想

sshログイン可能な機器の構成情報の収集に使えました。 Ansibleはネットワーク機器の構成確認でもつかえると思います。 All-in-One-VMの中にある、SDK用サンプルプログラム(NetworkElementTutorial.py等)でも情報取得できます。 しかし、実機で行う場合はIOSバージョンの制限やonePK接続用の証明書を設定する必要があるため、Ansibleの方が楽です。 また、別ベンダーでもできそうなので今度、試してみたいと思います。手持ちの実機が古い機器しか無い・・・汗