web-dev-qa-db-fra.com

Ansible: Définir 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 le fais actuellement.

  1. Var avec le nom de fichier
  2. Tâche shell pour cat le fichier
  3. utilisez le résultat de cat pour le transmettre 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 pouvais pas le trouver en cherchant dans la documentation Ansible.

75
TesterJeff

Vous pouvez utiliser recherches dans Ansible afin d’obtenir le contenu d’un fichier, par exemple.

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

Avertissement: Cette recherche fonctionnera avec des fichiers locaux et non des fichiers distants.

Voici un exemple complet de la documentation :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
75
jabclab

Vous pouvez utiliser le module Slurp: (Merci à @mlissner de le suggérer)

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 }}"
9
Gert van den Berg

Vous pouvez utiliser module de récupération pour copier des fichiers depuis des hôtes distants vers des unités locales et module de recherche pour lire le contenu des fichiers récupérés.

6
Taha Jahangir

la recherche ne fonctionne que sur localhost. Si vous voulez récupérer des variables d'un fichier de variables que vous avez créé à distance, utilisez include_vars: {{ varfile }}. Contenu de {{ varfile }} devrait être un dictionnaire de la forme {"key":"value"}, vous constaterez que ansible vous pose des problèmes si vous incluez un espace après les deux points.

2
DR1979