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