Ansible-vault errors with “Odd-length string”

2019-04-23 01:29发布

问题:

I'm running Ansible 1.8.2. I have a vaulted file created on another system. On that system it works without any problems. However, when I run it on my local system I get the following error:

$» 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

I tried to manually type in the password or copy-pasting it, but the error still happens.

What is going on here and how to fix this error?

回答1:

Turns out this error is because as of Ansible 1.8.2 it requires a very specific line-end encoding for the vaulted files.

When I had this type of file it would fail:

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

However, once I changed it to this, it started working:

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

This whole problem happened because my git client was changing linefeed characters. See this article for specifics: https://help.github.com/articles/dealing-with-line-endings/



回答2:

Even with all these solutions, editing ansible vault files didn't work for me until I set the EDITOR environment variable (for whatever reason it was not set on my Linux distribution):

export EDITOR="/usr/bin/vi"

One way to figure out if this applies to you is to try to view vault files (with ansible-vault view command) and if view works fine but edit doesn't, then you need to set the EDITOR env variable to your favorite editor.



回答3:

Some developers that use Windows, experienced the same issue. i.e. occurrence of ERROR: Odd-length string when running ansible. It turned out that the files that contain the variables were ASCII text, with CRLF line terminators:

user@host ~/path/to/ansible $ file *_vars/*/*
group_vars/groupname/vars: ASCII text, with CRLF line terminators
host_vars/hostname/vars:   ASCII text, with CRLF line terminators

After running sed -i 's/\r//' *_vars/*/* the crlf was removed:

user@host ~/path/to/ansible $ file *_vars/*/*
group_vars/groupname/vars: ASCII text
host_vars/hostname/vars:   ASCII text

and the ansible run succeeded.



回答4:

As already linked above by @Mxx (Thx!) I have diluted the needed changes for having on LF line endings on a Windows machine:

(Assuming you don't have any uncommited changes and no .gitattributes file yet)

# 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

That did the job for me. I was able to access the vault without having to run sed each time.



标签: ansible