AnsibleとNAPALMの連携を試してみた

前回マルチベンダーなネットワーク機器を制御出来るPythonライブラリ「NAPALM」を試してみたので、今回はAnsibleとNAPALMの連携を試してみました。

検証環境

検証環境は以下の通り

NAPALM

% pip show napalm
Name: napalm
Version: 1.1.0
Summary: Network Automation and Programmability Abstraction Layer with Multivendor support
Home-page: https://github.com/napalm-automation/napalm
Author: David Barroso
Author-email: dbarrosop@dravetech.com
License: UNKNOWN
Location: /Users/itbook/.pyenv/versions/2.7.8/lib/python2.7/site-packages
Requires: napalm-iosxr, napalm-ibm, napalm-pluribus, napalm-eos, napalm-nxos, napalm-fortios, napalm-panos, napalm-junos, napalm-base, napalm-ios

Ansible

% ansible --version
ansible 2.1.0.0
  config file =
  configured module search path = Default w/o overrides

AnsibleとNAPALMを連携するライブラリ

以下のライブラリを使っています。

napalm-automation/napalm-ansible

Arista

eos-1#show version
Arista CVX
Hardware version:
Serial number:
System MAC address:  000c.29f1.b416

Software image version: 4.15.7M
Architecture:           i386
Internal build version: 4.15.7M-3284043.4157M
Internal build ID:      b0b0dff8-c9ca-40cc-a625-7fd3c8c76ebd

Uptime:                 15 hours and 51 minutes
Total memory:           2513796 kB
Free memory:            174616 kB

デバイス情報を取得

Playbookはこんな感じ。

% more playbooks/get-facts.yml
---
- name: Get Device data
  hosts: all
  gather_facts: no
  connection: local
  tasks:
  - name: Get data from device
    napalm_get_facts:
      hostname={{ip}}
      username={{user}}
      dev_os={{os}}
      password={{passwd}}
      filter='facts,interfaces'
    register: result
  - name: print data
    debug: var=result

「filter」オプションで取得したい情報を記載します。残念ながら現時点では取得出来ない情報もあるようです。(configやARPテーブルなどは取得できず)

実行結果は以下の通りです。

% ansible-playbook -i hosts playbooks/get-facts.yml
PLAY [Get Device data] *********************************************************
TASK [Get data from device] ****************************************************
ok: [eos-1]
TASK [print data] **************************************************************
ok: [eos-1] => {
    "result": {
        "ansible_facts": {
            "facts": {
                "fqdn": "eos-1",
                "hostname": "eos-1",
                "interface_list": [
                    "Loopback1",
                    "Loopback2",
                    "Management1"
                ],
                "model": "CVX",
                "os_version": "4.15.7M-3284043.4157M",
                "serial_number": "",
                "uptime": 1513085,
                "vendor": "Arista"
            },
            "interfaces": {
                "Loopback1": {
                    "description": "",
                    "is_enabled": true,
                    "is_up": true,
                    "last_flapped": 1486210620.3110418,
                    "mac_address": "",
                    "speed": 0
                },
                "Loopback2": {
                    "description": "",
                    "is_enabled": true,
                    "is_up": true,
                    "last_flapped": 1486210759.9295466,
                    "mac_address": "",
                    "speed": 0
                },
                "Management1": {
                    "description": "",
                    "is_enabled": true,
                    "is_up": true,
                    "last_flapped": 1486155018.0522845,
                    "mac_address": "00:0C:29:53:21:7D",
                    "speed": 1000
                }
            }
        },
        "changed": false
    }
}
PLAY RECAP *********************************************************************
eos-1                      : ok=2    changed=0    unreachable=0    failed=0

コンフィグの追加

続いてコンフィグの追加を試してみました。

Playbookはこんな感じ。

% more playbooks/add-config.yml
---
- name: Add config
  hosts: all
  connection: local
  gather_facts: no
  tasks:
  - name: Add config
    napalm_install_config:
        hostname={{ip}}
        username={{user}}
        dev_os={{os}}
        password={{passwd}}
        config_file={{config_dir}}/{{hostname}}/config
        commit_changes=True
        replace_config=False
        diff_file={{config_dir}}/{{hostname}}/config.diff

「config」というファイルに追加する設定を記述し、「config.diff」というファイルに変更前と変更後のdiffの結果を保存するようにしています。

コンフィグ追加前のAristaのコンフィグは以下。

eos-1#sh running-config
! Command: show running-config
! device: eos-1 (CVX, EOS-4.15.7M)
!
! boot system flash:/EOS.swi
!
transceiver qsfp default-mode 4x10G
!
hostname eos-1
!
spanning-tree mode mstp
!
no aaa root
!
username test secret 5 $1$yl1ume/m$LNhZY2oO3iB0L9aCaEbGp0
!
interface Loopback1
   ip address 1.1.1.1/32
!
interface Loopback2
   ip address 2.2.2.2/32
!
interface Management1
   ip address 172.16.41.2/24
!
no ip routing
!
management api http-commands
   protocol http
   no shutdown
!
!
end

試しに、「loopback 3」を追加してみます。

% more configs/eos-1/config
interface loopback 3
ip address 3.3.3.3 255.255.255.255

実行結果は以下の通りです。

% ansible-playbook -i hosts playbooks/add-config.yml
PLAY [Add config] **************************************************************
TASK [Add config] **************************************************************
changed: [eos-1]
PLAY RECAP *********************************************************************
eos-1                      : ok=1    changed=1    unreachable=0    failed=0
eos-1#sh running-config
! Command: show running-config
! device: eos-1 (CVX, EOS-4.15.7M)
!
! boot system flash:/EOS.swi
!
transceiver qsfp default-mode 4x10G
!
hostname eos-1
!
spanning-tree mode mstp
!
no aaa root
!
username test secret 5 $1$yl1ume/m$LNhZY2oO3iB0L9aCaEbGp0
!
interface Loopback1
   ip address 1.1.1.1/32
!
interface Loopback2
   ip address 2.2.2.2/32
!
interface Loopback3
   ip address 3.3.3.3/32
!
interface Management1
   ip address 172.16.41.2/24
!
no ip routing
!
management api http-commands
   protocol http
   no shutdown
!
!
end

変更前と変更後のdiffの結果も問題なく保存されています。

% more configs/eos-1/config.diff  
@@ -18,6 +18,9 @@  
 interface Loopback2  
    ip address 2.2.2.2/32  
 !
+interface Loopback3  
+   ip address 3.3.3.3/32  
+!  
 interface Management1  
    ip address 172.16.41.2/24  
 !

まとめ

AnsibleとNAPALMを連携するためのライブラリを用意してくれているので、簡単に連携することができました。今までAnsibleを使って大量のマルチベンダ機器をお守りしていた方は、NAPALMと連携させることでAnsibleの管理も楽になるんじゃないかと思います。
今回試したコードはGitHUBに上げておきましたので、興味がある方は試してみていただければ。

itbook/ansible_napalm

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください