2017-06-21 36 views
1

我無法做一件非常簡單的事情。Ansible concat默認變量和文字字符串

在我的任務,我想Concat的兩個默認變量與文字字符串來創建一個路徑

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

這給了我一個錯誤。任何想法如何連接變量和文字字符串?

回答

1

首先,YAML

  1. 你的語法必須符合YAML:

    字符串(標量)是通常不帶引號的,但可能會在雙引號(「)括起來,或。單引號(')

    所以,你可以寫:

    parameter: value 
    

    parameter: 'value' 
    

    parameter: "value" 
    

    下面是不是有效的YAML:

    "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso 
    
  2. 如果您value開始用大括號{ Ansible將嘗試將其解析爲字典(YAML是sup JSON的serset,所以用大括號括起來的字典/關聯數組是一種有效的語法)。

    關聯數組使用形式爲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' }}" 
    

    或其他組合單引號和雙引號。

  • 如果您的參數值開始與比{其他字符串,你可以在第一個例子中的點上方使用它時沒有引號,因爲。


最後,有兩個顯着的例外情況是不是期望值遵循YAML規則:

  • Ansible簡寫語法與鍵 - 值對由=
  • 免費加入模塊-form參數,例如在commandshell模塊中