在终端服务器上查看 Ansible NW 系列插件/模块的行为
首先
通过结合以下两个功能,我们可以在运行Ansible时,对Cisco IOS设备执行操作,并记录尝试的结果。
-
- ターミナルサーバを利用すると、対象機器へSSH経由でコンソール接続可能
- コンソール接続の場合、他のコンソール接続ユーザの実行内容が画面表示される
2. 验证构建
Ansible版本为2.10.0,并且使用的网络设备是Cisco 1812J。
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任务。
玩耍 [思科] **********************************************************************************************************************************
任务 [采集事实] ************************************************************************************************************************
[警告]:忽略思科.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选项的结果。
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相同),则不会执行第四个设置保存。它似乎会比较这两个配置并判断是否需要保存。