Ansible многострочная строка с несколькими кавычками

Я пытаюсь настроить маршрутизатор 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 "{{, кавычки исчезают...

Мои вопросы:

  1. Может ли кто-нибудь сказать мне, почему это происходит?
  2. Может ли кто-нибудь посоветовать мне, как я могу избежать этой проблемы? Я пробовал многострочные строки (с двойными кавычками, одинарными кавычками, > складыванием и т. д.) - тот же результат...

[ Редактировать: просматривая все недавние изменения, которые могли вызвать это, я вспомнил, что включил 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"
}

]


person Bogd    schedule 29.04.2020    source источник
comment
ansible v2.9.5 / python 3.6.9 => Я не могу воспроизвести вашу проблему. Строки выводятся точно так, как ожидалось.   -  person Zeitounator    schedule 29.04.2020
comment
@Zeitounator - у меня есть еще одно изменение конфигурации, которое может иметь значение. См. мою более позднюю правку относительно jinja2_native   -  person Bogd    schedule 30.04.2020


Ответы (1)


Мне удалось получить ответ на github — большое спасибо sivel за это!

Я также размещаю его здесь, для справки.

«[re] была проблема с вышестоящим jinja2, которая была решена в jinja2 2.11».

Еще несколько ссылок по теме: см. здесь и здесь.

person Bogd    schedule 29.04.2020
comment
Спасибо за это, потому что я собирался опубликовать: я все еще не могу воспроизвести проблему :) - person Zeitounator; 30.04.2020
comment
@Zeitounator - я должен был упомянуть об этом в вопросе, но я использую ansible, установленный через apt в Ubuntu 18.04. И jinja2 из репозиториев Ubuntu, кажется, все еще находится на версии 1.10. Не могли бы вы поделиться информацией о вашем окружении? Может пора и мне поменяться... :) - person Bogd; 30.04.2020
comment
Я всегда устанавливаю через pip, никогда через системные пакеты, независимо от дистрибутива. Это гораздо удобнее, а с помощью virtualenvs и пользовательских установок вы можете управлять любым количеством версий и компоновкой зависимостей библиотек для любого пользователя в системе. Вот как я это делаю для один для CI моей роли со следующим requirements.txt - person Zeitounator; 30.04.2020
comment
Похоже, мне определенно стоит подумать о смене окружения :). Большое спасибо за все подробности! - person Bogd; 30.04.2020