Ansible运行playbook时报变量合并失败,得到AnsibleUnicode错误
问题根因
该报错由Ansible默认的变量文件自动加载规则触发:
- Ansible扫描
host_vars/[主机名]目录时,会自动加载所有无后缀、后缀为.yml/.yaml/.json的文件作为变量源,该行为不需要你在playbook的vars_files字段中显式声明。 - 你使用的
encryption_key、id_rsa_backup、id_rsa_backup.pub均为无后缀(或后缀不在排除规则内)的vault加密文件,解密后为纯字符串格式,不符合Ansible变量要求的YAML字典结构。Ansible尝试将这些字符串内容与同目录下backup.yml加载的字典变量合并时,就会出现「期望字典但得到AnsibleUnicode」的类型冲突报错。 - 你给加密文件添加
.key/.pem等后缀后,文件不再符合Ansible自动加载的后缀规则,不会被识别为变量文件加载,自然不会触发合并冲突,这就是添加后缀后运行正常的原因。 - 其余5个正常运行的剧本,对应主机的host_vars目录下要么没有无后缀的非字典类加密文件,要么无后缀文件解密后刚好是YAML字典结构,不会触发类型冲突。
修复方案
- 方案1:给所有非变量类加密文件(密钥、证书、二进制文件等)添加非
.yml/.yaml/.json的后缀,例如.key、.pem、.bin均可,避免被Ansible自动识别为变量文件。 - 方案2:调整目录结构,将非变量类文件存放到Ansible变量自动搜索路径外的目录,例如在项目根目录新建
files/[主机名]/目录存储密钥文件,变量中引用路径对应修改即可。 - 方案3:修改
ansible.cfg的vars_plugins_enabled配置关闭host_vars自动递归加载(不推荐,会影响其他正常变量的加载逻辑)。
内容的提问来源于stack exchange,提问作者Igor Hrcek
相关产品推荐
相关产品推荐

