我用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生成密钥。
打开一个用于生成密钥的界面。
一般情况下,我认为使用RSA算法生成2048位的密钥是没有问题的。
设置好密钥类型和位数后,点击“生成”按钮。
当输入密码后,点击“保存公钥(I)”和“保存私钥(P)”。将会弹出文件浏览器,询问保存密钥的位置。默认情况下,应该会保存在用户目录下的[.ssh]文件夹中。
鍵對的製作已經完成了。
将公钥保存到Ansible服务器上。
当您成功创建密钥对后,将公钥存储到Ansible中。
密钥的传输方式可使用TeraTerm的[SSH SCP]功能。
如果您熟悉TeraTerm的SCP功能,请忽略这部分。
打开一个选择其他文件的窗口,选取保存在“\user.ssh”中的“id_rsa.pub”文件。
考虑到权限问题,请先将文件保存在当前登录用户的个人目录中。
如果您点击这个“发送”按钮,应该会将其保存在指定的文件夹中。让我们确认一下。
让我们使用[命令] 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
...
以下是简单设置项目和说明,按照从上到下的顺序列出。
如果能够编写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:~$
请尝试使用公钥认证登录每台设备,以确认是否能成功登录。