4

我无法做一件非常简单的事情。

在我的任务中,我试图将两个默认变量与文字字符串连接起来以创建路径

- name: "Uploading File"
  copy:
    src: "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
    dest: /opt/temp/filename.iso

这给了我一个错误。知道如何连接变量和文字字符串吗?

4

1 回答 1

12

首先,YAML

  1. 您的语法必须符合 YAML:

    字符串(标量)通常不加引号,但可以用双引号 (") 或单引号 (') 括起来。

    所以你可以写:

    parameter: value
    

    或者

    parameter: 'value'
    

    或者

    parameter: "value"
    

    以下不是有效的 YAML:

    "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
    
  2. 如果您value以花括号开头,{Ansible 将尝试将其解析为字典(YAML 是 JSON 的超集,因此用花括号括起来的字典/关联数组是有效的语法)。

    关联数组以 key: value 形式使用冒号空格 (:) 表示,每行一个或括在花括号 ({ }) 中并用逗号空格 (, ) 分隔。

    如果它不是一个有效的 JSON 数组,Ansible 将报告一个语法错误。

其次,Jinja2

  • Ansible 中的大多数参数(when作为一个值得注意的例外的值)是 Jinja2 模板(字符串)。

    要引用 Ansible-variable-value,请使用由and分隔的Jinja2 表达式(不涉及引号):{{}}

    {{ variable }}
    

    对于您的案例,有两种方法可以将字符串与变量值连接起来:

    {{ installer_iso_src_location }}/{{ installer_version }}/filename.iso
    

    或者

    {{ installer_iso_src_location + '/' + installer_version + '/filename.iso' }}
    

现在,YAML 和 Jinja2 结合起来:

  • 由于您的参数(字符串)以{字符开头并且它不是有效的 YAML/JSON 字典,因此 YAML 解析器将失败(请参阅上述 YAML 要求的第2点)。

    因此,要让 YAML 解析器将您的值视为字符串,您必须将值(Jinja2 模板)括在引号中:

    src: "{{ installer_iso_src_location }}/{{ installer_version }}/filename.iso"
    

    或者

    src: "{{ installer_iso_src_location + '/' + installer_version + '/filename.iso' }}"
    

    或单引号和双引号的其他组合。

  • 如果您的参数值以除 之外的字符串开头{,则可以不带引号使用它,如上面第1.点中的第一个示例所示。


最后,有两个值得注意的例外情况,价值不应该遵循 YAML 规则:

  • 带有键值对的模块的 Ansible 简写语法=
  • 自由格式参数,例如在commandorshell模块中
于 2017-06-25T02:31:54.770 回答