Ansible: establecer variable para el contenido del archivo

93

Estoy usando el módulo ec2 con ansible-playbookquiero establecer una variable para el contenido de un archivo. Así es como lo estoy haciendo actualmente.

  1. Var con el nombre de archivo
  2. tarea de shell al catarchivo
  3. utilice el resultado del catpara pasar al módulo ec2.

Contenido de ejemplo de mi libro de jugadas.

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 }}"

Supongo que hay una manera mucho más fácil de hacer esto, pero no pude encontrarla mientras buscaba documentos de Ansible.

TesterJeff
fuente
Este funcionó para mí. No encontré cómo incrustar variables en un comando de búsqueda (tubería).
ericson.cepeda

Respuestas:

91

Puede usar búsquedas en Ansible para obtener el contenido de un archivo, por ejemplo

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

Advertencia: esta búsqueda funcionará con archivos locales, no con archivos remotos.

Aquí hay un ejemplo completo de los documentos :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
jabclab
fuente
90
Tenga en cuenta que la búsqueda se ejecuta localmente, mientras que el catcomando en el ejemplo de @ TesterJeff se ejecuta en la máquina remota.
Alex Dupuy
8
Para búsquedas remotas, verifique los módulos slurp y fetch
Marco Ferrari
15

Puede usar el módulo slurp para buscar un archivo del host remoto: (Gracias a @mlissner por sugerirlo)

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
fuente
8

Puede utilizar el módulo de búsqueda para copiar archivos de hosts remotos a local, y el módulo de búsqueda para leer el contenido de los archivos recuperados.

Taha Jahangir
fuente
6
Soy totalmente nuevo en ansible, pero ¿por qué no usar slurp para esto? Parece funcionar en el control remoto para extraer el contenido de un archivo.
mlissner
0

la búsqueda solo funciona en localhost. Si desea recuperar las variables variables de un archivo que hizo uso de forma remota include_vars: {{ varfile }}. El contenido de {{ varfile }}debería ser un diccionario del formulario {"key":"value"}, encontrará que ansible le da problemas si incluye un espacio después de los dos puntos.

DR1979
fuente
7
Esto no tiene sentido. include_varsfunciona localmente en la máquina de control, no con archivos en el objetivo.
techraf