如何使用 Ansible 将 ssh 公钥上传为 authorized_key
如何使用 Ansible 将 ssh 公钥作为 authorized_key 上传到保存在清单文件中的多个 Linux 或 Unix 服务器?
要添加或删除特定用户帐户的 SSH 授权密钥,请使用 authorized_key 模块。本快速教程介绍如何创建 Ansible PlayBook,它将公共 ssh 密钥添加到多个 Unix 或 Linux 服务器以便安全登录。
要添加或删除特定用户帐户的 SSH 授权密钥,请使用 authorized_key 模块。本快速教程介绍如何创建 Ansible PlayBook,它将公共 ssh 密钥添加到多个 Unix 或 Linux 服务器以便安全登录。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | Ansible |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 2 分钟 |
步骤 1:创建主机清单文件
您需要告诉 Ansible 您将使用哪些主机。例如,这是我的 Ansible 清单文件,名为 my_ssh_hosts,主机名如下:
示例输出:
$ cat my_ssh_hosts
server1.example.com server2.example.com server3.example.com
我总共要管理三台主机。
第 2 步:创建新的剧本
创建一个名为upload_ssh_keys.yml的文件,内容如下:
--- - hosts: all remote_user: vivek tasks: # upload ssh key - authorized_key: user: vivek state: present manage_dir: yes key: "{{ lookup('file', '/path/to/your/www_id_rsa.pub') }}" # vim:ft=ansible:
以上操作会将公钥文件 (/path/to/your/www_id_rsa.pub) 放置到 my_ssh_hosts 文件中列出的所有服务器。请确保为 root 帐户设置了 ssh 密钥。
第 3 步:运行你的剧本
语法是:
$ ansible-playbook -i <inventory_host_file> <playbook.yml>
$ ansible-playbook -i my_ssh_hosts upload_ssh_keys.yml
另一个例子
在此示例中,创建了一个名为 vivek 的新用户。接下来为用户 vivek 添加 ssh 密钥,并使用 ssh-setup.j2 模板将 ssh 服务器配置为放弃基于密码的登录。
文件:ssh-setup.yml
--- - hosts: cluster tasks: # create users for us # note user vivek added to sudo group # on many system you may need to use wheel # user in sudo or wheel group can sudo - user: name: vivek comment: "Vivek Gite" shell: /bin/bash groups: sudo append: yes generate_ssh_key: yes ## run command 'mkpasswd --method=sha-512' to create your own encrypted password ## password: $6$gF1EHgeUSSwDT3$xgw22QBdZfNe3OUjJkwXZOlEsL645TpacwiYwTwlUyah03.Zh1aUTTfh7iC7Uu5WfmHBkv5fxdbJ2OkzMAPkm/ ssh_key_type: ed25519 # upload ssh key - authorized_key: user: vivek state: present manage_dir: yes key: "{{ lookup('file', '/home/vivek/.ssh/id_ed25519.pub') }}" # configure ssh server - template: src: ssh-setup.j2 dest: /etc/ssh/sshd_config owner: root mode: '0600' validate: /usr/sbin/sshd -t -f %s backup: yes # restart sshd - service: name: sshd state: restarted
文件:ssh-setup.j2
下面的操作将禁用 root 登录和密码登录。只有名为 vivek 的用户可以使用公钥通过 ssh 登录(您需要发出 sudo -i 命令才能获得 root shell):
Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key UsePrivilegeSeparation sandbox KeyRegenerationInterval 3600 ServerKeyBits 1024 SyslogFacility AUTH LogLevel INFO LoginGraceTime 120 PermitRootLogin {{ sshd_permitroot_login }} StrictModes yes RSAAuthentication yes PubkeyAuthentication yes LogLevel VERBOSE IgnoreRhosts yes RhostsRSAAuthentication no HostbasedAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no X11Forwarding yes X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server UsePAM {{ sshd_use_pam }} PasswordAuthentication {{ sshd_password_authentication }} ChallengeResponseAuthentication {{ sshd_challenge_response_authentication }} {% for nip in ansible_all_ipv4_addresses %} ListenAddress {{ nip }} {% endfor %}
文件:my-inventory.hosts
[all:vars] ansible_user=root ansible_port=22 [cluster:vars] sshd_use_pam=no sshd_password_authentication=no sshd_challenge_response_authentication=no sshd_permitroot_login=no [cluster] server1.example.com server2.example.com server3.example.com
您可以按如下方式运行它:
$ ansible-playbook -i my-inventory.hosts ssh-setup.yml
您还可以使用如下循环为每个用户上传文件:
- hosts: all user: root # .... my_ssh_users: - name: vivek key: "{{ lookup('file', 'vivek.pub') }}" - name: tom key: "{{ lookup('file', 'tom.pub') }}" - name: wendy key: "{{ lookup('file', 'wendy.pub') }}" - name: jerry key: "{{ lookup('file', 'jerry.pub') }}" # ... - name: Add ssh pub keys authorized_key: user={{ item.name }} key="{{ item.key }}" with_items: my_ssh_users
有关详细信息,请参阅authorized_key模块文档。