我在使用Ansible方面相当新,一直在阅读here和谷歌,还没有找到答案。
我的场景是,我在服务器上有1个用户,但需要将2-3个不同的公钥放入其authorized_keys文件中。
我可以成功地删除所有键,或者使用此脚本添加所有键:
---
- hosts: all
tasks:
- name: update SSH keys
authorized_key:
user: <user>
key: "{{ lookup('file', item) }}"
state: present
#exclusive: yes
with_fileglob:
- ../files/pub_keys/*.pub
使用present
标志读取并添加所有键,使用absent
标志删除列出的所有键。
问题是,我有一个旧的密钥,只在服务器上,我想删除/覆盖它,并为未来的部署覆盖任何未经授权的密钥,可能是在服务器上,而不是在我的剧本。
使用exclusive
标志,它只需要最后一个键并添加它。如果它可以循环并重复添加所有键,那就太棒了。如果有一种方法可以在Ansible中做到这一点,我还没有找到它。
有没有办法在pub文件上循环并同时使用exclusive
选项?
6条答案
按热度按时间raogr8fs1#
没有。docs中有一个关于循环和互斥的注解:
**exclusive:**是否从authorized_keys文件中删除所有其他未指定的key。可以在一个key字符串值中指定多个key,用换行符分隔它们。该选项不支持循环,所以如果与_一起使用,它将在循环的每次迭代中是独占的,如果您希望文件中有多个key,则需要将它们全部传递给key,如上所述。
因此,您需要将所有密钥连接起来,并一次性发送所有密钥。
大概是这样的
在生产环境中运行之前请检查此代码!
vmdwslir2#
如果你想避免
pipe
查找(例如,因为路径不是相对于角色的),你也可以使用file
和fileglob
查找的组合:mnowg1ta3#
如果你把你的用户放在一个变量中,你可以使用这个:
roles/users/vars/main.yml
看起来像这样:ljsrvy3e4#
正如我在另一个答案(Ansible -为多个用户和角色管理多个SSH密钥)中所写的那样,这是我解决这个问题的方法。
我将一个变量中的文件名数组传递给我的
user-account
角色,然后该角色获取每个文件的内容,将它们附加到一个换行符分隔的字符串中,最后将该值设置为新用户的ssh-key。.
Playbook文件:
.
user-account
的角色定义:nhjlsmyf5#
与前面的答案相同的基本概念,但只使用变量并从github或gitlab等url中提取密钥。
guz6ccqo6#
我创建了一个简单的剧本,在那里我需要icewrap用户的特定路径。