使用Ansible连接和配置变更Cisco设备
首先
我一直对使用Ansible进行网络自动化很感兴趣,但是由于对网络设备了解不多,一直都不敢接近它。
我会把这篇文章保留下来,以便对其他工程师有所帮助。
利用环境的方式
服务器: Ubuntu20.04
网络设备: Cisco WS-C3560CG-8PC-S
→ IOS 版本: 15.2(2)E10
【安装软件及版本】
Ansible:2.12.6
Python:3.8.10
设定信息
服务器主机名:ansi101v
网络设备主机名:crhm02.nw.home.net
SSH登录用户名:ansible
SSH登录密码:password
事前准备
服务器准备工作
我们应该在服务器上安装各种软件。
更新apt
作为事前准备,我们应该提前更新一下。
apt update
安装Ansible
请按照官方页面上的说明进行安装。
以下是Ubuntu的安装步骤。
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
Ansible官方安装指南
https://docs.ansible.com/ansible/2.9_zh/installation_guide/intro_installation.html#ubuntu-ansible
安装python3-pip
pip是一个实用工具,用于安装Python软件包等,但为了安装后面的ansible-pylibssh软件包,我们会先执行此操作。
apt install python3-pip
安装ansible-pylibssh
pip install ansible-pylibssh
后来在测试中,我将使用Ansible命令在目标设备上执行Ping操作,但如果不安装这个程序,将会出现错误。
root@ansi101v:~# ansible router -m ping
[WARNING]: ansible-pylibssh not installed, falling back to paramiko
#翻訳
[警告]: ansible-pylibssh がインストールされていないため、paramiko にフォールバックします。
网络准备就绪
在进行之前,让我们做以下设置:
其他详细设置略去。
– 主机名设置
– enable密码设置
– SSH连接设置
请使用SSH连接来进行Ansible操作,在下面的参考文档中找到相关设置。
确认SSH连接
让我们在Cisco设备上设置SSH,并尝试从服务器进行实际的SSH连接以进行实验。
如果出现问题的话,看起来Cisco在密钥交换的哈希函数上使用了SHA-1。然而,SHA-1的攻击方法在2005年被发现,在数年后的2017年开始,Ubuntu17.04默认禁用了SHA-1。
所以,听说服务器会发怒地说“我不知道这个函数”。
作为解决方法,请在/etc/ssh/ssh_config中添加以下文本。
KexAlgorithms=+diffie-hellman-group1-sha1
主机的创建
这里将列出相关设备并提供相关信息。我们创建一个名为“routers”的组,并在其中记录设备的FQDN。但在这里,使用IP也没有问题。
[routers]
crhm02.nw.homw.net
[routers:vars]
ansible_user = ansible
ansible_password = password
ansible_connection = network_cli
ansible_network_os = ios
ansible_port = 22
检测Ping连通性
首先,我们将通过Ansible向目标设备发送ping命令进行测试。
如果ping通了,那么我们可以放心地认为之前的配置是没有问题的。
ansible routers -m ping的命令。
如果没有问题,将会按下述方式返回。
root@ansi101v:~# ansible routers -m ping
crhm02.nw.home.net | SUCCESS => {
"changed": false,
"ping": "pong"
}
显示命令进行测试。
在进行设置更改之前,我会先使用show命令来确认是否有返回结果。
我决定试一试“显示接口状态”命令。
命令是ansible routers -m ios_command -a “commands=’show int status'”。
结果如下所示,一切顺利的话将会得到以下的回应。
root@ansi101v:~# ansible routers -m ios_command -a "commands='show int status'"
crhm02.nw.home.net | SUCCESS => {
"changed": false,
"stdout": [
"Load for five secs: 17%/0%; one minute: 18%; five minutes: 18%\nTime source is NTP, 21:53:57.831 JST Mon Jun 13 2022\n\n\nPort Name Status Vlan Duplex Speed Type \nGi0/1 connected trunk a-full a-1000 10/100/1000BaseTX\nGi0/2 disabled 1 auto auto 10/100/1000BaseTX\nGi0/3 connected 1 a-full a-1000 10/100/1000BaseTX\nGi0/4 connected 155 a-full a-1000 10/100/1000BaseTX\nGi0/5 connected trunk a-full a-1000 10/100/1000BaseTX\nGi0/6 connected 610 a-full a-1000 10/100/1000BaseTX\nGi0/7 connected trunk a-full a-1000 10/100/1000BaseTX\nGi0/8 connected trunk a-full a-1000 10/100/1000BaseTX\nGi0/9 notconnect 1 auto auto Not Present\nGi0/10 connected trunk a-full a-1000 10/100/1000BaseTX"
],
"stdout_lines": [
[
"Load for five secs: 17%/0%; one minute: 18%; five minutes: 18%",
"Time source is NTP, 21:53:57.831 JST Mon Jun 13 2022",
"",
"",
"Port Name Status Vlan Duplex Speed Type ",
"Gi0/1 connected trunk a-full a-1000 10/100/1000BaseTX",
"Gi0/2 disabled 1 auto auto 10/100/1000BaseTX",
"Gi0/3 connected 1 a-full a-1000 10/100/1000BaseTX",
"Gi0/4 connected 155 a-full a-1000 10/100/1000BaseTX",
"Gi0/5 connected trunk a-full a-1000 10/100/1000BaseTX",
"Gi0/6 connected 610 a-full a-1000 10/100/1000BaseTX",
"Gi0/7 connected trunk a-full a-1000 10/100/1000BaseTX",
"Gi0/8 connected trunk a-full a-1000 10/100/1000BaseTX",
"Gi0/9 notconnect 1 auto auto Not Present",
"Gi0/10 connected trunk a-full a-1000 10/100/1000BaseTX"
]
]
}
root@ansi101v:~#
如果发生如下错误:
The authenticity of host 'crhm02.nw.home.net' can't be established due to 'Host is unknown:
##翻訳
ホスト 'crhm02.nw.home.net' の真正性は 'Host is unknown' のため確立できません。
请以中文原生的方式转述:
请将这句话理解为“我不知道SSH连接的目标主机是什么。”的一种怀疑的感觉。
要解决这个问题,需要在/etc/ansible/ansible.cfg中添加配置。
在/etc/ansible/ansible.cfg文件中添加以下内容。
[defaults]
host_key_checking = False
通过这样做,可以自动地向Ansible添加主机密钥。如果要更改整个服务器的设置,请修改/etc/ssh/ssh_config文件中的StrictHostKeyChecking设置。
请参考以下链接:
https://qiita.com/toshiro3/items/e380ac6c4e31e7588e19
主持人的编辑
为了进行配置更改,需要补充必要的信息。
在进行Cisco配置更改时,必须进行权限提升。也就是说,必须进入特权模式。
为此,需要按照以下方式修改hosts文件。
[routers]
crhm02.nw.home.net
[routers:vars]
ansible_user = ansible
ansible_password = password
ansible_connection = network_cli
ansible_network_os = ios
ansible_port = 22
ansible_become = yes #追加
ansible_become_method = enable #追加
ansible_become_password = password #追加
顺带一提,关于在hosts的vars中写入内容,可以通过查看各个操作系统的平台选项来了解。
思科IOS平台选项 IOS
制作playbook
這次我們將嘗試添加Loopback21介面的設定。Playbook將以YAML格式進行記載。
因此,首先在/etc/ansible目录下创建一个名为devnet.yml的yaml文件。并没有特别的规定,可以使用任意自由的文件名。
我将按照下面的方式进行描述。
---
- name: General Config
hosts: routers
tasks:
- name: Add loopback
cisco.ios.ios_interface:
name: Loopback21
description: test-interface
state: present
...
简要解释一下
--- ←yamlを書く上での決まりで文章のはじめはハイフンを3つ記載します。
- name: General Config ←Playbookの名前のようなものです。
hosts: routers ←対象の機器を設定しています。
tasks: ←ここでどんな作業を実施するか記載します。
- name: Add loopback ←作業名です。「動詞 + 名詞」などわかりやすく記載しましょう。
cisco.ios.ios_interface: ←どこの設定をいじるか指定します。
name: Loopback21 ←IFの名前です。
description: test-interface ←descriptionを指定します。
state: present ←ステータス確認をするように設定します。
... ←yamlを書く上での決まりで文章の終わりにはピリオドを3つ記載します。
执行Playbook
既经写完Playbook了,所以立刻执行。
命令是ansible-playbook devnet.yml。
※由于我将文件保存在/etc/ansible,所以使用cd命令切换目录。
执行结果
root@ansi101v:/etc/ansible# ansible-playbook devnet.yml
[DEPRECATION WARNING]: cisco.ios.ios_interface has been deprecated. See the plugin documentation for more details.
This feature will be removed from cisco.ios in a release after 2022-06-01. Deprecation warnings can be disabled by
setting deprecation_warnings=False in ansible.cfg.
PLAY [General Config] ***********************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
[WARNING]: Ignoring timeout(10) for ansible.legacy.ios_facts
ok: [crhm02.nw.home.net]
TASK [Add loopback] *************************************************************************************************
changed: [crhm02.nw.home.net]
PLAY RECAP **********************************************************************************************************
crhm02.nw.home.net : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@ansi101v:/etc/ansible#
当更改被正确完成后,[PLAY RECAP] 将会在“ok”和“changed”前增加数字。
那么,我们也来看看SW。
#show run int loopback 21
Load for five secs: 18%/0%; one minute: 23%; five minutes: 20%
Time source is NTP, 22:06:32.654 JST Mon Jun 13 2022
Building configuration...
Current configuration : 71 bytes
!
interface Loopback21
description test-interface
no ip address
end
已经被正确添加了。
以下是一个仅提供一种选择的中国原生版本的释义:
参考网站
以下是我在构建过程中参考的网站。