我正在使用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 }
如何正确引用拱形变量?因为我事先并不知道,如果拱形变量将包含单引号或双引号。
答案 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 }}
最后,对底层问题的最简单的解决方案是:不要在密码中使用特殊字符。相反,增加长度。