如何通过Ansible简便实现两台远端主机间公钥添加到authorized_keys
问题原因说明
lookup() 插件默认在Ansible控制节点本地执行,delegate_to 参数不会作用于lookup逻辑,所以你之前的代码拿到的始终是控制节点的公钥。
正确实现方案
不需要把公钥先存到控制节点本地,直接通过两个任务即可完成跨主机公钥同步:
- 首先用
slurp模块从远端主机A读取公钥,该模块会在目标远端主机上执行文件读取操作,返回结果为base64编码的文件内容
- name: 读取远端主机A的ed25519公钥 ansible.builtin.slurp: src: ~/.ssh/id_ed25519.pub register: host_a_pubkey delegate_to: "{{ backups_host }}" when: backups_host is defined
- 再用
authorized_key模块把解码后的公钥写入远端主机B的授权列表,该模块会自动处理文件权限、避免重复插入相同公钥,比手动修改文件更安全
- name: 将主机A的公钥添加到主机B的授权列表 ansible.posix.authorized_key: user: "{{ host_b_user }}" # 替换为你要授权的主机B的登录用户名 state: present key: "{{ host_a_pubkey.content | b64decode | trim }}" when: - backups_host is defined - host_a_pubkey.content is defined
补充说明
如果公钥所属用户和你Ansible登录主机A的用户不一致,需要把公钥路径替换为绝对路径,比如 /home/对应用户名/.ssh/id_ed25519.pub,避免 ~ 解析到错误的用户目录。
内容的提问来源于stack exchange,提问作者Andrius
相关产品推荐
相关产品推荐

