我用Ansible在Cisco设备中同时分发公钥

首先

我在家里运行了大约4台Cisco设备,我希望能够通过公钥认证使用SSH连接到所有设备。
但是我发现在Cisco设备上注册公钥真的非常麻烦。
如果能够一次性输入字符串就好了,但是它不接受一次性输入,必须分为大约5次才能接受。

于是我尝试使用Ansible一次性发布全部公钥。

环境

Ansible 服务器:Ubuntu20.04
Ansible Core 版本:2.13.1
Python 版本:3.8.10

思科设备①(2台)
型号:WS-C3560CG-8TC-S
操作系统:15.2(2)E10

思科设备②(2台)
型号:WS-C2960CG-8TC-L
操作系统:15.2(2)E9

前提条件

– 确保已经建立了Ansible。
– 从Ansible服务器能够确认与每台Cisco设备可以进行Ping互通。
– 确保能够通过密码验证以SSH方式连接到Cisco设备。
– 理解基本的hosts文件写法。
– 理解基本的公钥验证方式。

在这里我们省略了Ansible的安装方法。
如果你想从Ansible的安装方法开始,请通过以下文章来进行安装。

 

如果您对公钥认证方式不太了解,可以参考下面的内容。

 

生成密钥对

在进行公钥认证时,需要创建公钥和私钥。让我们一起创建这对密钥。

制作方法有两种。

    • コマンドプロンプトから作成する方法

 

    TeraTermで作成する方法

因为我在连接网络设备和服务器时使用TeraTerm宏命令,所以这次我想要在TeraTerm中创建。

使用TeraTerm生成密钥。

スクリーンショット 2022-07-17 225237B.png

打开一个用于生成密钥的界面。
一般情况下,我认为使用RSA算法生成2048位的密钥是没有问题的。
设置好密钥类型和位数后,点击“生成”按钮。

スクリーンショット 2022-07-17 225309B.png
スクリーンショット 2022-07-17 225346.png

当输入密码后,点击“保存公钥(I)”和“保存私钥(P)”。将会弹出文件浏览器,询问保存密钥的位置。默认情况下,应该会保存在用户目录下的[.ssh]文件夹中。

スクリーンショット 2022-07-17 225407B.png
スクリーンショット 2022-07-17 225504.png

鍵對的製作已經完成了。

将公钥保存到Ansible服务器上。

当您成功创建密钥对后,将公钥存储到Ansible中。
密钥的传输方式可使用TeraTerm的[SSH SCP]功能。

如果您熟悉TeraTerm的SCP功能,请忽略这部分。

スクリーンショット 2022-07-17 231230.png
スクリーンショット 2022-07-17 231530B.png

打开一个选择其他文件的窗口,选取保存在“\user.ssh”中的“id_rsa.pub”文件。

考虑到权限问题,请先将文件保存在当前登录用户的个人目录中。

スクリーンショット 2022-07-17 233134B.png

如果您点击这个“发送”按钮,应该会将其保存在指定的文件夹中。让我们确认一下。

让我们使用[命令] ls -la | grep id_rsa 来查看一下。

user@ansi101v:~$ ls -la | grep id_rsa
-rw-r--r-- 1 rat  rat   405 Jul 17 00:12 id_rsa.pub
user@ansi101v:~$

保存得很好啊。

将公钥文件移动

接下来,让我们将id_rsa.pub文件保存到[/etc/ansible/]目录中。
使用命令是mv。另外,由于目录为[/etc],让我们加上sudo。
[命令]sudo mv id_rsa.pub /etc/ansible/

让我们确认是否可以进行移动。
[命令]ls -la /etc/ansible | grep id_rsa

user@ansi101v:~$ ls -la /etc/ansible | grep id_rsa
-rw-r--r--  1 rat  rat   405 Jul 17 00:12 id_rsa.pub
user@ansi101v:~$

你的移动很流畅。

创建 `/etc/ansible/.ssh` 目录

