Я написал руководство, которое устанавливает и настраивает Google Authenticator для каждого пользователя.
Я хочу, чтобы последний шаг сценария cat
файл конфигурации google_authenticator.
Используя модуль «отладки», я могу получить данные, которые будут отображаться на экране, но только в виде сообщения отладки:
TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
"details.stdout_lines": [
"ZKMFTE2ADYA2OYCH",
"\"RATE_LIMIT 3 30",
"\" DISALLOW_REUSE",
"\" TOTP_AUTH",
"12920994",
"88224784",
"69464205",
"38144121",
"45634120"
]
}
Я прочитал в Интернете, что могу сделать что-то подобное:
- name: Print to screen google authenticator details
command: /bin/cat {{ google_authenticator_secret_file_location }}
register: details
tags: google_2fa_user
- debug: msg="{{ details.stdout_lines }}"
Но при запуске выдает ошибку:
TASK: [Print to screen google authenticator details] **************************
changed: [localhost]
TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
exec_rc = self._executor_internal(host, new_stdin)
File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
kv = utils.parse_kv(module_args)
File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
File "/usr/lib/python2.7/shlex.py", line 279, in split
return list(lex)
File "/usr/lib/python2.7/shlex.py", line 269, in next
token = self.get_token()
File "/usr/lib/python2.7/shlex.py", line 96, in get_token
raw = self.read_token()
File "/usr/lib/python2.7/shlex.py", line 172, in read_token
raise ValueError, "No closing quotation"
ValueError: No closing quotation
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
Ошибка говорит: «Нет заключительной цитаты», хотя она цитируется. Также пробовал:
- debug: msg= "{{ details.stdout_lines }}"
Есть идеи, в чем может быть проблема?
В цитировать фильтр Jinja должен решить проблему цитирования. Используйте это так:
- debug: msg="{{ details.stdout_lines | quote }}"
Что касается другого вопроса, я не знаю модуля для печати операторов, кроме debug
модуль. Вы можете проверить, есть ли Сохранить зарегистрированную переменную в файл это вариант. Если вы хотите хранить переменные Ansible на хосте контроллера, можно сделать что-то вроде этого:
- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file
РЕДАКТИРОВАТЬ Мне нужно немного поправиться. Взгляни на этот вопрос serverfault. Вы можете настроить вывод Ansible, используя callback.display
функция. Я рекомендую прочитать ссылку Сообщение блога.
Я глубоко просмотрел Интернет и посоветовался с некоторыми профессионалами Ansible.
Насколько я понимаю, в Ansible 1.8 нет такой опции, чтобы перенаправлять вывод команды на экран как обычный вывод, а не вывод отладки.
Я готов поспорить, что проблема в том, что цитаты в файле, который вы размещаете, не совпадают и не соответствуют кавычкам в сообщении. Может попробовать:
- debug: msg="{{ details.stdout_lines | regex_escape() }"
или
- debug: msg="{{ details.stdout_lines | regex_replace('"', '\"') }"
Это должно избегать кавычек в сообщении, чтобы кавычки вокруг сообщения соответствовали друг другу.
Это не было протестировано (я не в состоянии проверить это прямо сейчас), но вы можете попробовать это очень быстро и убедиться.
Я провел несколько тестов с блоком текста, который вы указали выше - поместил его на место и удалил кавычки json, добавленные с помощью details.stdout_lines.
Если "плохой" текст в вашем файле аутентификации всегда является ведущим \"
, то это (проверено) просто работает, производя почти такой же результат, но с двоеточием вместо этой строки.
- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"
Теперь это чрезвычайно ограниченный вариант использования, но если вывод google auth здесь строго определен (и это вполне возможно), тогда это должно делать то, что вы хотите.
Однако все равно было бы проще и предпочтительнее использовать var=details.stdout_lines
чтобы просто получить содержимое здесь.