Ana*_*Rao 2 yaml jinja2 ansible ansible-template
我无法做一件非常简单的事情.
在我的任务中,我试图用文字字符串连接两个默认变量来创建路径
- name: "Uploading File"
copy:
src: "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
dest: /opt/temp/filename.iso
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误.知道如何连接变量和文字字符串吗?
首先,YAML
您的语法必须符合YAML:
字符串(标量)通常不加引号,但可以用双引号(")或单引号(')括起来.
所以你可以写:
parameter: value
Run Code Online (Sandbox Code Playgroud)
要么
parameter: 'value'
Run Code Online (Sandbox Code Playgroud)
要么
parameter: "value"
Run Code Online (Sandbox Code Playgroud)
以下不是有效的YAML:
"{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
Run Code Online (Sandbox Code Playgroud)如果value以大括号开头,{Ansible将尝试将其解析为字典(YAML是JSON的supserset,因此用大括号括起来的字典/关联数组是有效的语法).
关联数组使用冒号空格(:)表示,形式为key:value,每行一个或用花括号({}括起来)并用逗号空格(,)分隔.
如果它不是有效的JSON数组,Ansible将报告语法错误.
其次,Jinja2:
Ansible中的大多数参数(值when是一个值得注意的例外)是Jinja2模板(字符串).
要引用Ansible-variable-value,请使用由and 分隔的Jinja2表达式(不含引号):{{}}
{{ variable }}
Run Code Online (Sandbox Code Playgroud)
对于您的案例,有两种方法可以将字符串与变量值连接起来:
{{ installer_iso_src_location }}/{{ installer_version }}/filename.iso
Run Code Online (Sandbox Code Playgroud)
要么
{{ installer_iso_src_location + '/' + installer_version + '/filename.iso' }}
Run Code Online (Sandbox Code Playgroud)现在,YAML和Jinja2合并:
由于您的参数(字符串)以{字符开头并且它不是有效的YAML/JSON字典,因此YAML解析器将失败(请参阅上述YAML要求的第2点).
结果,要使您的值被YAML解析器视为字符串,您必须将值(Jinja2模板)括在引号中:
src: "{{ installer_iso_src_location }}/{{ installer_version }}/filename.iso"
Run Code Online (Sandbox Code Playgroud)
要么
src: "{{ installer_iso_src_location + '/' + installer_version + '/filename.iso' }}"
Run Code Online (Sandbox Code Playgroud)
或单引号和双引号的其他组合.
如果您的参数值开始比其他的字符串{,你可以在第一个例子中的点使用时没有引号,如1以上.
最后,有两个值得注意的例外情况,其中预计价值不会遵循YAML规则:
=command或shell模块中