news 2026/3/25 14:12:45

通过ansible分发免密公钥、清理不再使用的公钥及验证公钥状态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通过ansible分发免密公钥、清理不再使用的公钥及验证公钥状态

1.分发公钥:ansible使用authorized_key模块分发ansible控制机上的ssh公钥,文件是/root/.ssh/id_rsa.pub 公钥,分发到远端节点的authorized_keys 文件中,实现免密登录。

--- - name: 为jenkins组节点配置root用户免密SSH登录 hosts: jenkins # 匹配inventory中jenkins组的节点 remote_user: root # 远程执行用户(建议用有sudo权限的普通用户,更安全) gather_facts: false # 无需收集节点信息,加快执行速度 tasks: - name: 将控制节点的公钥添加到目标节点root用户的authorized_keys ansible.builtin.authorized_key: user: root # 目标节点的用户(要配置免密的用户) state: present # 确保公钥存在(默认值,可省略) key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" # 读取控制节点的公钥文件 exclusive: false # 不删除其他已存在的公钥(重要,避免误删) manage_dir: true # 自动创建.ssh目录并设置正确权限(700)
参数作用注意事项
hosts: jenkins指定要执行的目标节点组(需在 Ansible inventory 文件中定义 jenkins 组)确保 inventory 中 jenkins 组包含正确的节点 IP / 主机名
remote_user: root远程登录目标节点的用户生产环境建议用普通用户(如 ansible)+ sudo,避免直接用 root
authorized_keyAnsible 内置模块,用于管理 SSH 授权密钥比手动拷贝更安全,自动处理权限问题
user: root目标节点上要配置免密的用户(这里是 root)若要给普通用户配置,改为对应用户名(如 jenkins)
key: "{{ lookup('file', ...) }}"读取控制节点本地的公钥文件内容确保控制节点存在/root/.ssh/id_rsa.pub文件,若不存在先执行ssh-keygen -t rsa生成
manage_dir: true自动创建目标用户的~/.ssh 目录,权限设为 700避免因目录不存在或权限错误导致免密失败
exclusive: false保留目标节点已有的其他公钥若设为 true,会删除该用户所有其他公钥,极其危险!

2.删除不再使用的公钥,通过ansible实现批量清理特定免密登录权限的目的

--- - name: 从目标节点移除指定的SSH公钥 hosts: jenkins # 匹配两个组的所有节点 become: yes # 提权到root(确保有修改/root/.ssh的权限) gather_facts: false # 无需收集节点信息,加快执行速度 tasks: - name: 移除root用户下指定的SSH公钥 ansible.builtin.authorized_key: user: root # 目标用户(要清理公钥的用户) state: absent # 标记为移除(核心参数) key: "ssh-rsa AAAAB3NzaC1yc2EddddBAQDAUvIWgBHxszilFFjKoAuHwSioRcvYTXPdm5o1kNlkb0P+hfu8IuQhzGUUqYOXAFk7d+PKF4FUVijYF52Mw2N/jG12SvzAKbJpAfXFYX3Y4Dpaq0wqEBnj4c2nXhySv3vfOOev+Cq0AYj8mvt0F0JPfQC5Qml4OfQDfH73p4ml2o83vVrlJVF9M6wUK7uRVGC8U2qTc9gddddddVT/Yy8dmx1sgdJxhkjVvNa60X29OsNw4s3jH5UIo5fIn/r1Up0Li+CkdLHGzLJWCiTe3vcZPLEEs4QCdddXuiC42LtVygoiUUVx test01" manage_dir: false # 移除公钥时无需管理.ssh目录(避免误改目录权限)

3.更换公钥场景,可通过先添加新的,在移除老的,具体如下

--- - name: 更新root用户的SSH公钥(先加新再删旧) hosts: 目标组名 # 替换为你的节点组 become: yes gather_facts: false vars: # 定义旧公钥(要移除的)和新公钥(要添加的) old_ssh_key: "ssh-rsa AAAAB3NzaC1ycdddddAAABAQDAUvIWgBHxszilFFjKoAuHwSioRcvYTXPdm5o1kNlkb0P+hfu8IuQhzGUUqYOXAFk7d+PKF4FUVijYF52Mw2N/jG12SvzAKbJpAfXFYX3Y4Dpaq0wqvL8i8l0EBnj4c2nXhySv3vfOOev+Cq0AYj8mvt0F0JPfQC5Qml4OfQDfH73p4mdddd9M6wUK7uRVGC8U2qTc9gYFdrRuySyZodBVT/Yy8dmx1sgdJxhkjVvNa60X29OsNw4s3jH5UIo5fIn/r1Up0Li+CkdLHGzLJWCiTe3vcZPLEEs4QCheZMBE6siuim7nXuiC42LtVyddddfff test01" new_ssh_key: "{{ lookup('file', '/root/.ssh/new_id_rsa.pub') }}" # 读取控制节点的新公钥文件 tasks: - name: 第一步:添加新公钥 ansible.builtin.authorized_key: user: root state: present key: "{{ new_ssh_key }}" manage_dir: true # 自动创建/修复.ssh目录权限 exclusive: false # 保留其他已存在的公钥 - name: 第二步:移除旧公钥 ansible.builtin.authorized_key: user: root state: absent key: "{{ old_ssh_key }}" manage_dir: false # 移除时无需管理目录

