Schreiben Sie eine Variable in eine Datei in Ansible

100

Ich ziehe JSON über das URI-Modul und möchte den empfangenen Inhalt in eine Datei schreiben. Ich kann den Inhalt abrufen und an den Debugger ausgeben, damit ich weiß, dass der Inhalt empfangen wurde, aber ich kenne nicht die beste Vorgehensweise zum Schreiben von Dateien.

Keith Adler
quelle

Antworten:

198

Sie können das copyModul mit dem contentParameter verwenden:

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

Die Dokumente hier: Kopiermodul

Ramon de la Fuente
quelle
5
content = "{{your_json_feed}}" behandelt Leerzeichen und Zeilenumbrüche. Die Zitate sind wichtig.
m.kocikowski
@RamondelaFuente Wenn ich der Datei mehrere Vars-Inhalte hinzufügen möchte, muss ich das Modul "Kopieren" mehrmals verwenden, oder gibt es eine andere Möglichkeit?
KishoreReddy
1
@KishoreReddy Ich kann mir vorstellen, dass Sie die jinja2-Syntax verwenden können, um Variablen anzuhängen. So etwas wie "{{variable ~ another_variable}}". Nicht schön, aber wenn die Dinge komplizierter werden, können Sie das template:Modul verwenden und es mit den zur Laufzeit registrierten Variablen füllen.
Ramon de la Fuente
Dies funktioniert besser, wenn Sie eine sha256-Summendatei im Formular generieren möchten shahash /path/to/file(Anmerkung 2 Leerzeichen dazwischen) und dann über die Befehlszeile (über sha256sum -c shafile) überprüfen möchten, was Sie über Ansible generiert haben.
Daniel Andrei Mincă
11

Sofern Sie keine sehr kleinen Dateien schreiben, sollten Sie wahrscheinlich Vorlagen verwenden .

Beispiel:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Janus Troelsen
quelle
2
Während Ramons Antwort genau das anspricht, was gefragt wurde, ist diese Antwort im Allgemeinen der beste Ansatz. Wenn Sie beispielsweise ein Playbook haben, das VMs in der Cloud erstellt, und ein Inventar von Hosts für ein anderes Playbook erstellen möchten, ist eine Vorlage der richtige Weg.
Luis Artola
Können Sie erklären, warum das besser ist?
Vorticity
@ Vorticity besser als was?
Janus Troelsen
@JanusTroelsen Entschuldigung, können Sie erklären, warum dies beim Schreiben großer Dateien besser ist als die akzeptierte Antwort?
Vorticity
1
@Vorticity, weil es unhandlich wird, wenn Sie eine Datei in eine andere Datei eingebettet haben. Sie müssen maskieren und die Syntaxhervorhebung funktioniert nicht. Der Vorlagenmechanismus ermöglicht das Einfügen von Objekten in die Mitte, wenn Sie dies benötigen.
Janus Troelsen
9

Aufgrund von Ramons Antwort stoße ich auf einen Fehler. Das Problem, bei dem Leerzeichen im JSON, das ich zu schreiben versuchte, behoben wurden, indem die Aufgabe im Playbook so geändert wurde, dass sie wie folgt aussieht:

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

Bis jetzt bin ich mir nicht sicher, warum dies benötigt wurde. Ich vermute, dass es etwas damit zu tun hat, wie Variablen in Ansible ersetzt werden und die resultierende Datei analysiert wird.

Tobias Kremer
quelle
0

Wir können die destZieldatei jetzt direkt mit der Option angeben . Im folgenden Beispiel wird der Ausgang json in der gespeichert/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
quelle