如何在 Ansible 和 Vagrant 中调试“错误!意外异常:找到非十六进制数字”?

问题描述 投票:0回答:5

我在尝试使用 Ansible 运行 Vagrant 时遇到问题。这是我尝试在 Windows 7 上的终端 (git bash) 中运行

vagrant up
vagrant provision
时遇到的错误:

ERROR! Unexpected Exception: Non-hexadecimal digit found
to see the full traceback, use -vvv
Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

发生这种情况是因为

Ansible-vault
文件
.vault_pass
不是十六进制(它是一个字符串并且无法更改)。在我同事的电脑上它可以正常工作,但在我的电脑上却不能。

.vault_pass
文件中的有问题的字符串看起来像
DBAKWeG3KOr3jKjBDbAz

我猜问题出在Python上,但我不确定,也不知道如何解决它。

当我尝试添加

-vvv
时,结果是:

错误!意外异常:发现非十六进制数字
完整的回溯是:

回溯(最近一次调用最后一次):
  文件“/usr/bin/ansible-playbook”,第 92 行,位于
    exit_code = cli.run()
  文件“/usr/lib/python2.7/dist-packages/ansible/cli/playbook.py”,第 132 行,运行中
    库存=库存(加载器=加载器,variable_manager=variable_manager,host_list=self.options.inventory)
  文件“/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py”,第 85 行,在 __init__ 中
    self.parse_inventory(主机列表)
  文件“/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py”,第 144 行,在 parse_inventory 中
    group.vars = merge_vars(group.vars, self.get_group_variables(group.name))
  文件“/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py”,第 509 行,在 get_group_variables 中
    self._vars_per_group[组名称] = self._get_group_variables(组名称,vault_password=vault_password)
  文件“/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py”,第 527 行,在 _get_group_variables 中
    vars = merge_vars(vars, self.get_group_vars(group))
  文件“/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py”,第 707 行,在 get_group_vars 中
    返回 self._get_hostgroup_vars(主机=无,组=组,new_pb_basedir=new_pb_basedir)
  文件“/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py”,第 746 行,在 _get_hostgroup_vars 中
    结果= merge_vars(结果,self._variable_manager.add_group_vars_file(base_path,self._loader))
  文件“/usr/lib/python2.7/dist-packages/ansible/vars/__init__.py”,第 578 行,在 add_group_vars_file 中
    (名称,数据)= self._load_inventory_file(路径,加载器)
  文件“/usr/lib/python2.7/dist-packages/ansible/vars/__init__.py”,第 535 行,在 _load_inventory_file 中
    _found,结果= self._load_inventory_file(路径= p,加载器=加载器)
  文件“/usr/lib/python2.7/dist-packages/ansible/vars/__init__.py”,第 550 行,在 _load_inventory_file 中
    数据 = loader.load_from_file(路径)
  文件“/usr/lib/python2.7/dist-packages/ansible/parsing/dataloader.py”,第 113 行,在 load_from_file 中
    (文件数据,显示内容)= self._get_file_contents(文件名)
  文件“/usr/lib/python2.7/dist-packages/ansible/parsing/dataloader.py”,第 172 行,在 _get_file_contents 中
    数据 = self._vault.decrypt(数据)
  文件“/usr/lib/python2.7/dist-packages/ansible/parsing/vault/__init__.py”,第 169 行,解密
    b_data = this_cipher.decrypt(b_data, self.b_password)
  文件“/usr/lib/python2.7/dist-packages/ansible/parsing/vault/__init__.py”,第 674 行,解密
    数据 = unhexlify(数据)
类型错误:找到非十六进制数字
Ansible 未能成功完成。任何错误输出都应该是
上面可见。请修复这些错误并重试。
vagrant virtualbox ansible vagrant-windows ansible-vault
5个回答
9
投票

以防万一有人遇到同样的问题,我在尝试手动解密直接从 YAML 文件(或从

ansible-vault encrypt_string
的输出)复制的变量时遇到了这个问题

例如:

加密字符串:

echo -n 'all that is gold does not glitter' | ansible-vault encrypt_string
Reading plaintext input from stdin. (ctrl-d to end input)
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          61626566613637386434386364376236636636646263386561336463386132626335386335356463
          3930303065646433346431383463653663356332306564310a653464313035383335633065666462
          61303866343966613164623533323936383165623539623734316161373561383532326231623862
          6439306562306433360a633038626233376262373561333630356662386462343566346565636364
          64643961613064313964376266336330366566616435663130666135383739323962646563326336
          3062636437636664363039383436306535303939323535353163

尝试解密:

echo '$ANSIBLE_VAULT;1.1;AES256
          61626566613637386434386364376236636636646263386561336463386132626335386335356463
          3930303065646433346431383463653663356332306564310a653464313035383335633065666462
          61303866343966613164623533323936383165623539623734316161373561383532326231623862
          6439306562306433360a633038626233376262373561333630356662386462343566346565636364
          64643961613064313964376266336330366566616435663130666135383739323962646563326336
          3062636437636664363039383436306535303939323535353163' | ansible-vault decrypt --vault-password-file ./vault-env
[WARNING]: There was a vault format error in -: Vault format unhexlify error:
Non-hexadecimal digit found
ERROR! Vault format unhexlify error: Non-hexadecimal digit found for -

要修复它,只需删除开头的 YAML 缩进空格即可:

echo '$ANSIBLE_VAULT;1.1;AES256
61626566613637386434386364376236636636646263386561336463386132626335386335356463 
3930303065646433346431383463653663356332306564310a653464313035383335633065666462 
61303866343966613164623533323936383165623539623734316161373561383532326231623862 
6439306562306433360a633038626233376262373561333630356662386462343566346565636364 
64643961613064313964376266336330366566616435663130666135383739323962646563326336 
3062636437636664363039383436306535303939323535353163' | ansible-vault decrypt --vault-password-file ./vault-env 
Decryption successful
all that is gold does not glitter%

6
投票

它与加密文件末尾的 Windows 行结尾有关。 只需将最后一行结尾切换为 Unix 并保存文件即可。


5
投票

当编码文件包含回车符时,可能会出现此问题( ) 符号。

如果你通过 git 获取文件,你应该正确配置 git - 将

core.eol = lf
设置为
.gitconfig


2
投票

要添加另一个变体,这是如何发生的:拱形字符串末尾的尾随空格也可以做到这一点:

   mysql_pw: !vault |
           $ANSIBLE_VAULT;1.1;AES256
           35336630636134383938626366353162326236363966353535356361373465616364383336366536
           6630373462316336333830643331376464633961643633380a623863373966323432646236306239
           36326465343239343766363936653631643761646562306530363262633262323966623530373664
           3239376534303565340a623262646132623033383964366438633964303633363430373463633033
           3164    < spaces here

根据偶数/奇数,您也可能会得到

AnsibleVaultFormatError: Vault format unhexlify error: Odd-length string


0
投票

删除尾随空格对我有用。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.