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?
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.
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 .
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.
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.