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.