3
votes

Comment résoudre "Impossible de localiser le fichier dans la recherche" en lisant id_rsa.pub?

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?


0 commentaires

3 Réponses :


2
votes

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.


3 commentaires

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



2
votes

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.


2 commentaires

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.



0
votes

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.


0 commentaires