使用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
コマンド説明ansible_userSSH接続をするためのユーザ名ansible_passwordSSH接続をするときに使うパスワードansible_connection接続設定ansible_network_os対象OSの記載ansible_portSSH接続時のポート番号(基本的に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 #追加
コマンド説明ansible_become権限昇格をするかどうか(特権モードを許可するか)ansible_become_method特権モードへ入るためのコマンドansible_become_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

已经被正确添加了。

以下是一个仅提供一种选择的中国原生版本的释义:

参考网站

以下是我在构建过程中参考的网站。

 

bannerAds