web-dev-qa-db-fra.com

Utilisation de variables pour le nom et le contenu du fichier dans le module lineinfile

J'essaie de lire le contenu d'un fichier, de le stocker dans une variable, puis de l'insérer dans un autre fichier s'il n'existe pas déjà.

Voici comment j'essaye de résoudre ce problème:

# Create a variable that represents the path to the file that you want to read from
ssh_public_key_file: '../../jenkins_master/files/{{ hostvars[inventory_hostname]["environment"] }}/id_rsa.pub'

# Create a variable that represents the contents of this file:
ssh_public_key: "{{ lookup('file', '{{ ssh_public_key_file }}') }}"

J'utilise ensuite ces variables dans mon classeur Ansible comme suit:

- name: Install SSH authorized key
  lineinfile: create=yes dest=~/.ssh/authorized_keys line=" {{ ssh_public_key }}" mode=0644

Cependant, lorsque j'essaie d'exécuter le playbook, le message d'erreur suivant s'affiche:

could not locate file in lookup: {{ ssh_public_key_file }}

Quelqu'un peut-il recommander une solution ou suggérer ce que j'ai pu mal faire?

Merci,

Seán

15
Seán

Vous devez changer la ligne en:

# Create a variable that represents the contents of this file:
ssh_public_key: "{{ lookup('file', ssh_public_key_file) }}"

Si vous devez concaténer des variables et des chaînes, vous pouvez le faire comme ceci: 

# Example with two variables
ssh_public_key: "{{ lookup('file', var_1+var_2) }}"

# Example with string and variable
ssh_public_key: "{{ lookup('file", '~/config/'+var_1) }}"
21
ByteNudger

Premièrement, je m'assurerais que votre variable ssh_public_key_file est configurée correctement. Si vous ajoutez une tâche comme celle-ci, que montre-t-elle?

- name: display variable
  debug: var=ssh_public_key_file

Si la sortie ressemble à ceci, la variable n'est pas définie correctement (par exemple, le fait "environnement" n'existe pas pour l'hôte):

ok: [localhost] => {
    "ssh_public_key_file": "../../jenkins_master/files/{{ hostvars[inventory_hostname][\"environment\"] }}/id_rsa.pub"
}

Cependant, si tout est défini correctement, votre sortie devrait afficher les variables remplacées par leurs valeurs correctes:

ok: [localhost] => {
    "ssh_public_key_file": "../../jenkins_master/files/foo/id_rsa.pub"
}

Une fois que vous avez vérifié cela, je referais la même chose avec votre variable ssh_public_key. Il suffit de sortir sa valeur en utilisant le module de débogage. Il devrait afficher le contenu du fichier de clé publique.

Une autre chose que je suggérerais fortement est d'éviter d'utiliser le fichier linein. Puisque vous travaillez avec des clés SSH, je vous recommanderais d’utiliser plutôt le module registered_code_auto . C'est une manière beaucoup plus propre de gérer les fichiers allowed_keys.

1
Bruce P