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 }}"
原理说明
- 公钥列表直接传递:
authorized_key模块的key参数支持字符串或列表类型,直接传入item.publicKeys列表时,模块会自动把每个公钥写入authorized_keys文件的单独行。 - 排他性生效:
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
相关产品推荐
相关产品推荐

