我在使用Ansible方面相当新,并且一直在阅读here和谷歌,但尚未找到答案。
我的情况是我在服务器上有1个用户,但有2-3个不同的pub密钥需要放入其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
选项?
答案 0 :(得分:10)
有没有办法循环使用pub文件并同时使用exclusive选项?
没有。在docs中有关于循环和独占的说明:
exclusive:是否从authorized_keys文件中删除所有其他未指定的密钥。通过用换行符分隔多个键,可以在单个键字符串值中指定它们。 这个选项不是循环识别的,所以如果你使用with_,它将在循环的每次迭代中是独占的,如果你想要文件中的多个键,你需要将它们全部传递给单个批次中的键,如上所述。
因此,您需要加入所有密钥并立即发送所有密钥 像这样:
Rating
在生产中运行之前检查此代码!
答案 1 :(得分:3)
如果您想避免pipe
查找(例如,因为路径与角色无关),您还可以使用file
和fileglob
查找的组合:< / p>
- name: update SSH keys
authorized_key:
user: <user>
key: "{% for key in lookup('fileglob', 'pub_keys/*.pub').split(',') %}{{ lookup('file', key) ~ '\n'}}{% endfor %}"
state: present
exclusive: yes
答案 2 :(得分:2)
如果您将用户置于变量中,则可以使用此选项:
---
- hosts: all
vars_files:
- roles/users/vars/main.yml
tasks:
- name: Allow other users to login to the account
authorized_key:
user: user_name
exclusive: yes
key: "{{ developers|map(attribute='publish_ssh_key')|join('\n') }}"
roles/users/vars/main.yml
看起来像这样:
---
developers:
- name: user1
publish_ssh_key: ssh-rsa AAAA...
- name: user2
publish_ssh_key: ssh-rsa AAAA...
答案 3 :(得分:0)
正如我在其他答案(Ansible - managing multiple SSH keys for multiple users & roles上所写的那样),这就是我为用例解决此问题的方式。也许在这里有用吗?
我将变量中的文件名数组传递给我的user-account
角色。然后,角色将获取每个文件的内容,将它们一起添加到以换行符分隔的字符串中,然后最终将该值设置为新用户的ssh键。
。
剧本文件:
- hosts: aws-node1
roles:
- { role: user-account, username: 'developer1', ssh_public_keyfiles: ['peter-sshkey.pub', 'paul-sshkey.pub'] }
。
user-account
的角色定义:
- name: add user
user:
name: "{{username}}"
- name: lookup ssh pubkeys from keyfiles and create ssh_pubkeys_list
set_fact:
ssh_pubkeys_list: "{{ lookup('file', item) }}"
with_items:
"{{ssh_public_keyfiles}}"
register: ssh_pubkeys_results_list
- name: iterate over ssh_pubkeys_list and join into a string
set_fact:
ssh_pubkeys_string: "{{ ssh_pubkeys_results_list.results | map(attribute='ansible_facts.ssh_pubkeys_list') | list | join('\n') }}"
- name: update SSH authorized_keys for user {{ username }} with contents of ssh_pubkeys_string
authorized_key:
user: "{{ username }}"
key: "{{ ssh_pubkeys_string }}"
state: present
exclusive: yes