LINUX.ORG.RU

Как в Ansible написать строку, где переменная будет обернута в фигурные { } скобки?

 , , , скобка,


0

1

В обрабатываемом файле имеется такая строка:

<Machine uuid="{5c70108e-f64c-4e8c-b8a4-a04231e24718}" 

Видно, что UUID записан в фигурных скобках.

Я пишу задачу, которая заменит этот UUID:
- name: Замена <Mashine uuid=...> 
  lineinfile:
    destfile: "{{ vmImagesPath }}/{{ item[0] }}/{{ imageFile }}.vbox"
    backrefs: yes
    regexp: '(^.*?\<Machine uuid\=\"\{)(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})(.*)'
    line: '<Machine uuid="{{{ vboxUuid.stdout }}}\3'

И последнюю строчку Ansible не может обработать, ему плохеет от трех скобок.
fatal: [hyperpc]: FAILED! => {"msg": "template error while templating string: expected token ':', got '}'. String: <Machine uuid=\"{{{ vboxUuid.stdout }}}\\3"}

Я пробовал экранировать так:
line: '<Machine uuid="\{{{ vboxUuid.stdout \}}}\3'

Тоже ошибка, но другая.
Я пробовал складывать строки так:
line: '<Machine uuid="{'+'{{ vboxUuid.stdout }}'+'}\3'

Тоже ошибка.

В общем, я никак не могу вывести значение переменной так, чтобы оно было окружено фигурными скобками. Как это сделать?

★★★★★

попробуй так: так

Whenever you have problems with conflicting characters in Ansible, a rule of thumb is to output them as a string in a Jinja expression.

So instead of {{ you would use {{ ‘{{’ }}:

router ★★★★★
()
Ответ на: комментарий от router

В общем, в моем случае правильное выражение будет такое:

  line: "<Machine uuid=\"{{ '{' }}{{ vboxUuid.stdout }}\\3"

Удивительно, но чтобы ссылка назад сработала как часть итогового регулярного выражения в выражении Jinja, её косую надо экранировать (хотя обычно экранировка делает строго противоположную вещь - превращает служебный символ в обычный символ).

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.