我正在运行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
我尝试手动输入密码或复制粘贴密码,但错误仍然存在。
这里发生了什么以及如何解决此错误?
答案 0 :(得分:14)
原来这个错误是因为从Ansible 1.8.2开始,它需要对存储文件进行非常特定的行结束编码。
当我有这种类型的文件时,它会失败:
$» 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/
答案 1 :(得分:1)
即使使用了所有这些解决方案,编辑ansible vault文件对我来说也不起作用,直到我设置了EDITOR环境变量(无论出于何种原因,我的Linux发行版没有设置):
export EDITOR="/usr/bin/vi"
判断这是否适用于您的一种方法是尝试使用view
保险库文件(使用ansible-vault view
命令),如果view
工作正常但edit
没有&# 39; t,然后你需要将 EDITOR env变量设置为你喜欢的编辑器。
答案 2 :(得分:0)
一些使用Windows的开发人员遇到了同样的问题。即运行ERROR: Odd-length string
时出现ansible
。事实证明,包含变量的文件是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
运行sed -i 's/\r//' *_vars/*/*
后,crlf
已被删除:
user@host ~/path/to/ansible $ file *_vars/*/*
group_vars/groupname/vars: ASCII text
host_vars/hostname/vars: ASCII text
并且ansible运行成功。
答案 3 :(得分:0)
正如上面已经链接过的@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而能够访问金库。
答案 4 :(得分:0)
就我而言,我已从ansible-vault加密的mobaxterm输出中复制了Vault变量。最后还包括空格。删除空格为我解决了这个问题。