可以使用Ansible authorized_key独占多个键吗?

Val*_*ien 12 ubuntu authorized-keys ansible ansible-playbook

我在使用Ansible时相当新,并且一直在这里阅读谷歌并且还没有找到答案.

我的情况是我在服务器上有1个用户,但需要在其authorized_keys文件中放入2-3个不同的pub键.

我可以成功删除所有密钥,或使用此脚本添加所有密钥:

---
  - 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
Run Code Online (Sandbox Code Playgroud)

随着present标志,它读取并添加所有键.使用该absent标志,它将删除列出的所有键.

问题是我有一个仅在服务器上的旧密钥,我想删除/覆盖它,并且为将来的部署覆盖可能在服务器上而不是在我的剧本中的任何未授权密钥.

使用exclusive标志它只需要最后一个键并添加它.如果它循环并重复添加所有键,这将是太棒了.如果有一种方法可以在Ansible中执行此操作,我还没有找到它.

有没有办法循环pub文件并同时使用该exclusive选项?

Kon*_*rov 14

有没有办法循环pub文件并同时使用独占选项?

没有.有关循环的说明和文档中的独占性:

exclusive:是否从authorized_keys文件中删除所有其他未指定的键.通过用换行符分隔多个键,可以在单个键字符串值中指定它们.此选项不是循环识别的,因此如果使用with_,它将在循环的每次迭代中是独占的,如果您需要文件中的多个键,则需要将它们全部传递给单个批次中的键,如上所述.

因此,您需要加入所有密钥并立即发送所有密钥.
像这样的东西:

- name: update SSH keys
  authorized_key:
    user: <user>
    key: "{{ lookup('pipe','cat ../files/pub_keys/*.pub') }}"
    state: present
    exclusive: yes
Run Code Online (Sandbox Code Playgroud)

在生产中运行之前检查此代码!


mor*_*rxa 8

如果您想避免pipe查找(例如,因为路径与角色无关),您还可以使用filefileglob查找的组合:

- 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
Run Code Online (Sandbox Code Playgroud)

  • 使用“查询”比使用“查找”更好 - 这样您就可以避免需要“拆分”并免受不存在的路径的影响:`key:“{% for key in query('fileglob', 'pub_keys/*' ) %}{{ lookup('file', key) ~ '\n'}}{% endfor %}"` (4认同)

cze*_*asz 5

如果您将用户保存在变量中,您可以使用以下命令:

---

- 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') }}"
Run Code Online (Sandbox Code Playgroud)

看起来roles/users/vars/main.yml像这样:

---

developers:
  - name: user1
    publish_ssh_key: ssh-rsa AAAA...
  - name: user2
    publish_ssh_key: ssh-rsa AAAA...
Run Code Online (Sandbox Code Playgroud)