如何使用Ansible在RHEL 8中导入GPG密钥并解决相关报错
RHEL 8系统下通过Ansible导入GPG密钥操作问题
问题场景
尝试使用Ansible rpm_key模块导入FireEye GPG密钥后安装对应Agent安装包,持续出现GPG签名校验失败报错。
初始编写的Playbook代码如下:
- name: Import the FireEye GPG Key from a file rpm_key: state: present key: /tmp/buildfiles/antivirus/fireeye-key.gpg - name: Install FireEye Agent package yum: name: /tmp/buildfiles/antivirus/fireeye/xagt-34.28.6-1.el7.x86_64.rpm state: present
报错复现记录
- 直接复制官网密钥原始内容保存为
fireeye-key.gpg文件执行,报错信息:
fatal: [default]: FAILED! => {"changed": false, "msg": "Failed to validate GPG signature for xagt-33.46.0-1.el7.x86_64"}
- 删除密钥文件第二行、倒数第二行空行后再次执行,报错信息:
fatal: [default]: FAILED! => {"changed": false, "msg": "gpg: directory '/root/.gnupg' created\ngpg: keybox '/root/.gnupg/pubring.kbx' created\ngpg: WARNING: no command supplied. Trying to guess what you mean ...\ngpg: invalid armor header: mQINBFu7nVUBEADC6YSWxdVWbh3Aeh+2vkJpFeRe8hnvx38tUcbYqO9sm3y/NDTA\\n\ngpg: /root/.gnupg/trustdb.gpg: trustdb created\n"}
- 跳过密钥导入步骤直接安装RPM包,同样报错:
fatal: [default]: FAILED! => {"changed": false, "msg": "Failed to validate GPG signature for xagt-34.28.6-1.el7.x86_64"}
问题根因与修复方案
核心根因
- 报错中出现的
invalid armor header直接指向密钥文件格式损坏:手动从网页复制的密钥内容包含转义字符(报错信息中的\\n说明文件内存储的是字面量反斜杠加字符n,而非真实换行符)、多余格式字符,不符合ASCII装甲GPG密钥的格式规范,导致GPG/RPM无法正确识别密钥内容,最终导入失败。 - 签名校验失败的本质原因是密钥未正确导入RPM信任库,无法完成安装包的签名校验。
- 额外注意:当前使用的是适配RHEL7/CentOS7的
el7版本安装包,在RHEL8系统上安装即使密钥校验通过,也可能出现依赖冲突问题,优先获取适配RHEL8的el8版本安装包使用。
落地修复步骤
- 获取标准格式的GPG密钥
禁止手动复制网页上的密钥文本保存,直接在目标环境通过命令下载并转换为标准密钥格式,确保密钥文件严格以-----BEGIN PGP PUBLIC KEY BLOCK-----开头、-----END PGP PUBLIC KEY BLOCK-----结尾,中间无多余转义字符、无效空行:# 从官方密钥地址下载后直接转换为标准GPG密钥格式,避免复制引入的格式错误 curl -s 官方密钥页面地址 | gpg --dearmor > /tmp/buildfiles/antivirus/fireeye-key.gpg # 本地校验密钥是否可被GPG正常识别,无输出报错则格式正确 gpg --show-keys /tmp/buildfiles/antivirus/fireeye-key.gpg - 修正Playbook逻辑
增加密钥有效性校验、导入结果校验步骤,避免无效执行:- name: Verify local GPG key file format is valid ansible.builtin.command: gpg --show-keys /tmp/buildfiles/antivirus/fireeye-key.gpg changed_when: false - name: Import FireEye GPG key to RPM trust store ansible.builtin.rpm_key: state: present key: /tmp/buildfiles/antivirus/fireeye-key.gpg - name: Confirm key is successfully imported ansible.builtin.command: rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE} -> %{SUMMARY}\n' | grep -i fireeye changed_when: false - name: Install FireEye Agent (replace with el8 version package for RHEL8) ansible.builtin.yum: name: /tmp/buildfiles/antivirus/fireeye/xagt-对应版本.el8.x86_64.rpm state: present # 测试阶段可临时开启下方配置跳过GPG校验,生产环境必须注释 # disable_gpg_check: true - 可选简化方案
如果本地文件导入始终存在格式问题,可以直接在rpm_key模块中指定官方公钥的直链地址,跳过本地文件存储环节,从根源避免文件复制过程中的格式损坏:- name: Import FireEye GPG key directly from official source ansible.builtin.rpm_key: state: present key: 官方GPG公钥直链地址
排查技巧
如果执行后仍然报签名校验错误,先在目标机手动执行rpm --import /tmp/buildfiles/antivirus/fireeye-key.gpg导入密钥,再执行rpm -K /path/to/xagt.rpm查看安装包的本地校验结果,如果手动执行仍然校验失败,说明使用的密钥和安装包版本不匹配,需要重新获取对应安装包版本的签名密钥。
内容的提问来源于stack exchange,提问作者Brian G
相关产品推荐
相关产品推荐

