Ansible: imposta la variabile sul contenuto del file


93

Sto usando il modulo ec2 con ansible-playbookvoglio impostare una variabile sul contenuto di un file. Ecco come lo sto facendo attualmente.

  1. Var con il nome del file
  2. attività della shell catnel file
  3. usa il risultato del catper passare al modulo ec2.

Contenuti di esempio del mio 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 }}"

Presumo che ci sia un modo molto più semplice per farlo, ma non sono riuscito a trovarlo durante la ricerca di documenti Ansible.


Questo ha funzionato per me. Non ho trovato come incorporare le variabili in un comando di ricerca (pipe).
ericson.cepeda

Risposte:


91

Puoi usare le ricerche in Ansible per ottenere il contenuto di un file, ad es

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

Avvertenza: questa ricerca funzionerà con i file locali, non con i file remoti.

Ecco un esempio completo dalla documentazione :

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

90
Notare che la ricerca viene eseguita localmente, mentre il catcomando nell'esempio di @ TesterJeff è in esecuzione sulla macchina remota.
Alex Dupuy

8
Per le ricerche remote controlla i moduli slurp e fetch
Marco Ferrari

15

Puoi utilizzare il modulo slurp per recuperare un file dall'host remoto: (Grazie a @mlissner per averlo suggerito)

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

8

È possibile utilizzare il modulo fetch per copiare file da host remoti in locale e il modulo lookup per leggere il contenuto dei file recuperati.


6
Sono totalmente nuovo ad ansible, ma perché non usare slurp per questo? Sembra funzionare sul telecomando per inserire il contenuto di un file.
mlissner

0

la ricerca funziona solo su localhost. Se si desidera recuperare le variabili da un variabili file che si è avvalsa in remoto include_vars: {{ varfile }}. Il contenuto di {{ varfile }}dovrebbe essere un dizionario del modulo {"key":"value"}, troverai ansible che ti dà problemi se includi uno spazio dopo i due punti.


7
Questo non ha senso. include_varsfunziona localmente sulla macchina di controllo, non con i file sulla destinazione.
techraf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.