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

Ansible部署专属SSH密钥故障:authorized_keys仅保留最后一个密钥

问题分析与解决方案

问题根源

你当前用{{ item.publicKeys | join('\n') }}把多个公钥拼接成字符串传给authorized_key模块的key参数,这种方式会导致模块无法正确解析所有公钥,最终仅保留最后一行内容。实际上authorized_key模块原生支持直接接收公钥列表,不需要手动拼接换行符。

修正后的角色任务

修改roles/users/tasks/main.yml中的密钥部署任务,直接传递公钥列表给key参数,同时保留exclusive: true实现排他性管理:

---
- name: Create users and set passwords
  user:
    name: "{{ item.username }}"
    password: "{{ item.password | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string)}}"
    createhome: yes
    shell: /bin/bash
  with_items: "{{ users }}"

- name: 为每个用户配置排他性SSH密钥
  ansible.posix.authorized_key:
    user: "{{ item.username }}"
    key: "{{ item.publicKeys }}"
    exclusive: true
  loop: "{{ users }}"

原理说明

  1. 公钥列表直接传递:authorized_key模块的key参数支持字符串或列表类型,直接传入item.publicKeys列表时,模块会自动把每个公钥写入authorized_keys文件的单独行。
  2. 排他性生效:exclusive: true会确保目标用户的authorized_keys文件里只保留你指定的公钥。后续如果从publicKeys列表中移除某个公钥,再次执行Playbook时,该公钥会自动从服务器的文件中删除,完全满足你的需求。

验证效果

执行修正后的Playbook后,查看用户的authorized_keys文件,所有指定的公钥都会正确写入:

root@server1:/home/TestUser1/.ssh# cat /home/TestUser1/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINmGBkR7E5WNtyegqWEYcOJtbRwi64QkSewAS5oox2mT test1@local
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINmGBkR7E5WNtyegqWEYcOJtbRwi64QkSewAS5oox2mT test2@local

后续若从TestUser1的publicKeys列表中移除test1@local对应的公钥,再次执行Playbook后,该公钥会从authorized_keys文件中消失。

内容的提问来源于stack exchange,提问作者SPQRInc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:44:51