带有引号的 Ansible 拱形变量
Posted
技术标签:
【中文标题】带有引号的 Ansible 拱形变量【英文标题】:Ansible vaulted variables with quotes in it 【发布时间】:2018-04-30 13:32:19 【问题描述】:我正在使用 Ansible 2.4。 我无法运行以下 ansible-playbook:
test.yml
---
- hosts: "localhost"
become: no
vars:
foo_withsinglequote: !vault |
$ANSIBLE_VAULT;1.1;AES256
39313737636336313832376165636465346162366333663137373165363662316263336166393666
3566643732663063386333303638633962363863306463610a643931396636613361353165653265
38376630313939626637623538613432373336646663636563623062636238313731326263336263
3138643931323662620a336534383964663562353162393930613965386465616630363335326138
3431
foo_withdoublequote: !vault |
$ANSIBLE_VAULT;1.1;AES256
64633863363838326664323238313866616161313937323563636430326432393638336334303336
3533653339663438356238613937336466623834666537630a646139643033653237353262616662
30643732313861373130633036346361663130326332303932616433643761633739306137333237
6263653365386132620a633738663336313532366637613533313361646339623137393461383363
3332
tasks:
- name: Echo foo_withsinglequote
command: echo " foo_withsinglequote "
- name: Echo foo_withdoublequote
command: echo " foo_withdoublequote "
要生成我使用的保险库变量:
$ echo 123 > vlt.txt
$ ansible-vault --vault-password-file=vlt.txt encrypt_string "abc\"def"
$ ansible-vault --vault-password-file=vlt.txt encrypt_string "abc\'def"
运行剧本:
$ ansible-playbook --vault-password-file=vlt.txt test.yml
这会出现以下错误:
任务执行期间发生异常。要查看完整的回溯,请使用 -vvv。错误是:ValueError:没有结束引号
致命:[本地主机]:失败! => "changed": false, "failed": true, "module_stderr": "Traceback (last recent call last):\n File \"/tmp/ansible_8uz23O/ansible_module_command.py\", line 213, in \n main()\n 文件 \"/tmp/ansible_8uz23O/ansible_module_command.py\",第 182 行,在 main\n args = shlex.split(args)\n 文件 \"/usr/lib/python2.7/shlex. py\",第 279 行,在拆分中\n 返回列表 (lex)\n 文件 \"/usr/lib/python2.7/shlex.py\",第 269 行,在下一个中\n token = self.get_token() \n 文件 \"/usr/lib/python2.7/shlex.py\",第 96 行,在 get_token\n raw = self.read_token()\n 文件 \"/usr/lib/python2.7/shlex. py\", line 172, in read_token\n raise ValueError, \"No close quotes\"\nValueError: No closing quotes\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc" :0
如何正确引用 Vaulted 变量?因为我事先不知道,Vaulted 变量是否会包含单引号或双引号。
【问题讨论】:
我以为我在答案中解释了您的问题与 Ansible Vault 无关,而是引用了变量...但是您编辑了答案以扩展 Vault-part。 是的,我根据您的建议更正了问题。 不,你没有。搜索“保险库”一词在您的问题中出现的次数。还要检查这个数字是否比编辑前减少。 【参考方案1】:您的问题描述尽管写得很好,但不幸的是错误地将问题归咎于 Ansible Vault。
事实上,您报告的问题只是来自尝试执行的任务,它实际上变成了:
- command: echo abc"def
Ansible Vault 不会导致此问题 - 如果您直接使用 foo: abc\"def
定义变量,您会收到相同的错误消息。
解决方法就是在echo
命令中引用字符串:
- command: echo ' foo '
除此之外你可以使用quote
filter,但是对于受保险柜保护的变量你需要先设置一个静态事实:
- set_fact:
bar: " foo "
- command: echo bar|quote
最后,解决底层问题的最简单方法是:不要在密码中使用特殊字符。改为增加长度。
【讨论】:
感谢您编辑我的问题。我更新了问题,因为我不知道变量会提前包含双引号还是单引号。 在得到答案后更改问题将使您在 StackExchange 社区中结交很多朋友。 我在原始脚本中引用了变量,但是当我制作这个最小示例时,引号不知何故丢失了。 我将尝试使用既定事实的解决方案。谢谢 这条评论:“我在原始脚本中引用了变量,但是当我做这个最小的例子时,引号不知何故丢失了。”写道:“我很草率而且我为此感到自豪,如果你因为我的马虎而浪费时间,那是你的问题,你只是个傻瓜”。我不知道你是否有意,但这是收件人理解的。这就是沟通的意义所在。你本可以保持沉默。以上是关于带有引号的 Ansible 拱形变量的主要内容,如果未能解决你的问题,请参考以下文章