Я пытаюсь настроить маршрутизатор Mikrotik с помощью Ansible — в рамках этой задачи мне нужно сгенерировать реальную команду, которая отправляется на маршрутизатор. И каким-то образом некоторые кавычки просто... исчезают из моей строки после того, как Ansible анализирует ее.
[Редактировать - это, кажется, связано с jinja2_native
. Подробности смотрите в конце вопроса ]
Минимальный пример, который мне удалось собрать, демонстрирующий проблему, таков:
- hosts: localhost
gather_facts: false
tasks:
- vars:
port: 20200
cmd: >
add chain=dstnat && dst-port="{{port}}"
comment="%TR% - {{ansible_host}} - SSH for {{inventory_hostname}}"
dst-port="{{ port }}" protocol=tcp
}'
debug:
msg: "{{cmd}}"
При запуске этой пьесы вот результат:
# ansible-playbook test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [localhost] *****************************************************************************************************************
TASK [debug] *********************************************************************************************************************
Wednesday 29 April 2020 23:07:52 +0300 (0:00:00.052) 0:00:00.052 *******
ok: [localhost] => {
"msg": "add chain=dstnat && dst-port=\"20200\" comment=\"%TR% - 127.0.0.1 - SSH for localhost dst-port=20200\" protocol=tcp }'\n"
}
Обратите внимание, что некоторые кавычки исчезли, и в результате количество аргументов в команде полностью изменилось. (и, конечно же, я заметил это только после того, как потратил несколько часов на устранение неполадок и задавался вопросом, почему команда не работает...)
Интересно, что если я немного изменю текст, другие кавычки исчезнут:
- hosts: localhost
gather_facts: false
tasks:
- vars:
port: 20200
cmd: >
add chain=dstnat && dst-port="{{port}}"
comment="{{ansible_host}} - SSH for {{inventory_hostname}}"
dst-port="{{ port }}" protocol=tcp
}'
debug:
msg: "{{cmd}}"
tags:
- networking
# ansible-playbook test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [localhost] *****************************************************************************************************************
TASK [debug] *********************************************************************************************************************
Wednesday 29 April 2020 23:12:12 +0300 (0:00:00.031) 0:00:00.031 *******
ok: [localhost] => {
"msg": "add chain=dstnat && dst-port=\"20200 comment=127.0.0.1 - SSH for localhost dst-port=20200\" protocol=tcp }'\n"
}
Кажется, что всякий раз, когда у меня есть последовательность, подобная }}" text_here "{{
, кавычки исчезают...
Мои вопросы:
- Может ли кто-нибудь сказать мне, почему это происходит?
- Может ли кто-нибудь посоветовать мне, как я могу избежать этой проблемы? Я пробовал многострочные строки (с двойными кавычками, одинарными кавычками, > складыванием и т. д.) - тот же результат...
[ Редактировать: просматривая все недавние изменения, которые могли вызвать это, я вспомнил, что включил jinja2_native
. И действительно, после установки jinja2_native
обратно в False в ansible.cfg
проблема исчезает...
# ansible-playbook test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [localhost] *****************************************************************************************************************
TASK [debug] *********************************************************************************************************************
Wednesday 29 April 2020 23:55:29 +0300 (0:00:00.029) 0:00:00.029 *******
ok: [localhost] => {
"msg": "add chain=dstnat && dst-port=\"20200\" comment=\"127.0.0.1 - SSH for localhost \" dst-port=\"20200\" protocol=tcp }'\n"
}
]
jinja2_native
- person Bogd   schedule 30.04.2020