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.

  1. Var avec le nom de fichier
  2. tâche shell à cat le fichier
  3. 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.

59
demandé sur TesterJeff 2014-06-03 01:50:12

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 }}"
64
répondu jabclab 2014-06-03 11:55:35

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.

6
répondu Taha Jahangir 2014-09-09 13:35:21

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.

3
répondu DR1979 2015-05-02 19:24:21

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 }}"
0
répondu Gert van den Berg 2018-09-19 09:47:23