Відповідь: Чи можна "файл котів" та експортувати його на екран під час відтворення ігрової книги, а не як налагодження?


22

Я написав ігрову книжку, яка встановлює та налаштовує 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 }}"

Будь-яка ідея, в чому може бути проблема?

Відповіді:


3

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

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

Що стосується іншого питання, мені не відомий модуль для друку інших заяв, ніж debugмодуль. Ви можете перевірити , якщо Зберегти зареєстровані змінну файл варіант. Якщо ви хочете зберігати змінні Ansible на хості контролера, можна зробити щось подібне:

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

EDIT Мені потрібно трохи виправити себе. Погляньте на це серверне запитання за замовчуванням . Ви можете налаштувати висновок Ansible за допомогою callback.displayфункції. Рекомендую прочитати пов’язане повідомлення в блозі .


1

Я б сказав, що проблема полягає в тому, що лапки у файлі, який ви котируєте, невідповідні та замішані цитатам у msg. Можливо, спробуйте:

- налагодження: msg = "{{details.stdout_lines | regex_escape ()}"

або

- налагодження: msg = "{{details.stdout_lines | regex_replace ('"', '\ "')}"

Це має уникати лапок у msg, щоб лапки навколо msg співпадали між собою.

Це ще не перевірено (я не маю можливості перевірити його зараз), але ви можете спробувати це швидко і побачити.


Спробували обидва ... не вийшло.
Ітаї Ганот

Хм, я просто запустив це без моїх пропозицій вище, і отримав той самий результат, який ви мали на початку. Однак це не відображається, ви можете отримати його у форматі, відмінному від налагодження, без написання власного модуля журналу для ansible або підключення до сценарію shell або perl або чогось іншого. Цей зв'язок була хороша відповідь stackoverflow.com/questions/28564811 / ...
LSD

1

Я глибоко заглянув в Інтернет і поспілкувався з професіоналами Ansible.

Наскільки я розумію, в Ansible 1.8 немає такої опції, щоб перенаправляти вихід команди на екран як нормальний вихід, а не вихід налагодження.


2
Щодо відповіді 2.2, все ще немає можливості друкувати на екрані, крім використання налагодження.
Ітаї Ганот

0

Я провів кілька тестів на блоці тексту, який ви мали вище - скинув його на місце і очистив додані цитати json, використовуючи деталі.stdout_lines.

Якщо "поганий" текст у вашому авторському файлі завжди є провідним \", то цей (перевірений) просто виявляється спрацьовуючи, даючи майже такий же вихід, але двокрапкою замість цього одного рядка.

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

Зараз це надзвичайно обмежений випадок використання, але якщо аутентифікація аутентифікації google тут чітко визначена (і цілком можливо, що це так), то це має робити все, що ви хочете.

Однак все-таки було б простіше і бажано використовувати, var=details.stdout_linesщоб просто отримати тут вміст.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.