Napisałem podręcznik, który instaluje i konfiguruje Google Authenticator na użytkownika.
Chcę ostatni krok cat
poradnika do pliku konfiguracyjnego google_authenticator.
Za pomocą modułu „debugowanie” jestem w stanie uzyskać dane do wyświetlenia na ekranie, ale tylko jako komunikat debugowania:
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"
]
}
Czytałem online, że mogę zrobić coś takiego:
- 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 }}"
Ale po uruchomieniu pojawia się błąd:
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 ********************************************************************
Błąd mówi: „Brak cytatu końcowego”, chociaż jest cytowany. Próbowałem także:
- debug: msg= "{{ details.stdout_lines }}"
Masz pojęcie, co może być problemem?
źródło
Zaglądałem głęboko przez Internet i sprawdziłem u niektórych profesjonalistów Ansible.
O ile rozumiem, w Ansible 1.8 nie ma takiej opcji, aby przekierować wyjście polecenia na ekran jako normalne wyjście zamiast wyjścia debugowania.
źródło
Przeprowadziłem kilka testów na bloku tekstu, który miałeś powyżej - upuściłem go na miejsce i wyczyściłem dodane cytaty JSON, używając details.stdout_lines.
Jeśli „zły” tekst w pliku auth jest zawsze wiodący
\"
, to ten (przetestowany) po prostu działa, generując prawie takie same wyniki, ale z dwukropkiem zamiast tego jednego łańcucha.Teraz jest to bardzo ograniczony przypadek użycia, ale jeśli wyjście auth google jest tutaj ściśle określone (i jest całkiem możliwe, że tak jest), to powinno zrobić to, co chcesz.
Jednak nadal byłoby łatwiej i lepiej jest
var=details.stdout_lines
po prostu pobrać zawartość tutaj.źródło