如何用Ansible为Client组主机生成SSH密钥并批量添加至Server主机?
批量将多台Client SSH公钥添加到Server的Ansible解决方案
1. 为Client组生成指定SSH密钥
先在client组主机上生成名为mykey的密钥对,使用user模块更简洁可靠:
- name: Generate 'mykey' SSH key on clients hosts: client tasks: - name: Create SSH key pair ansible.builtin.user: name: "{{ ansible_user }}" generate_ssh_key: yes ssh_key_file: .ssh/mykey ssh_key_type: ed25519 ssh_key_comment: "ansible-{{ inventory_hostname }}"
执行后,每个client的~/.ssh目录下会生成mykey(私钥)和mykey.pub(公钥),公钥内容会自动存入ansible_facts.ssh_public_key变量。
2. 批量添加公钥到Server
接着在同一个Playbook中,针对server主机,收集所有client的公钥并批量写入目标用户的authorized_keys:
- name: Add all client public keys to server hosts: server tasks: - name: Insert client public keys into authorized_keys ansible.builtin.authorized_key: user: "你的目标用户名" # 替换为Server端要授权的用户名 state: present key: "{{ item }}" loop: "{{ groups.client | map('extract', hostvars, 'ansible_facts.ssh_public_key') | list }}"
备选方案(手动生成密钥时用)
如果是用ssh-keygen命令手动生成密钥,需要先读取公钥内容再收集:
在client组任务中添加:
- name: Read 'mykey.pub' content ansible.builtin.slurp: src: "{{ ansible_user_dir }}/.ssh/mykey.pub" register: client_pub_key
然后在server组任务中解码并添加:
- name: Batch add client keys ansible.builtin.authorized_key: user: "你的目标用户名" state: present key: "{{ item.content | b64decode }}" loop: "{{ groups.client | map('extract', hostvars, 'client_pub_key') | list }}"
核心逻辑说明
groups.client:获取client组的所有主机清单map('extract', hostvars, '变量名'):从每台client的主机变量中提取公钥内容loop:遍历所有公钥,逐个添加到Server的authorized_keys,state: present会自动跳过已存在的密钥,避免重复
内容的提问来源于stack exchange,提问作者t777
相关产品推荐
相关产品推荐

