Zapisz zmienną do pliku w Ansible

102

Ściągam JSON za pośrednictwem modułu URI i chcę zapisać otrzymaną zawartość do pliku. Jestem w stanie pobrać zawartość i przesłać ją do debuggera, więc wiem, że treść została odebrana, ale nie znam najlepszych praktyk dotyczących zapisywania plików.

Keith Adler
źródło

Odpowiedzi:

200

Możesz użyć copymodułu z contentparametrem:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

Dokumentacja tutaj: moduł kopiowania

Ramon de la Fuente
źródło
5
content = „{{your_json_feed}}” zajmuje się białymi znakami i znakami nowej linii. Cytaty są ważne.
m.kocikowski
@RamondelaFuente Jeśli chciałbym dodać zawartość wielu zmiennych do pliku, muszę wielokrotnie użyć modułu "kopiuj", czy jest inny sposób?
KishoreReddy
1
@KishoreReddy Wyobrażam sobie, że możesz użyć składni jinja2 do dołączania zmiennych. Coś w rodzaju „{{zmienna ~ inna_zmienna}}”. Niezbyt ładne, ale jeśli sprawy staną się bardziej skomplikowane, możesz użyć template:modułu i wypełnić go zmiennymi zarejestrowanymi w czasie wykonywania.
Ramon de la Fuente
Działa to lepiej, gdy chcesz wygenerować plik sumy sha256 w formularzu shahash /path/to/file(uwaga 2 spacje między), a następnie zweryfikować z wiersza poleceń (przez sha256sum -c shafile) to, co wygenerowałeś za pomocą Ansible.
Daniel Andrei Minca
11

Na podstawie odpowiedzi Ramona napotykam błąd. Problem polegający na tym, że spacje w JSON próbowałem napisać, naprawiłem, zmieniając zadanie w playbooku, aby wyglądało następująco:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

Na razie nie jestem pewien, dlaczego było to potrzebne. Domyślam się, że miało to coś wspólnego ze sposobem, w jaki zmienne są zastępowane w Ansible, a wynikowy plik jest analizowany.

Tobias Kremer
źródło
11

Jeśli nie piszesz bardzo małych plików, prawdopodobnie powinieneś używać szablonów .

Przykład:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Janus Troelsen
źródło
2
Chociaż odpowiedź Ramona odnosi się dokładnie do tego, o co pytano, ta odpowiedź jest ogólnie najlepszym podejściem. Na przykład, jeśli masz playbook, który tworzy maszyny wirtualne w chmurze i chcesz wygenerować spis hostów dla innego playbooka, najlepszym rozwiązaniem jest szablon.
Luis Artola,
Czy możesz wyjaśnić, dlaczego to jest lepsze?
Wirowość
@Vorticity lepsze niż co?
Janus Troelsen
@JanusTroelsen Przepraszam, czy możesz wyjaśnić, dlaczego ta odpowiedź jest lepsza niż akceptowana odpowiedź podczas pisania dużych plików?
Wirowość
1
@Vorticity, ponieważ staje się nieporęczny, gdy masz plik osadzony w innym pliku. potrzebujesz ucieczki, a podświetlanie składni nie będzie działać. mechanizm szablonów umożliwia wstawianie rzeczy w środku, jeśli tego potrzebujesz.
Janus Troelsen
0

Teraz możemy bezpośrednio określić plik docelowy za pomocą destopcji. W poniższym przykładzie wyjściowy plik json jest przechowywany w pliku/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
venkata
źródło