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

时间:2017-06-21 21:36:50

标签: ansible yaml jinja2 ansible-template

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

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

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

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

1 个答案:

答案 0 :(得分:6)

首先, 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将报告语法错误。

  3. 其次, 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规则:

    • 具有由=
    • 加入的键值对的模块的Ansible速记语法
    • 自由格式参数,例如commandshell模块