Odpowiedź: Czy można „plik kota” i wyeksportować go do ekranu podczas gry w playbook, a nie jako debugowanie?

22

Napisałem podręcznik, który instaluje i konfiguruje Google Authenticator na użytkownika.

Chcę ostatni krok catporadnika 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?

Itai Ganot
źródło

Odpowiedzi:

3

Cytat filtr Jinja powinno rozwiązać problem cytowania. Użyj tego w ten sposób:

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

W przypadku drugiego pytania nie znam modułu do drukowania instrukcji innych niż debugmoduł. Możesz sprawdzić, czy opcja Zapisz zarejestrowaną zmienną do pliku jest opcją. Jeśli chcesz przechowywać zmienne Ansible na hoście kontrolera, możesz zrobić coś takiego:

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

EDYCJA Muszę się trochę poprawić. Spójrz na to pytanie o awarię serwera . Korzystając z tej callback.displayfunkcji, możesz ulepszyć wyjście Ansible . Polecam przeczytanie linku do blogu .

Henrik Pingel Przywróć Monikę
źródło
1

Założę się, że problem polega na tym, że cytaty w pliku, który cat'ing są niedopasowane i bałagan z cytatami w msg. Może spróbuj:

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

lub

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

Powinno to unikać cudzysłowów w msg, aby cudzysłowy wokół msg były do ​​siebie dopasowane.

To nie zostało przetestowane (nie jestem teraz w stanie go przetestować), ale możesz spróbować naprawdę szybko i przekonaj się.

LSD
źródło
Próbowałem obu ... nie działa.
Itai Ganot
Hmm, po prostu uruchomiłem go bez moich sugestii powyżej i uzyskałem taki sam wynik, jak na początku. Jednak nie wydaje się, że można go uzyskać w formacie innym niż debugowanie, bez pisania własnego modułu dziennika dla ansible lub przesyłania strumieniowego do powłoki lub skryptu perla lub czegoś takiego. Ten link miał dobrą odpowiedź stackoverflow.com/questions/28564811/…
lsd
1

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.

Itai Ganot
źródło
2
Jeśli chodzi o Ansible 2.2, nadal nie ma opcji drukowania na ekranie poza debugowaniem.
Itai Ganot,
0

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.

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

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_linespo prostu pobrać zawartość tutaj.

Ryder
źródło