Scrivi la variabile in un file in Ansible


101

Sto estraendo JSON tramite il modulo URI e voglio scrivere il contenuto ricevuto su un file. Sono in grado di ottenere il contenuto e di inviarlo al debugger, quindi so che il contenuto è stato ricevuto, ma non conosco la procedura migliore per scrivere file.

Risposte:


200

Puoi usare il copymodulo, con il contentparametro:

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

I documenti qui: modulo di copia


5
content = "{{your_json_feed}}" si occupa di spazi bianchi e nuove righe. Le citazioni sono importanti.
m.kocikowski

@RamondelaFuente Se desidero aggiungere più contenuti vars al file, devo utilizzare il modulo "copia" più volte o c'è un altro modo?
KishoreReddy

1
@KishoreReddy Immagino che tu possa usare la sintassi jinja2 per aggiungere variabili. Qualcosa come "{{variable ~ another_variable}}". Non carino, ma se le cose si complicano ulteriormente potresti usare il template:modulo e riempirlo con le variabili registrate a runtime.
Ramon de la Fuente

Funziona meglio quando si desidera generare un file somma sha256 nel modulo shahash /path/to/file(nota 2 spazi tra) e quindi convalidare dalla riga di comando (tramite sha256sum -c shafile) ciò che è stato generato tramite Ansible.
Daniel Andrei Mincă

11

A meno che tu non stia scrivendo file molto piccoli, dovresti probabilmente usare i modelli .

Esempio:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"

2
Mentre la risposta di Ramon affronta esattamente ciò che è stato chiesto, questa risposta è l'approccio migliore in generale. Ad esempio, se hai un playbook che crea VM nel cloud e desideri generare un inventario di host per un altro playbook, un modello è la strada da percorrere.
Luis Artola

Puoi spiegare perché è meglio?
Vorticity

@Vorticità meglio di cosa?
Janus Troelsen,

@JanusTroelsen Scusa, puoi spiegare perché è migliore della risposta accettata quando si scrivono file di grandi dimensioni?
Vorticity

1
@Vorticity perché diventa ingombrante quando hai un file incorporato in un altro file. è necessario eseguire l'escape e l'evidenziazione della sintassi non funzionerà. il meccanismo di creazione dei modelli consente di inserire cose nel mezzo se ne hai bisogno.
Janus Troelsen,

10

Sulla base della risposta di Ramon mi sono imbattuto in un errore. Il problema in cui gli spazi nel JSON che ho provato a scrivere l'ho risolto cambiando l'attività nel playbook in modo che assomigliasse a:

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

Al momento non sono sicuro del motivo per cui fosse necessario. La mia ipotesi migliore è che avesse qualcosa a che fare con il modo in cui le variabili vengono sostituite in Ansible e il file risultante viene analizzato.


0

Possiamo specificare direttamente il file di destinazione con l' destopzione adesso. Nell'esempio seguente, l'output json è archiviato nel file/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
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.