我使用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可以在用户模块中管理这个过程吗?
答案 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前端。