在终端服务器上查看 Ansible NW 系列插件/模块的行为

首先

通过结合以下两个功能,我们可以在运行Ansible时,对Cisco IOS设备执行操作,并记录尝试的结果。

    • ターミナルサーバを利用すると、対象機器へSSH経由でコンソール接続可能

 

    コンソール接続の場合、他のコンソール接続ユーザの実行内容が画面表示される

2. 验证构建

Ansible版本为2.10.0,并且使用的网络设备是Cisco 1812J。

無題1205-1.png

3. 存货文件

以下是根据Ansible2.9及更高版本支持的Ansible Collection的语法(FQCN)创建的。
连接插件使用network_cli。用户名/密码与常规SSH连接不同,而是指定了终端服务器端。

[cisco]
Router ansible_host=192.168.100.33 ansible_port=3001

[cisco:vars]
ansible_connection=ansible.netcommon.network_cli
ansible_network_os=cisco.ios.ios
ansible_user=(ターミナルサーバのユーザ名)
ansible_password=(ターミナルサーバのパスワード)
ansible_become=yes
ansible_become_method=ansible.netcommon.enable
ansible_become_pass=(ルータのenableパスワード)

4. 获取show命令(通过ios_command模块)

4-1. 战术指南

我会对路由器执行“show users”命令两次。

---

- hosts: cisco
  gather_facts: no

  tasks:
    - name: run show command 1
      cisco.ios.ios_command:
        commands:
          - show users

    - name: run show command 2
      cisco.ios.ios_command:
        commands:
          - show users

4-2. 执行结果(Ansible)

两个任务已经顺利完成。

$ ansible-playbook -i inventory_con.ini playbook_shuser.yml

PLAY [cisco] **********************************************************************************************************************************

TASK [run show command 1] *********************************************************************************************************************
ok: [Router]

TASK [run show command 2] *********************************************************************************************************************
ok: [Router]

PLAY RECAP ************************************************************************************************************************************
Router                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    

4-3. 执行结果(网络设备)

当在执行任务的时候运行show命令1。

    • ログイン、teminal lengh/widthコマンドで出力行/幅の制限を外す

show versionコマンド実行

show usersコマンド実行

在运行show command 2任务时

show versionコマンド実行

show usersコマンド実行

在执行任务的”run show command 2″时,由于持久连接功能(即SSH连接可以在一段时间内保持,不需要每个任务都登录。默认为30秒),省略了第一个步骤的处理。

******************************** [run show command 1 実行時] ********************************
Router>enable
Password:
Router#terminal length 0
Router#terminal width 512
Router#terminal width 0
Router#show version
(省略)
Router#show users
    Line       User       Host(s)              Idle       Location
*  0 con 0                idle                 00:00:00

  Interface    User               Mode         Idle     Peer Address

******************************** [run show command 2 実行時] ********************************
Router#show version
(省略)
Router#show users
    Line       User       Host(s)              Idle       Location
*  0 con 0                idle                 00:00:00

  Interface    User               Mode         Idle     Peer Address

顺便说一句,在使用暂停模块的时候,将两个任务的执行间隔分开后,第一个任务已经执行完毕。

5. 获取事实信息(gather_facts、ios_facts模块)

5-1. 玩法手册

将gather_facts指令设置为yes(默认设置),预先收集各种系统信息。

在后续的任务中,我们也将尝试执行ios_facts模块。如果不像本Playbook那样指定gather_subset选项,那么默认情况下会选择!config,并获取除了配置(Config)之外的硬件和接口信息。
参考:Ansible文档 – cisco.ios.ios_facts

---

- hosts: cisco
  gather_facts: yes

  tasks:
    - name: collect facts
      cisco.ios.ios_facts:
#        gather_subset:
#          - all
#          - min
#          - hardware
#          - config
#          - interfaces
      register: facts

    - name: debug
      debug:
        msg: "{{ facts }}"

5-2. 执行结果(Ansible)

gather_facts先被执行作为一个名为”Gathering Facts”的任务。随后执行了collect facts任务,并将结果输出给debug任务。

实行结果$ ansible-playbook -i inventory_con.ini playbook_facts.yml

玩耍 [思科] **********************************************************************************************************************************

任务 [采集事实] ************************************************************************************************************************
[警告]:忽略思科.ios.ios_facts的超时(10)
良好:[路由器]

任务 [收集事实] **************************************************************************************************************************
良好:[路由器]

