使用 Ansible 中的 authorized_key 模块将多个 public ssh 密钥分配给用户定义
Assign multiple public ssh keys to user definitions with authorized_key module in Ansible
问题:
使用 Ansible,我如何设置多个 public-key 文件 (.pub
) 部署在用户的 authorized_keys
文件中,而不是使用包含列表的单个文件public ssh 密钥?
场景及要求:
- 我有多个 public ssh-keys 作为
.pub
文件存储在中央位置
- 我想从
vars
文件创建新用户
- 每个用户应从选择的
.pub
个文件中选择 (none/one specific/multiple) public 个 ssh-keys 部署到他们各自的 authorized_keys
文件
- 已部署的
.pub
文件列表可能会因以下原因发生变化:
.pub
文件的内容已更改,例如。泄露的私钥
vars
文件中的用户应分配额外的 public 密钥文件
- 我不想通过 "list" 文件为每个用户替换密钥
当前部署:
变量文件 (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 角色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
文件中拥有该 public 密钥的用户都需要用新的 public 密钥替换
- 我需要 (
sed
) 遍历所有 keys
文件并将受损的 public 密钥替换为新密钥
我试过了:
变量文件:
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']"
我也尝试了一些与此 () 解决方案类似的方法,但我想场景和要求有点不同,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]
问题:
使用 Ansible,我如何设置多个 public-key 文件 (.pub
) 部署在用户的 authorized_keys
文件中,而不是使用包含列表的单个文件public ssh 密钥?
场景及要求:
- 我有多个 public ssh-keys 作为
.pub
文件存储在中央位置 - 我想从
vars
文件创建新用户 - 每个用户应从选择的
.pub
个文件中选择 (none/one specific/multiple) public 个 ssh-keys 部署到他们各自的authorized_keys
文件 - 已部署的
.pub
文件列表可能会因以下原因发生变化:.pub
文件的内容已更改,例如。泄露的私钥vars
文件中的用户应分配额外的 public 密钥文件
- 我不想通过 "list" 文件为每个用户替换密钥
当前部署:
变量文件 (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 角色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
文件中拥有该 public 密钥的用户都需要用新的 public 密钥替换- 我需要 (
sed
) 遍历所有keys
文件并将受损的 public 密钥替换为新密钥
我试过了:
变量文件:
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']"
我也尝试了一些与此 (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]