我尝试使用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 平台上使用的模块,目前可提供以下功能。

モジュール概要napalm_get_factsインベントリ、設定、ステータス情報を取得napalm_install_config設定変更を行うnapalm_validate各種ステータスの妥当性をチェックするnapalm_parse_yangファイルや実機からConfig/Stateをパースし、YANGに対応した辞書形式で出力napalm_diff_yang2つのYANGオブジェクトを比較napalm_translate_yangYANGオブジェクトを従来のConfigに変換napalm_pingPingを実行

安裝

我是按照tekunabe(手順)的博客作为参考,在Ansible的napalm-ansible模块中获取Cisco IOS设备的各种信息。

准备好的东西

ハード/ソフトバージョン用途CentOS7.5.1804Ansible/NAPALMをインストールする機器。Ansible2.7.0
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,但我个人可能不会使用它。
然而,除了我尝试过的模块外,可能还有其他可用的模块,所以如果有好的建议,我会再次介绍。

广告
将在 10 秒后关闭
bannerAds