我尝试使用Ansible的napalm-ansible模块来改变Cisco IOS的配置
首先
这是在验证napalm-ansible第三方模块包中的配置更改模块napalm_install_config的操作时的备忘录。
napalm-ansible 是什么?
NAPALM(ナパーム、Network Automation and Programmability Abstraction Layer with Multivendor support)是一个能够自动化进行网络设备配置更改和状态信息获取等任务的Python库。
這些設備能與以下多個供應商的設備相容。
-
- Arista EOS
-
- Cisco IOS
-
- Cisco IOS-XR
-
- Cisco NX-OS
- Juniper JunOS
napalm-ansible 是提供在 Ansible 平台上使用的模块,目前可提供以下功能。
安裝
我是按照tekunabe(手順)的博客作为参考,在Ansible的napalm-ansible模块中获取Cisco IOS设备的各种信息。
准备好的东西
NAPALM2.3.3
napalm-ansible0.10.0
Cisco CSR1000V15.2(2)E6Ansibleで管理する機器。ホスト名はcsr1。
网络设备的设置
为了进行Config文件的传输,需要启用SCP服务器,因为使用SCP协议。
csr1(config)#启用IP SCP服务器
执行 Ansible
作为一个例子,我尝试使用napalm_install_config模块来进行接口的IP地址设置和开放。
当前配置
interface GigabitEthernet2
no ip address
shutdown
negotiation auto
设定配置
interface GigabitEthernet2
ip address 10.10.10.10 255.255.255.0
no shutdown
库存文件
请提供CSR1的登录信息。
[cisco]
192.168.1.100
[cisco:vars]
hostname= "{{ inventory_hostname }}"
ansible_username=csr1
ansible_password=cisco
enable_secret=csr1
剧本
这个功能是将指定目录上的配置Config通过SCP传输到网络设备上,保存并覆盖当前的配置,然后生成差异文件diff来显示变动部分。
---
- hosts: cisco
gather_facts: no
connection: local
tasks:
- name: Install Config
napalm_install_config:
provider: "{{ cli }}"
config_file: '/home/<ユーザ名>/ansible/csr1_setup.txt'
commit_changes: True
replace_config: False
get_diffs: True
diff_file: '/home/<ユーザ名>/ansible/diff'
vars:
cli:
hostname: "{{ inventory_hostname }}"
username: "{{ ansible_username }}"
password: "{{ ansible_password }}"
dev_os: "ios"
#ユーザーの権限レベルが0の場合、以下コマンドでenableパスワードを指定
optional_args: {'secret': 'csr1'}
执行结果
[<ユーザ名>@localhost library]$ ansible-playbook -i inventory playbook5.yml
PLAY [cisco] ******************************************************************************
TASK [Install Config] *********************************************************************
changed: [192.168.1.100]
PLAY RECAP ********************************************************************************
192.168.1.100 : ok=1 changed=1 unreachable=0 failed=0
設置後的配置
我能确认设置已经按照要求生效了。
interface GigabitEthernet2
ip address 10.10.10.10 255.255.255.0
negotiation auto
生成的diff文件
+interface GigabitEthernet2
+ ip address 10.10.10.10 255.255.255.0
- no shutdown
网络设备生成的文件
在Bootflash内,存储着配置Config和回滚文件。
csr1#dir
Directory of bootflash:/
---<snip>---
14 -rw- 135 Nov 7 2018 23:56:37 +09:00 merge_config.txt
20 -rw- 29652 Nov 8 2018 00:05:07 +09:00 rollback_config.txt
番外篇:当输入错误的配置时的操作行为。
设定配置
我试图设置一个不同于之前的IP地址。我还会进行description的附加设置,但是发现拼写错误。
interface GigabitEthernet2
ip address 10.10.10.20 255.255.255.0
deescription Test
执行结果 (shí jié guǒ)
查看日志可以看到,配置合并失败,并且正在尝试回滚。
[<ユーザ名>@localhost library]$ ansible-playbook -i inventory playbook5.yml
PLAY [cisco] ******************************************************************************
TASK [Install Config] *********************************************************************
fatal: [192.168.1.100]: FAILED! => {"changed": false, "msg": "cannot install config:
Configuration merge failed; automatic rollback attempted:\n deescription Test\n
^\n% Invalid input detected at '^' marker.\n\n141 bytes copied in 0.075 secs (1880 bytes/sec)"}
[WARNING]: Could not create retry file '/home/<ユーザ名>/ansible/napalm-
ansible/napalm_ansible/modules/playbook5.retry'.
[Errno 13] Permission denied:
u'/home/<ユーザ名>/ansible/napalm-ansible/napalm_ansible/modules/playbook5.retry'
PLAY RECAP ********************************************************************************
192.168.1.100 : ok=0 changed=0 unreachable=0 failed=1
配置的設定
所有的配置,包括IP地址设置,都已经被完全还原。
interface GigabitEthernet2
ip address 10.10.10.10 255.255.255.0
negotiation auto
与Ansible原生模块进行比较
与 ios_config 模块相比较,我觉得必须要启用SCP服务器以及文件留存在网络设备内部的部分都有些微妙。另外,Ansible 2.7 还发布了适用于多供应商的配置更改模块 cli_config,但我个人可能不会使用它。
然而,除了我尝试过的模块外,可能还有其他可用的模块,所以如果有好的建议,我会再次介绍。