如何使用Ansible和用户模块将现有公钥添加到authorized_keys文件?

时间:2017-11-12 12:52:46

标签: ssh ansible ssh-keys

我使用Ansible编写一个简单的任务来创建用户并添加现有的RSA公钥。这是我写的代码:

- name: SYSTEM - Create test user
  tags: system-user
  user: 
        name: "{{ test_user }}"
        state: present
        createhome: yes

- name: SYSTEM - Add existing pub key for test user
  tags: system-user
  copy: 
       content: "{{ test_user_pubkey }}"
       dest: "/tmp/test_user_id_rsa.pub"
       force: no
       owner: "{{ test_user }}"
       group: "{{ test_user }}"
       mode: 0600

- name: SYSTEM - Set authorized key for test_user took from file
  tags: system-user
  authorized_key:
        user: "{{ test_user }}"
        state: present
        key: "{{ lookup('file', '/tmp/test_user_id_rsa.pub') }}"

我写的代码并不优雅,我认为最好的选择是使用用户创建块添加现有的RSA公钥,以便创建和填充authorized_keys文件。

我已经读过Ansible user module但是ssh_key_file方法不包括将现有pub键的值回显到authorized_keys文件的可能性(最终目的是能够远程)使用用户和私钥连接ssh。

  

ssh_key_file =(可选)指定SSH密钥文件名。如果这是一个   相对文件名然后它将相对于用户的家   。目录

Ansible可以在用户模块中管理这个过程吗?

2 个答案:

答案 0 :(得分:3)

您的问题的答案是:

- name: SYSTEM - Create test user
  tags: system-user
  user: 
    name: "{{ test_user }}"
    state: present
    createhome: yes

- name: SYSTEM - Set authorized key for test_user took from file
  tags: system-user
  authorized_key:
    user: "{{ test_user }}"
    state: present
    key: "{{ test_user_pubkey }}"

这就是所需要的一切。

关于您阅读文档,ssh_key_file与生成SSH密钥对有关,这不是您想要的。

答案 1 :(得分:0)

所以我一直潜伏在这个线程中,试图把它缠在我的头上。然后我最终得以解决这个问题。

首先,我倾向于将所有内容都塞入字典,然后使用| dict2items每当我需要在jinja2中循环时。

我的主要问题是,一旦用户模块生成了ssh_keys,就没有干净的方法可以在不弯曲Ansible的情况下将您使用的Authorized_key模块与您刚刚制作的东西一起使用(或者,我想我可能不是这里最聪明的人)以不可能的方式(吸食?无法将另一个变量放到变量中(根据我的尝试)“” {{slurp _ {{item.key}} | b64decode}}“似乎是无法撤消的)

因此,如果您正在使用大量循环,并且不愿意将所有键复制到本地主机(这确实很耗时),那么我发现这种狡猾的trick俩并不会使您的代码阅读成为奥林匹亚挑战:

- name: Prepare the SFTP user
  user:
    name: "{{ item.key }}"
    groups: sftp_users
    home: /home/{{ item.key }}
    password: "{{ impossible_sftp_pass }}"
    generate_ssh_key: yes
    ssh_key_file: .ssh/id_rsa
    shell: /bin/nologin
  with_dict: "{{ instances }}"

- name: sneaky way to get the keys right
  shell: cat /home/{{ item.key }}/.ssh/id_rsa.pub > /home/{{ item.key }}/.ssh/authorized_keys
  args:
    creates: /home/{{ item.key }}/.ssh/authorized_keys
  with_dict: "{{ instances }}"

在此示例中,我们的目标是设置一个STFP堡垒主机,该主机最终将SFTP数据存储库重新同步到专用网络内的相应Web前端。