Ansible: è possibile "file cat" ed esportare l'output sullo schermo durante la riproduzione di un playbook e non come debug?


22

Ho scritto un playbook che installa e configura Google Authenticator per utente.

Voglio l'ultimo passaggio del playbook al catfile di configurazione google_authenticator.

Utilizzando il modulo "debug" sono in grado di visualizzare i dati sullo schermo ma solo come messaggio di debug:

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

Ho letto online che posso fare qualcosa del genere:

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

Ma ricevo un errore quando lo eseguo:

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

L'errore dice: "Nessuna quotazione di chiusura" sebbene sia quotata. Ho anche provato:

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

Qualche idea di quale potrebbe essere il problema?

Risposte:


3

Il filtro preventivo Jinja dovrebbe risolvere il problema di quotazione. Usalo in questo modo:

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

Per l'altra domanda, non sono a conoscenza di un modulo per stampare dichiarazioni diverse dal debugmodulo. È possibile verificare se l'opzione Salva variabile registrata su file è un'opzione. Se si desidera memorizzare le variabili Ansible sull'host del controller è possibile fare qualcosa del genere:

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

EDIT Devo correggermi un po '. Dai un'occhiata a questa domanda serverfault . È possibile modificare l'uscita Ansible utilizzando la callback.displayfunzione. Consiglio di leggere il post sul blog collegato .


1

Scommetto che il problema è che le virgolette nel file che stai cercando sono non corrispondenti e si scherzano con le virgolette nel messaggio. Forse prova:

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

o

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

Ciò dovrebbe sfuggire alle virgolette nel messaggio in modo che le virgolette attorno al messaggio si corrispondano.

Questo non è stato testato (non sono in grado di testarlo in questo momento), ma potresti provarlo molto velocemente e vedere.


Ho provato entrambi ... non ha funzionato.
Itai Ganot,

Hmm, l'ho appena eseguito senza i miei suggerimenti sopra e ho ottenuto lo stesso risultato che avevi all'inizio. Tuttavia non sembra che sia possibile ottenerlo in un formato diverso dal debug, senza scrivere il proprio modulo di registro per rispondere, o eseguire il piping su uno script shell o perl o qualcosa del genere. Questo link ha avuto una buona risposta stackoverflow.com/questions/28564811/…
lsd

1

Ho guardato in profondità attraverso Internet e verificato con alcuni professionisti Ansible.

A quanto ho capito, in Ansible 1.8 non esiste tale opzione per reindirizzare l'output del comando sullo schermo come output normale anziché come output di debug.


2
Per quanto riguarda Ansible 2.2 non c'è ancora alcuna opzione per stampare sullo schermo oltre all'utilizzo del debug.
Itai Ganot,

0

Ho eseguito alcuni test sul blocco di testo che avevi sopra - l'ho lasciato cadere in posizione e ripulito le citazioni json aggiunte usando details.stdout_lines.

Se il testo "errato" nel tuo file auth è sempre un inizio \", allora questo (testato) funziona e produce quasi lo stesso output ma con due punti al posto di questa stringa.

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

Ora questo è un caso d'uso estremamente limitato, ma se l'output dell'autorizzazione di Google è definito qui rigorosamente (ed è del tutto possibile il caso), allora dovrebbe fare quello che vuoi.

Tuttavia, sarebbe comunque più semplice e preferibile utilizzarlo var=details.stdout_linesper ottenere i contenuti qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.