"Odd-length string" 的 Ansible-vault 错误

Ansible-vault errors with "Odd-length string"

我运行宁Ansible 1.8.2。 我在另一个系统上创建了一个拱形文件。在该系统上,它可以毫无问题地工作。 但是,当我在本地系统上 运行 它时,出现以下错误:

$» ansible-vault --debug view vars/vaulted_vars.yml
Vault password:
Traceback (most recent call last):
  File "/usr/bin/ansible-vault", line 225, in main
    fn(args, options, parser)
  File "/usr/bin/ansible-vault", line 172, in execute_view
    this_editor.view_file()
  File "/usr/lib/python2.7/site-packages/ansible/utils/vault.py", line 280, in view_file
    dec_data = this_vault.decrypt(tmpdata)
  File "/usr/lib/python2.7/site-packages/ansible/utils/vault.py", line 136, in decrypt
    data = this_cipher.decrypt(data, self.password)
  File "/usr/lib/python2.7/site-packages/ansible/utils/vault.py", line 545, in decrypt
    data = unhexlify(data)
TypeError: Odd-length string

ERROR: Odd-length string

我尝试手动输入密码或复制粘贴密码,但仍然出现错误。

这是怎么回事,如何解决这个错误?

原来这个错误是因为从 Ansible 1.8.2 开始,它需要对 vaulted 文件进行非常特定的行尾编码。

当我有这种类型的文件时,它会失败:

$» file vaulted_vars.yml
vaulted_vars.yml: ASCII text, with CRLF line terminators

然而,一旦我把它改成这样,它就开始工作了:

$» file vaulted_vars.yml
vaulted_vars.yml: ASCII text

整个问题的发生是因为我的 git 客户端正在更改换行符。具体见这篇文章:https://help.github.com/articles/dealing-with-line-endings/

正如上面@Mxx 所链接的那样(Thx!)我已经稀释了在 Windows 机器上使用 LF 行结尾所需的更改:

(假设您没有任何未提交的更改并且还没有 .gitattributes 文件)

# create the .gitattributes file to set the line endings only for this repo
C:\projects\lfonly>copy con .gitattributes
* text eol=lf
^Z   (thats F6 + Enter)
1 file(s) copied.

# delete all cached local file! Warning any uncommited changes will be lost
git rm --cached -r .
git reset --hard

这对我来说很管用。我能够访问保险库,而不必每次都 运行 sed。

即使使用所有这些解决方案,在我设置 EDITOR 环境变量(无论出于何种原因未在我的 Linux 发行版中设置)之前,编辑 ansible vault 文件对我不起作用:

export EDITOR="/usr/bin/vi"

确定这是否适用于您的一种方法是尝试 view 保险库文件(使用 ansible-vault view 命令)并且如果 view 工作正常但 edit没有,那么您需要将 EDITOR 环境变量设置为您喜欢的编辑器。

在我的例子中,我从 ansible-vault encrypt 的 mobaxterm 输出中复制了 vault 变量。这也包括末尾的空格。删除空格为我解决了问题。