Я пытаюсь настроить маршрутизатор 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 "{{
, кавычки исчезают ...
Мои вопросы:
- Может кто-нибудь сказать мне, почему такое случается?
- Может кто-нибудь посоветовать мне, как мне избежать этой проблемы? Я пробовал многострочные строки (с двойными кавычками, одинарные кавычки,> сворачивание и т. Д. c) - тот же результат ...
[Редактировать: при просмотре всех последних изменений, которые могли вызвать это я вспомнил, включив 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"
}
]