Назад | Перейти на главную страницу

Ansible: возможно ли «файл cat» и экспортировать его вывод на экран во время воспроизведения playbook, а не как отладка?

Я написал руководство, которое устанавливает и настраивает 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 чтобы просто получить содержимое здесь.