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

22

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

Я хочу, чтобы последний шаг playbook 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 }}"

Есть идеи, в чем может быть проблема?

Итай Ганот
источник

Ответы:

3

Цитата Дзиндзя фильтр должен решить проблему квотирования. Используйте это так:

  - debug: msg="{{ details.stdout_lines | quote }}"

Что касается другого вопроса, я не знаю модуль для печати операторов, кроме debugмодуля. Возможно, вы захотите проверить, является ли опция Сохранить зарегистрированную переменную в файл . Если вы хотите хранить переменные Ansible на хосте контроллера, можно сделать что-то вроде этого:

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

РЕДАКТИРОВАТЬ Мне нужно немного исправить себя. Посмотрите на этот вопрос о сбое сервера . Вы можете настроить выход Ansible с помощью callback.displayфункции. Я рекомендую прочитать связанный блог .

Хенрик Пингель Восстановить Монику
источник
1

Могу поспорить, что проблема в том, что кавычки в файле, который вы катаете, не совпадают и портятся в кавычках в сообщении. Может быть, попробовать:

- debug: msg = "{{details.stdout_lines | regex_escape ()}"

или

- debug: msg = "{{details.stdout_lines | regex_replace ('"', '\ "')}"

Это должно исключать кавычки в сообщении, чтобы кавычки вокруг сообщения совпадали друг с другом.

Это не было проверено (я не в состоянии проверить это прямо сейчас), но вы можете попробовать это очень быстро и увидеть.

ЛСД
источник
Пробовал оба ... не сработало.
Итай Ганот
Хм, я просто запустил его без моих предложений выше и получил тот же результат, что и в начале. Однако не похоже, что вы можете получить его в формате, отличном от отладочного, без написания своего собственного модуля журнала для ansible, или передачи по трубопроводу в сценарий оболочки или perl или что-то еще. У этой ссылки был хороший ответ stackoverflow.com/questions/28564811/…
lsd
1

Я посмотрел в Интернете и проверил с некоторыми специалистами Ansible.

Насколько я понимаю, в Ansible 1.8 нет такой опции, чтобы перенаправлять вывод команды на экран как обычный вывод, а не как отладочный вывод.

Итай Ганот
источник
2
Что касается Ansible 2.2, по-прежнему нет возможности печатать на экране, кроме как с помощью отладки.
Итай Ганот
0

Я выполнил несколько тестов над блоком текста, который вы описали выше, уронил его на место и удалил цитаты json, добавленные с помощью details.stdout_lines.

Если «плохой» текст в вашем файле аутентификации всегда является лидирующим \", то это (проверено) просто срабатывает, производя почти такой же вывод, но с двоеточием вместо этой одной строки.

- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"

Теперь это крайне ограниченный вариант использования, но если вывод Google Auth здесь строго определен (и вполне возможно, что это так), то это должно делать то, что вы хотите.

Тем не менее, все равно было бы проще и предпочтительнее использовать его, var=details.stdout_linesчтобы просто получить содержимое здесь.

Ryder
источник