使用 Ansible 中的authorized_key模块将多个公共 ssh 密钥分配给用户定义



>问题:

使用Ansible,如何将多个公钥文件 (.pub( 设置为部署在用户的authorized_keys文件中,而不是使用包含公共 ssh 密钥列表的单个文件?


场景和要求:

  • 我有多个公共 ssh 密钥作为.pub文件存储在一个中心位置
  • 我想从vars文件创建新用户
  • 每个用户应具有(无/一个特定/多个(公共 SSH 密钥,这些密钥来自部署到各自authorized_keys文件的.pub
  • 文件
  • 由于以下原因,已部署.pub文件的列表可能会更改:
    • .pub文件的内容由于例如而更改。 私钥泄露
    • vars文件中的用户应分配其他公钥文件
  • 我不想为每个用户通过"列表"文件来替换密钥

当前部署:

变量文件 (vars/users.yml(:

users:
- username: "bob"
sshkey: "{{ lookup('file', 'files/ssh_keys/bob.keys') }}"
...
- username: "alice"
sshkey: "{{ lookup('file', 'files/ssh_keys/alice.keys') }}"
...

bob.keys内容:

ssh-rsa admin-ssh-key= admin
ssh-rsa support-a-ssh-key= support-a
ssh-rsa bobs-ssh-key= hi im bob

alice.keys内容:

ssh-rsa admin-ssh-key= admin
ssh-rsa alice-ssh-key= hi im alice
ssh-rsa accounting-clerk-ssh-key= checking your progress

Ansible Role main.yml 文件:

- name: Add SSH keys
authorized_key:
user: "{{ item.username }}"
state: "{{ item.sshkeystate }}"
key: "{{ item.sshkey }}"
exclusive: yes
with_items: "{{ users }}"
tags: [add ssh keys]

问题场景:

  • support-a的 ssh 密钥遭到破坏,所有用户在其authorized_keys文件中拥有该公钥都需要替换为新的公钥
  • 我需要(sed(浏览所有keys文件,并用新的公钥替换受损的公钥

我试过了:

变量文件:

users:
- username: "bob"
sshkey:
- "{{ lookup('file', 'files/ssh_keys/admin.pub') }}"
- "{{ lookup('file', 'files/ssh_keys/support_a.pub') }}"
- "{{ lookup('file', 'files/ssh_keys/bob.pub') }}"
...
- username: "alice"
sshkey:
- "{{ lookup('file', 'files/ssh_keys/admin.pub') }}"
- "{{ lookup('file', 'files/ssh_keys/alice.pub') }}"
- "{{ lookup('file', 'files/ssh_keys/accounting_clerk.pub') }}"

但是,我在执行 ansible 角色时收到此错误:"msg": "invalid key specified: ['ssh-rsa admin-ssh-key= admin', 'ssh-rsa support-a-ssh-key= support-a', 'ssh-rsa bobs-ssh-key= hi im bob']"

我也尝试了这个(https://stackoverflow.com/a/54079374(解决方案,但我想场景和要求有点不同,在我的场景中没有什么可selectattr()的(我认为(。


谁能指出我如何解决这个问题,还是我走错了方向? 干杯。

据我所知,您的剧本中与您链接到的剧本中唯一不同的部分是"n".join()部分,它将列表折叠成一个文本块。正如 ansible 正确指出的那样,您正在为期望str的属性提供list[str]

我不相信你的情况你需要使用selectattr或任何过滤,因为你一直想要所有的键。因此:

- name: Add SSH keys
authorized_key:
user: "{{ item.username }}"
state: "{{ item.sshkeystate }}"
key: '{{ item.sshkey | join("n") }}'
exclusive: yes
with_items: "{{ users }}"
tags: [add ssh keys]

最新更新