Ansible: Ustaw zmienną na zawartość pliku

94

Używam modułu ec2 ansible-playbooki chcę ustawić zmienną na zawartość pliku. Oto, jak obecnie to robię.

  1. Zmień nazwę pliku
  2. zadanie powłoki do catpliku
  3. wykorzystać wynik catdo przekazania do modułu ec2.

Przykładowa zawartość mojego poradnika.

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

Zakładam, że jest o wiele łatwiejszy sposób, aby to zrobić, ale nie mogłem go znaleźć podczas wyszukiwania dokumentów Ansible.

TesterJeff
źródło
Ten pracował dla mnie. Nie znalazłem sposobu osadzania zmiennych w poleceniu wyszukiwania (potok).
ericson.cepeda

Odpowiedzi:

93

Możesz użyć wyszukiwań w Ansible, aby uzyskać zawartość pliku, np

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

Uwaga: to wyszukiwanie będzie działać z plikami lokalnymi, a nie zdalnymi.

Oto pełny przykład z dokumentacji :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
jabclab
źródło
91
Zwróć uwagę, że wyszukiwanie działa lokalnie, podczas gdy catpolecenie w przykładzie @ TesterJeff działa na zdalnej maszynie.
Alex Dupuy,
8
W przypadku zdalnego wyszukiwania sprawdź moduły slurp i fetch
Marco Ferrari
16

Możesz użyć modułu slurp , aby pobrać plik ze zdalnego hosta: (Dzięki @mlissner za zasugerowanie)

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
źródło
8

Możesz użyć modułu pobierania do kopiowania plików ze zdalnych hostów do lokalnego, a modułu wyszukiwania do odczytywania zawartości pobranych plików.

Taha Jahangir
źródło
6
Jestem zupełnie nowy w ansiblu, ale dlaczego nie użyć do tego slurp? Wydaje się, że działa na pilocie, aby pobrać zawartość pliku.
mlissner
0

wyszukiwanie działa tylko na hoście lokalnym. Jeśli chcesz pobrać zmienne z pliku zmiennych dokonane zdalnie korzystać include_vars: {{ varfile }}. Treść {{ varfile }}powinna być słownikiem formularza {"key":"value"}, okaże się, że ansibl sprawi ci kłopoty, jeśli wstawisz spację po dwukropku.

DR1979
źródło
7
To bzdury. include_varsdziała lokalnie na komputerze sterującym, a nie z plikami w miejscu docelowym.
techraf