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に上げておきましたので、興味がある方は試してみていただければ。