dans un playbook Ansible, j'essaie de lire la clé publique par défaut dans une variable à utiliser plus tard.
Voici mon yml:
fatal: [redacted-ip]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /root/.ssh/id_rsa.pub"}
Le script rompt avec l'erreur suivante:
- hosts: hostsGroup become: false vars: publicKey: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
Il est confirmé que le fichier existe à cet emplacement.
Y a-t-il un meilleur moyen? ou qu'est-ce que je fais mal?
3 Réponses :
Citant la documentation :
Les recherches se produisent sur l'ordinateur local, pas sur l'ordinateur distant.
Pour obtenir le contenu du fichier distant, vous pouvez utiliser une tâche comme celle-ci:
- name: show key contents debug: var: key.stdout
Vous pouvez ensuite accéder au contenu comme ceci: p>
- name: get remote file contents command: "cat {{ ansbible_env.HOME }}/.ssh/id_rsa.pub" register: key
Mais! Notez qu'ici j'utilise ansible_env.HOME
. Celui-ci est renseigné par Ansible lors de la collecte des faits et représentera la valeur de la variable d'environnement HOME
du point de vue de l'utilisateur qu'Ansible a utilisé pour s'authentifier. Si vous utilisez des éléments tels que devenir_utilisateur
, la valeur ne changera pas pour refléter le nouvel utilisateur.
J'ai voté contre parce que le module slurp
est préféré au module command
pour un tel cas d'utilisation.
Je ne suis pas sûr que ce soit le cas. C'est une option , certes, mais pour obtenir du contenu en texte brut dans une variable, une tâche de commande
est souvent beaucoup plus simple. Cela dépend de ce que vous essayez de faire.
slurp
est indépendant de la plate-forme et existe uniquement dans le but de «récupérer un objet blob encodé en base64 contenant les données dans un fichier distant». La commande
est tellement générique qu'elle est une option pour remplacer plusieurs modules, c'est-à-dire que la commande
est une option pour effectuer un mysqldump
cependant le module mysql_db
est préféré à cette fin ( state: dump
).
Comme expliqué dans la Documentation sur les plugins de recherche
Comme tous les modèles, ces plugins sont évalués sur Ansible contrôler la machine, pas sur la cible / la télécommande.
Vous pouvez utiliser le module slurp pour obtenir le contenu de votre clé à distance.
Notez que lorsque le fichier a été slurpé, c'est une chaîne encodée en Base64 qui doit être acheminée via b64decode
.
@BenH Oui, absolument. Il est indiqué plusieurs fois dans la documentation du module.
Vous avez mentionné devenir: faux. ce qui signifie que vous voulez forcer la recherche ansible_user dans le répertoire / home /. Cependant, le playbook recherchait la clé dans un emplacement racine: impossible de localiser le fichier dans la recherche: /root/.ssh/id_rsa.pub
En supposant que vous vouliez la clé get publick pour ansible_user, votre playbook est transmis à l'utilisateur root chaque fois qu'il se connecte au serveur distant + recherche de recherche sur la machine locale et non sur celle distante.