Ansible: Ist es möglich, eine „Cat-Datei“ zu erstellen und die Ausgabe auf den Bildschirm zu exportieren, während ein Playbook abgespielt wird, und nicht als Debug?

22

Ich habe ein Playbook geschrieben, in dem Google Authenticator pro Nutzer installiert und konfiguriert wird.

Ich möchte den letzten Schritt des Playbooks in catder Konfigurationsdatei google_authenticator sehen.

Mit dem "Debug" -Modul kann ich die Daten auf dem Bildschirm anzeigen lassen, aber nur als Debug-Meldung:

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"
    ]
}

Ich habe online gelesen, dass ich so etwas machen kann:

  - 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 }}"

Aber ich bekomme eine Fehlermeldung, wenn ich es ausführe:

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 ********************************************************************

Der Fehler besagt: "Kein schließendes Zitat" obwohl es zitiert wird. Auch versucht:

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

Irgendeine Idee, woran das liegen könnte?

Itai Ganot
quelle

Antworten:

3

Der Zitat-Jinja-Filter sollte das Zitatproblem lösen. Benutze es so:

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

Bei der anderen Frage ist mir kein Modul bekannt, mit dem andere Anweisungen als das debugModul gedruckt werden können. Möglicherweise möchten Sie überprüfen, ob die Option Registrierte Variable in Datei speichern aktiviert ist. Wenn Sie Ansible-Variablen auf dem Controller-Host speichern möchten, ist Folgendes möglich:

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

BEARBEITEN Ich muss mich ein bisschen korrigieren. Schauen Sie sich diese Serverfehlerfrage an . Sie können die Ansible-Ausgabe mithilfe der callback.displayFunktion optimieren . Ich empfehle den verlinkten Blogbeitrag zu lesen .

Henrik Pingel setzt Monica wieder ein
quelle
1

Ich wette, dass das Problem darin besteht, dass die Anführungszeichen in der Datei, die Sie erstellen, nicht übereinstimmen und mit den Anführungszeichen in der Nachricht nicht übereinstimmen. Vielleicht versuchen Sie:

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

oder

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

Dies sollte den Anführungszeichen in der Nachricht entgehen, damit die Anführungszeichen um die Nachricht übereinstimmen.

Dies wurde noch nicht getestet (ich bin momentan nicht in der Lage, es zu testen), aber Sie könnten es ganz schnell ausprobieren und sehen.

lsd
quelle
Versucht beide ... hat nicht funktioniert.
Itai Ganot
Hmm, ich habe es nur ohne meine obigen Vorschläge ausgeführt und die gleiche Ausgabe erhalten, die Sie am Anfang hatten. Es scheint jedoch nicht, dass Sie es in einem anderen Format als Debug erhalten können, ohne ein eigenes Protokollmodul für Ansible zu schreiben oder eine Pipeline an ein Shell- oder Perl-Skript oder etwas anderes zu senden. Dieser Link hatte eine gute Antwort stackoverflow.com/questions/28564811/…
lsd
1

Ich habe mich intensiv im Internet umgesehen und mich bei einigen Ansible-Profis erkundigt.

Soweit ich weiß, gibt es in Ansible 1.8 keine solche Option, um die Ausgabe des Befehls als normale Ausgabe auf den Bildschirm umzuleiten, anstatt die Ausgabe zu debuggen.

Itai Ganot
quelle
2
In Ansible 2.2 gibt es immer noch keine andere Option zum Drucken auf dem Bildschirm als die Verwendung von Debug.
Itai Ganot
0

Ich habe einige Tests an dem Textblock durchgeführt, den Sie oben angegeben hatten - und ihn an Ort und Stelle abgelegt und die mit details.stdout_lines hinzugefügten JSON-Anführungszeichen entfernt.

Wenn der 'schlechte' Text in Ihrer Auth-Datei immer ein führender Text ist \", dann funktioniert dies (getestet) einfach und erzeugt fast die gleiche Ausgabe, jedoch mit einem Doppelpunkt anstelle dieser einen Zeichenfolge.

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

Dies ist ein äußerst eingeschränkter Anwendungsfall. Wenn die Google Auth-Ausgabe hier jedoch genau definiert ist (und dies durchaus möglich ist), sollte dies tun, was Sie möchten.

Es wäre jedoch immer noch einfacher und vorzuziehen var=details.stdout_lines, nur den Inhalt hier abzurufen.

Ryder
quelle