4.节点组的公钥状态,看是否添加或者删除

--- - name: 批量验证SSH公钥更新结果 hosts: jenkins # 替换为你的目标节点组 become: yes gather_facts: false vars: # 配置需要验证的关键信息 old_ssh_key_comment: "test01" # 旧公钥的注释(用于快速检索) new_ssh_key: "{{ lookup('file', '/root/.ssh/new_id_rsa.pub') }}" # 新公钥内容 new_ssh_key_fingerprint: "{{ new_ssh_key | regex_replace('ssh-rsa (.*) .*', '\\1') | hash('sha256') | regex_replace('^', 'SHA256:') }}" # 自动生成新公钥指纹 tasks: - name: 步骤1:检查旧公钥是否已移除 ansible.builtin.shell: | grep -q "{{ old_ssh_key_comment }}" /root/.ssh/authorized_keys && echo "旧公钥未移除" || echo "旧公钥已移除" register: old_key_check changed_when: false # 标记为非变更操作 - name: 步骤2:检查新公钥是否已添加 ansible.builtin.shell: | grep -q "{{ new_ssh_key }}" /root/.ssh/authorized_keys && echo "新公钥已添加" || echo "新公钥未添加" register: new_key_check changed_when: false - name: 步骤3:验证.ssh目录和文件权限(SSH强制要求) ansible.builtin.stat: path: "{{ item.path }}" get_checksum: false register: file_perm_check loop: - { path: "/root/.ssh", mode: "0700" } - { path: "/root/.ssh/authorized_keys", mode: "0600" } - name: 输出验证结果(汇总) ansible.builtin.debug: msg: | 节点 {{ inventory_hostname }} 验证结果: 1. 旧公钥状态:{{ old_key_check.stdout }} 2. 新公钥状态:{{ new_key_check.stdout }} 3. .ssh目录权限:{{ file_perm_check.results[0].stat.mode }} (预期:0700) 4. authorized_keys权限:{{ file_perm_check.results[1].stat.mode }} (预期:0600) 5. 新公钥指纹:{{ new_ssh_key_fingerprint }}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/23 20:25:40

BG3ModManager完整指南:轻松管理博德之门3模组

BG3ModManager完整指南:轻松管理博德之门3模组 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 还在为《博德之门3》模组冲突而烦恼吗?BG3ModManager作为专为博德…

作者头像 李华
网站建设 2026/3/23 20:20:28

AI视频画质修复的终极解决方案:ComfyUI-WanVideoWrapper替代方案全解析

在数字内容爆炸的时代,视频画质修复已成为创作者和用户的迫切需求。面对模糊的老旧视频、低分辨率的监控画面,传统的修复方法往往力不从心。本文将为你揭秘高效的AI视频增强替代方案,帮助你在不同场景下选择最适合的工具,实现从模…

作者头像 李华
网站建设 2026/3/14 14:13:17

高性能RAG架构加持,Anything-LLM响应速度实测报告

高性能RAG架构加持,Anything-LLM响应速度实测报告 在大模型日益普及的今天,一个现实问题摆在我们面前:为什么我明明上传了几十份PDF文档,问AI“去年Q3的销售策略是什么”时,它却一脸茫然地编了个答案出来? …

作者头像 李华
网站建设 2026/3/21 21:05:13

Vue3+Element Plus在现代中后台系统中的架构演进与工程实践

Vue3Element Plus在现代中后台系统中的架构演进与工程实践 【免费下载链接】element-plus-admin 基于vitetselementPlus 项目地址: https://gitcode.com/gh_mirrors/el/element-plus-admin 技术选型分析:从框架特性到业务适配 Vue3的Composition API设计哲学…

作者头像 李华
网站建设 2026/3/22 8:27:52

移动设备中arm64-v8a与DSP协作模式解析

移动设备中 arm64-v8a 与 DSP 的协同之道:从架构到实战你有没有想过,为什么你的手机能在待机状态下“听懂”一句“嘿 Siri”,却几乎不耗电?或者在录制 4K HDR 视频时,机身不过热、电池也不迅速见底?这些看似…

作者头像 李华
网站建设 2026/3/11 13:54:46

HBuilderX浏览器启动失败?超详细版环境配置完整指南

HBuilderX 浏览器启动失败?一文搞懂配置本质,彻底解决“运行不了浏览器”难题你有没有遇到过这样的场景:刚写完一段 Vue 代码,信心满满地点击 HBuilderX 的“运行到浏览器”按钮,结果却弹出一个冷冰冰的提示——“启动…

作者头像 李华