Ansible在其中引用带引号的变量

时间:2017-11-16 21:27:49

标签: ansible

我正在使用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:没有收盘报价

     

致命:[localhost]:失败! => {“已更改”:false,“failed”:true,“module_stderr”:“Traceback(最近一次调用最后一次):\ n文件\”/ tmp / ansible_8uz23O / ansible_module_command.py \“,第213行,位于\ 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行,在split \ n返回列表(lex)\ n File \”/ usr / lib / python2.7 / shlex.py \“,第269行,在next \ 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 \ “,第172行,在read_token \ n引发ValueError,\”没有收盘报价\“\ nValueError:没有收盘报价\ n”,“module_stdout”:“”,“msg”:“MODULE FAILURE”,“rc”:0 }

如何正确引用拱形变量?因为我事先并不知道,如果拱形变量将包含单引号或双引号。

1 个答案:

答案 0 :(得分:0)

您的问题描述尽管编写得很好,但遗憾的是错误地将问题归咎于Ansible Vault。

事实上,您报告的问题仅仅来自于尝试执行有效的任务:

- command: echo abc"def

Ansible Vault在导致此问题时没有任何作用 - 如果您直接使用foo: abc\"def定义变量,则会收到相同的错误消息。

解决方案只是引用echo命令中的字符串:

- command: echo '{{ foo }}'

除此之外,您可以使用quote filter,但对于受Vault保护的变量,您需要先设置静态事实:

- set_fact:
    bar: "{{ foo }}"
- command: echo {{ bar|quote }}

最后,对底层问题的最简单的解决方案是:不要在密码中使用特殊字符。相反,增加长度。