带有引号的 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 拱形变量的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Ansible 转义双引号和单引号

ansible playbook在服务器怎么执行

ansible基础学习,常用模块概述

ansible - 如果跳过播放,则不提示输入变量