Ansible: Est-il possible de "fichier cat" et d'exporter sa sortie à l'écran tout en jouant un playbook et non en tant que débogage?

22

J'ai écrit un playbook qui installe et configure Google Authenticator par utilisateur.

Je veux que la dernière étape du playbook soit vers catle fichier de configuration google_authenticator.

En utilisant le module "debug", je peux obtenir les données à afficher à l'écran mais uniquement sous forme de message de débogage:

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

J'ai lu en ligne que je peux faire quelque chose comme ça:

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

Mais je reçois une erreur lorsque je l'exécute:

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'erreur indique: "Pas de devis de clôture" bien qu'il soit cité. A également essayé:

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

Une idée quel pourrait être le problème?

Itai Ganot
la source

Réponses:

3

Le filtre de devis Jinja devrait résoudre le problème de devis . Utilisez-le comme ceci:

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

Pour l'autre question, je ne connais pas de module pour imprimer des instructions autres que le debugmodule. Vous voudrez peut-être vérifier si Enregistrer la variable enregistrée dans un fichier est une option. Si vous souhaitez stocker des variables Ansible sur l'hôte du contrôleur, il est possible de faire quelque chose comme ceci:

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

EDIT J'ai besoin de me corriger un peu. Jetez un oeil à cette question de panne de serveur . Vous pouvez modifier la sortie Ansible en utilisant la callback.displayfonction. Je recommande de lire l' article de blog lié .

Henrik Pingel réintègre Monica
la source
1

Je parierais que le problème est que les citations dans le fichier que vous regardez ne correspondent pas et jouent avec les citations dans le msg. Essayez peut-être:

- débogage: msg = "{{details.stdout_lines | regex_escape ()}"

ou

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

Cela devrait échapper aux guillemets dans le msg afin que les guillemets autour du msg correspondent les uns aux autres.

Cela n'a pas été testé (je ne suis pas en mesure de le tester pour le moment), mais vous pouvez l'essayer très rapidement et voir.

LSD
la source
J'ai essayé les deux ... ça n'a pas marché.
Itai Ganot
Hmm, je viens de l'exécuter sans mes suggestions ci-dessus, et j'ai obtenu la même sortie que vous aviez au début. Cependant, il ne semble pas que vous puissiez l'obtenir dans un format autre que le débogage, sans écrire votre propre module de journalisation pour ansible, ou diriger vers un script shell ou perl ou quelque chose. Ce lien a eu une bonne réponse stackoverflow.com/questions/28564811/…
lsd
1

J'ai regardé en profondeur sur Internet et vérifié auprès de certains professionnels d'Ansible.

Pour autant que je comprends, il n'y a pas une telle option dans Ansible 1.8 pour rediriger la sortie de la commande vers l'écran en tant que sortie normale plutôt que sortie de débogage.

Itai Ganot
la source
2
En ce qui concerne Ansible 2.2, il n'y a toujours aucune option pour imprimer sur l'écran autre que l'utilisation du débogage.
Itai Ganot
0

J'ai effectué quelques tests sur le bloc de texte que vous aviez ci-dessus - je l'ai déposé et nettoyé les citations json ajoutées en utilisant details.stdout_lines.

Si le `` mauvais '' texte de votre fichier d'authentification est toujours un début \", alors cela (testé) se produit simplement, produisant à peu près la même sortie mais avec deux points à la place de cette seule chaîne.

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

Maintenant, c'est un cas d'utilisation extrêmement limité, mais si la sortie d'authentification Google est strictement définie ici (et il est tout à fait possible que ce soit le cas), alors cela devrait faire ce que vous voulez.

Cependant, il serait toujours plus facile et préférable d'utiliser var=details.stdout_linessimplement le contenu ici.

Ryder
la source