存为Ansible Vault密文的HashiCorp Vault roleid、secretid调用时报unhexlify错误
Vault format unhexlify error: Odd-length string 报错的核心原因是Ansible Vault加密生成的十六进制密文总长度为奇数。Ansible解析AES256加密的十六进制串时,要求每两个字符对应一个字节,长度必须为偶数,长度异常时会直接抛出解析失败错误。
检查YAML标量标识使用是否正确
你当前使用了YAML折叠标量符>,该标识会将多行内容的换行符自动替换为空格,导致原本连续的十六进制密文中间被插入多余空格,破坏了密文连续性,最终计算得到的长度异常。
修复方案:将>替换为块标量符|(保留换行格式,不会插入多余空格),或者直接将密文内容写为单行,确保十六进制串不存在多余的空格、换行符。检查密文内容完整性
确认你复制密文时没有出现漏复制、多复制字符的情况(比如末尾多余的空格、换行,或者打码时误修改了实际密文内容)。可以将密文内容中的所有换行、空格移除后统计字符数,如果结果为奇数,说明密文已经被破坏,需要重新生成。验证加密流程合规性
不要手动编辑Ansible Vault密文内容,建议直接通过官方命令生成对应变量的加密串,命令示例:ansible-vault encrypt_string '你的实际secret_id明文' --name 'secret_id'直接将命令输出的完整内容复制到清单文件即可,不要手动调整格式、换行,避免破坏密文结构。
排查明文字符特殊情况
如果你的secret_id明文包含非ASCII字符、特殊转义符,加密前需要用单引号包裹明文再执行加密操作,避免转义异常导致密文长度错误。
修复完成后,先通过ansible-vault view 清单文件路径命令尝试读取该变量,如果可以正常解密输出明文,说明格式已经符合要求,再运行剧本即可正常调用变量。
内容的提问来源于stack exchange,提问作者Sid

