Ansible 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 - это набор JSON, поэтому словарь / ассоциативный массив, заключенный в фигурные скобки, является допустимым синтаксисом).

    Ассоциативные массивы представляются с помощью пробела двоеточия (:) в форме ключ: значение, по одному на строку или заключаются в фигурные скобки ({ }) и разделяются пробелом (,).

    Если это не допустимый массив JSON, Ansible сообщит о синтаксической ошибке.

Во-вторых, Jinja2:

  • Большинство параметров в Ansible (значение when заметным исключением) являются шаблоны Jinja2 (строки).

    Чтобы сослаться на Ansible-variable-value, вы используете выражение Jinja2, ограниченное {{ а также }} (без кавычек):

    {{ 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 модули
Другие вопросы по тегам