为了避免ansible放在根目录下杂乱无章且让人不悦,我们可以创建一个名为“[.ssh]”的目录,并将其保存在其中。
[命令]mkdir /etc/ansible/.ssh/

我們來確認一下是否已經建立完成。
[指令]ls -la /etc/ansible/ | grep ssh

user@ansi101v:~$ ls -la /etc/ansible/ | grep ssh
drwxr-xr-x  2 root root 4096 Jul 17 11:32 .ssh
user@ansi101v:~$

移动并更改公开密钥文件的名称

将公钥文件移至[.ssh]目录的同时,可选择更改文件名。(不一定需要更改)

【命令】sudo mv /etc/ansible/id_rsa.pub /etc/ansible/.ssh/authorized_keys

【指令】sudo 将 /etc/ansible/id_rsa.pub 移动到 /etc/ansible/.ssh/authorized_keys

我们来确认一下能否正确地进行移动和更改名称。
[命令] ls -la /etc/ansible/.ssh/

user@ansi101v:~$ ls -la /etc/ansible/.ssh/
total 12
drwxr-xr-x 2 root root 4096 Jul 17 11:32 .
drwxr-xr-x 7 root root 4096 Jul 17 23:46 ..
-rwx------ 1 root root  405 Jul 17 11:32 authorized_keys
user@ansi101v:~$

你的移动和名称更改都做得很好。

主持人的准备

我们将指定要分发公钥的设备。这次我们将创建一个名为test的组,并在其中记录Cisco设备的IP地址(或主机名)。请按照以下方式在hosts文件的末尾进行补充。

[test] ←グループ名
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4

[test:vars] ←グループ[test]の変数
ansible_user=ansible ←Cisco機器ログイン時のユーザ名
ansible_password=password ←パスワード認証時のパスワード
ansible_connection=network_cli ←接続方法
ansible_network_os=cisco.ios.ios ←対象機器のOS
ansible_port=22 ←SSH接続のポート指定
ansible_become=yes ←特権モードを許可
ansible_become_method= enable ←特権モード昇格コマンド
ansible_become_password=password ←特権モード昇格時のパスワード

因为这是我个人的理解,所以可能存在一些误解,请谅解。

准备Playbooks

经过这么多准备工作,我们终于可以开始编写Playbooks了。
请创建一个任意文件名的文件,并参考下面的内容进行编写。
我选择了一个名为“create_user_public-key.yaml”的文件名。
[命令]vim /etc/ansible/<任意文件名>.yaml

---
- hosts: test
  gather_facts: false

  tasks:
    - name: Create New User Public-key
      cisco.ios.ios_user:
        name: ansible-public
        sshkey: "{{ lookup('file', '/etc/ansible/.ssh/authorized_keys')}}"
        state: present
...

以下是简单设置项目和说明,按照从上到下的顺序列出。

項目値hosts対象機器指定gather_factsfacts変数の使用可否tasksタスクを記述する宣言nametaskの名前を指定cisco.ios.ios_userciscoのuser設定を変更するモジュールを使用nameSSH接続用のユーザ名指定sshkey公開鍵ファイルの内容を指定する。ここではディレクトリパスを指定しているstate存在する状態(present)にするか、削除した状態(absent)にするか指定。デフォルトはpresent

如果能够编写Playbooks,那么就可以开始进行设置了。

执行Playbooks

只需执行以下命令:
[命令]sudo ansible-playbook /etc/ansible/create_user_public-key.yaml -i /etc/ansible/hosts
[执行日志]

PLAY [test] ***********************************************************

TASK [Create New User Public-key] **********************************************
[WARNING]: Module did not set no_log for update_password
[WARNING]: Module did not set no_log for password_type
changed: [192.168.1.1]
changed: [192.168.1.2]
changed: [192.168.1.3]
changed: [192.168.1.4]

PLAY RECAP *********************************************************************
192.168.1.1         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.2         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.3         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.4         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

user@ansi101v:~$

请尝试使用公钥认证登录每台设备,以确认是否能成功登录。

广告
将在 10 秒后关闭
bannerAds