Ansible: définit la variable sur le contenu du fichier
J'utilise le module ec2 avec ansible-playbook
je veux définir une variable sur le contenu d'un fichier. Voici comment je suis en train de le faire.
- Var avec le nom de fichier
- tâche shell à
cat
le fichier - utilisez le résultat du
cat
pour 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 y a un moyen beaucoup plus facile de le faire, mais je ne pouvais pas le trouver en cherchant des documents Ansible.
4 réponses
Vous pouvez utiliser recherches dans Ansible pour obtenir le contenu d'un fichier, par exemple:
user_data: "{{ lookup('file', user_data_file) }}"
Voici un exemple complet des documents :
- hosts: all
vars:
contents: "{{ lookup('file', '/etc/foo.txt') }}"
tasks:
- debug: msg="the value of foo.txt is {{ contents }}"
Vous pouvez utiliser module de chercher à copier des fichiers à partir des hôtes distants, locaux et recherche module lire le contenu des fichiers récupérés.
La recherche ne fonctionne que sur localhost. Si vous voulez récupérer des variables à partir d'un fichier de variables que vous avez créé à distance, utilisez include_vars: {{ varfile }}
. Contenu de {{ varfile }}
doit être un dictionnaire de la forme {"key":"value"}
, vous trouverez ansible vous donne des problèmes si vous incluez un espace après les deux points.
Vous pouvez utiliser le module slurp: (merci à @mlissner pour 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 }}"