web-dev-qa-db-fra.com

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?

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

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

En utilisant le module "debug", je peux obtenir les données à afficher à l'écran mais uniquement en tant que 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?

22
Itai Ganot

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.

1
Itai Ganot

Le citation du filtre Jinja devrait résoudre le problème de citation. 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 module debug. 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

[~ # ~] modifier [~ # ~] Je dois me corriger un peu. Jetez un oeil à cette question de défaut de serveur . Vous pouvez modifier la sortie Ansible en utilisant le callback.display une fonction. Je recommande de lire le lien article de blog .

4
Henrik Pingel

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

 - debug: 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.

1
lsd

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 \", alors cela (testé) arrive juste à fonctionner, 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 encore plus facile et préférable d'utiliser var=details.stdout_lines pour obtenir simplement le contenu ici.

0
Ryder