Ansible-vault错误与“奇长字符串”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible-vault错误与“奇长字符串”相关的知识,希望对你有一定的参考价值。

我正在运行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开始,它需要对拱形文件进行非常特定的行结束编码。

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

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

另一答案

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

export EDITOR="/usr/bin/vi"

找出这是否适用于你的一种方法是尝试view金库文件(使用ansible-vault view命令),如果view工作正常但edit没有,那么你需要将EDITOR env变量设置为你最喜欢的编辑器。

另一答案

一些使用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/ //' *_vars/*/*后,crlf被删除:

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

并且ansible运行成功了。

另一答案

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

(假设您没有任何未经修改的更改,也没有.gitattributes文件)

# create the .gitattributes file to set the line endings only for this repo
C:projectslfonly>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而能够访问保险库。

以上是关于Ansible-vault错误与“奇长字符串”的主要内容,如果未能解决你的问题,请参考以下文章

使用带有Ansible-Vault的加密变量进行网络自动化

使用 ansible-vault 加密私钥连接到远程主机不起作用

Ansible 安全 之加密主机清单

Ansible 加密模块 Vault

ansible 配置 vault 加密

Ansible Vault 加密