You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:35:15