Ansible: définir la variable sur le contenu du fichier

93

J'utilise le module ec2 avec ansible-playbookJe veux définir une variable sur le contenu d'un fichier. Voici comment je le fais actuellement.

  1. Var avec le nom de fichier
  2. tâche shell dans catle fichier
  3. utilisez le résultat de catpour passer au module ec2.

Exemple de contenu de mon playbook.

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: user_data_contents
  shell: cat {{ user_data_file }}
  register: user_data_action
- name: launch ec2-instance
  local_action:
...
  user_data: "{{ user_data_action.stdout }}"

Je suppose qu'il existe un moyen beaucoup plus simple de le faire, mais je ne l'ai pas trouvé lors de la recherche de documents Ansible.

TesteurJeff
la source
Celui-ci a fonctionné pour moi. Je n'ai pas trouvé comment incorporer des variables dans une commande de recherche (pipe).
ericson.cepeda

Réponses:

90

Vous pouvez utiliser des recherches dans Ansible pour obtenir le contenu d'un fichier, par exemple

user_data: "{{ lookup('file', user_data_file) }}"

Attention: cette recherche fonctionnera avec des fichiers locaux, pas des fichiers distants.

Voici un exemple complet tiré de la documentation :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
jabclab
la source
90
Notez que la recherche s'exécute localement, tandis que la catcommande de l'exemple de @ TesterJeff s'exécute sur la machine distante.
Alex Dupuy
8
Pour les recherches à distance, vérifiez les modules slurp et fetch
Marco Ferrari
15

Vous pouvez utiliser le module slurp: (Merci à @mlissner de l'avoir suggéré)

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: Load data
  slurp:
    src: "{{ user_data_file }}"
  register: slurped_user_data
- name: Decode data and store as fact # You can skip this if you want to use the right hand side directly...
  set_fact:
    user_data: "{{ slurped_user_data.content | b64decode }}"
Gert van den Berg
la source
8

Vous pouvez utiliser le module fetch pour copier les fichiers des hôtes distants vers les locaux, et le module lookup pour lire le contenu des fichiers récupérés.

Taha Jahangir
la source
6
Je suis totalement nouveau dans ansible, mais pourquoi ne pas utiliser slurp pour cela? Cela semble fonctionner sur la télécommande pour extraire le contenu d'un fichier.
mlissner
0

la recherche ne fonctionne que sur localhost. Si vous souhaitez récupérer des variables variables que vous un fichier en usaient à distance include_vars: {{ varfile }}. Le contenu de {{ varfile }}devrait être un dictionnaire de la forme {"key":"value"}, vous trouverez que ansible vous pose problème si vous incluez un espace après les deux points.

DR1979
la source
7
Ça n'a pas de sens. include_varsfonctionne localement sur la machine de contrôle, pas avec des fichiers sur la cible.
techraf