Ansible concat默认变量和文字字符串

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)

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

tec*_*raf 6

首先,YAML

  1. 您的语法必须符合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)
  2. 如果value以大括号开头,{Ansible将尝试将其解析为字典(YAML是JSON的supserset,因此用大括号括起来的字典/关联数组是有效的语法).

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

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

其次,Jinja2:

现在,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规则:

  • 具有键值对的模块的Ansible简写语法 =
  • 自由格式参数,例如在commandshell模块中