是否可以将Ansible authorized_key与多个密钥一起使用?

时间:2016-08-10 16:48:15

标签: ubuntu ansible ansible-playbook authorized-keys

我在使用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选项?

4 个答案:

答案 0 :(得分:10)

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

没有。在docs中有关于循环和独占的说明:

  

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

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

Rating

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

答案 1 :(得分:3)

如果您想避免pipe查找(例如,因为路径与角色无关),您还可以使用filefileglob查找的组合:< / 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