Ansible concat переменная по умолчанию и литеральная строка
Я не могу сделать очень простую вещь.
В моей задаче я пытаюсь объединить две переменные по умолчанию с литеральной строкой, чтобы создать путь
- name: "Uploading File"
copy:
src: "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
dest: /opt/temp/filename.iso
Это дает мне ошибку. Любая идея, как объединить переменные и литеральные строки?
1 ответ
Во-первых, YAML
Ваш синтаксис должен соответствовать YAML:
Строки (скаляры) обычно не заключаются в кавычки, но могут быть заключены в двойные кавычки (") или одинарные кавычки (').
Так что вы можете написать:
parameter: value
или же
parameter: 'value'
или же
parameter: "value"
Следующее не является действительным YAML:
"{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
Если твой
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
модули