Ansible многострочная строка с несколькими кавычками - PullRequest
2 голосов
/ 29 апреля 2020

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

]

1 Ответ

2 голосов
/ 30 апреля 2020

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

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

" [Re] была проблема с вышестоящей jinja2, которая была решена в jinja2 2.11. "

Еще несколько ссылок, относящихся к этой проблеме: см. здесь и здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...