任务 [调试] **********************************************************************************************************************************
良好:[路由器] => {
“信息”:{
“ansible_facts”:{
“ansible_net_all_ipv4_addresses”:[
“XX.XX.XX.XX”,
“XX.XX.XX.XX”
],
“ansible_net_all_ipv6_addresses”:[],
“ansible_net_api”:“cliconf”,
“ansible_net_filesystems”:[
“闪存:”
],
“ansible_net_filesystems_info”:{
“闪存:”:{
“spacefree_kb”:12152.0,
“spacetotal_kb”:31192.0
}
},
“ansible_net_gather_network_resources”:[],
“ansible_net_gather_subset”:[
“硬件”,
“接口”,
“默认”
],
“ansible_net_hostname”:“路由器”,
“ansible_net_image”:“flash:c181x-advipservicesk9-mz.XX.XX.bin”,
“ansible_net_interfaces”:{
“FastEthernet0”:{
“带宽”:100000,
“描述”:“<< To Router >>”,
“双工”:null,
“ipv4”:[
{
“地址”:“10.1.1.1”,
“子网”:“30”
}
],
“线路协议”:“下线”,
“macaddress”:“0022.55XX.XXXX”,
“mediatype”:null,
“mtu”:1500,
“操作状态”:“上线”,
“类型”:“PQ3_TSEC”
},
(省略)
},
“ansible_net_iostype”:“IOS”,
“ansible_net_memfree_mb”:45478.98828125,
“ansible_net_memtotal_mb”:63340.53515625,
“ansible_net_model”:“1812-J”,
“ansible_net_neighbors”:{},
“ansible_net_python_version”:“3.6.8”,
“ansible_net_serialnum”:“FHKXXXXXXXX,”,
“ansible_net_system”:“ios”,
“ansible_net_version”:“XX.XX”,
“ansible_network_resources”:{}
},
“更改”:假,
“失败”:假
}
}

玩耍摘要 ************************************************************************************************************************************
路由器:良好=3 改变=0 无法访问=0 失败=0 跳过=0 救援=0 忽略=0

5-3. 实际执行结果(网络设备)

Gathering Facts和collect facts这两个任务使用了相同的show命令。

******************************** [Gathering Facts 実行時] ********************************
Router>enable
Password:
Router#terminal length 0
Router#terminal width 512
Router#terminal width 0
Router#show version
(省略)
Router#show version
(省略)
Router#dir
(省略)
Router#show memory statistics
(省略)
Router#show interfaces
(省略)
Router#show ip interface
(省略)
Router#show ipv6 interface
(省略)
Router#show lldp
(省略)
Router#show cdp
(省略)
Router#show cdp neighbors detail
(省略)
Router#show version
(省略)
******************************** [collect facts 実行時] ********************************
Router#show version
(省略)
Router#show version
(省略)
Router#dir
(省略)
Router#show memory statistics
(省略)
Router#show interfaces
(省略)
Router#show ip interface
(省略)
Router#show ipv6 interface
(省略)
Router#show lldp
(省略)
Router#show cdp
(省略)
Router#show cdp neighbors detail
(省略)
Router#show version
(省略)

我也会记下更改了ios_facts模块的gather_subset选项的结果。

gather_subset取得コマンド指定なし (!config)show version, dir, show memory statistics, show interfaces, show ip interface, show ipv6 interface, show lldp, show cdp, show cdp neighbors detailall指定なし + show running-configminshow versionhardwareshow version, dir, show memory statisticsconfigshow version, show running-configinterfacesshow version, show interfaces, show ip interface, show ipv6 interface, show lldp, show cdp, show cdp neighbors detail

6. 添加NTP服务器设置(ios_config模块)。

6-1. 策略手册

为了确认幂等性是否被保证,我们尝试添加NTP服务器1.1.1.1(已配置)和NTP服务器9.9.9.9(未配置)。我们将使用save_when选项,在配置更改后进行写入操作。

---

- hosts: cisco
  gather_facts: no

  tasks:
    - name: add ntp server
      cisco.ios.ios_config:
        lines:
          - ntp server 1.1.1.1
          - ntp server 9.9.9.9
        match: line
        save_when: modified

6-2. 执行结果(Ansible)

发生了变化=1,并进行了设置更改。

$ ansible-playbook -i inventory_con.ini playbook_ntp.yml

PLAY [cisco] **********************************************************************************************************************************

TASK [add ntp server] *************************************************************************************************************************
changed: [Router]

PLAY RECAP ************************************************************************************************************************************
Router                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

6-3. 程序执行结果(网络设备)

大致流程如下。

    • 設定変更前のRunning Configを取得(おそらく設定しようとしているコマンドとの差分比較のため)

 

    • 未設定のコマンドntp server 9.9.9.9のみ適用

 

    • 設定変更後のRunning ConfigとStartup Configを取得

 

    コマンドcopy running-config startup-configで設定保存
Router>enable
Password:
Router#terminal length 0
Router#terminal width 512
Router#terminal width 0
Router#show version
(省略)
Router#show running-config
(省略)
ntp server 1.1.1.1
(省略)
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#ntp server 9.9.9.9
Router(config)#end

******************************** [save_when: modified 指定時] ********************************
Router#show running-config
(省略)
ntp server 1.1.1.1
ntp server 9.9.9.9
(省略)

Router#show startup-config
(省略)
ntp server 1.1.1.1
(省略)
Router#copy running-config startup-config
Destination filename [startup-config]?
Building configuration...
[OK]

在不同的情况下,如果Running Config中没有ntp server 9.9.9.9,但是Startup Config中已经有了这个设置(即在配置更改后,Running Config和Startup Config相同),则不会执行第四个设置保存。它似乎会比较这两个配置并判断是否需要保存。

广告
将在 10 秒后关闭
bannerAds