Невозможно напечатать строки, соответствующие строке, используя Ansible регулярное выражение - PullRequest
1 голос
/ 15 января 2020

I sh для поиска всех записей строки, начинающейся с "SSLFile" или начинающейся с "SSLFile" в файле (httpd.conf) на удаленном хосте; зарегистрируйте его в переменной и распечатайте все найденные совпадения, используя ansible regex.

Используя модуль slurp и shell, я смог прочитать содержимое удаленного файла.

 - name: Slurp certificate entries
  slurp:
    src: "{{ httpd_home }}/conf/httpd.conf"
#    shell: "cat {{ httpd_home }}/conf/httpd.conf"
  register: filecontent

- name: Find certificate entries
  set_fact:
    input: "{{ filecontent['content'] | b64decode }}"

- name: Regex String
  set_fact:
    target: "{{ input | regex_replace('\\sSSLFile.*, '\\1') }}"

Все хорошо, кроме последняя задача регулярного выражения, где я пытаюсь найти шаблон регулярного выражения и назначить его переменной, называемой «цель». Это сразу же дает сбой и выдает следующее сообщение об ошибке debug -vvvv:

TASK [Regex String] ***************************************
task path: /app/test.yml:908
The full traceback is:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 144, in run
res = self._execute()
File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 576, in _execute
self._task.post_validate(templar=templar)
File "/usr/lib/python2.7/site-packages/ansible/playbook/task.py", line 268, in post_validate
super(Task, self).post_validate(templar)
File "/usr/lib/python2.7/site-packages/ansible/playbook/base.py", line 384, in post_validate
value = templar.template(getattr(self, name))
File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 584, in template
disable_lookups=disable_lookups,
File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 539, in template
disable_lookups=disable_lookups,
File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 773, in do_template
data = _escape_backslashes(data, myenv)
File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 145, in _escape_backslashes
for token in jinja_env.lex(d2):
File "/usr/lib/python2.7/site-packages/jinja2/lexer.py", line 733, in tokeniter
name, filename)
TemplateSyntaxError: unexpected char u'\\' at 51
line 1 fatal: [10.9.9.11]: FAILED! => {
"msg": "Unexpected failure during module execution.",
"stdout": ""
}

Не могли бы вы подсказать, как мне получить все строки, соответствующие шаблону?

1 Ответ

1 голос
/ 15 января 2020

Строка target: "{{ input | regex_replace('\\sSSLFile.*, '\\1') }}" представляет собой попытку присвоить результат замены регулярного выражения *1003* с использованием шаблона \sSSLFile.* для поиска совпадений и обратной ссылки на группу захвата 1 (\1 в шаблоне замены) для переменная target.

Использование \1 обратной ссылки неверно, поскольку шаблон регулярного выражения \sSSLFile.* не имеет единственной группы захвата , указанной с парой неэкранированных скобок .

Используйте regex_search для извлечения данных:

target: "{{ input | regex_search('\\sSSLFile.*') }}"

Чтобы получить все совпадения, используйте regex_findall:

target: "{{ input | regex_findall('\\sSSLFile.*') }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...