Tulis variabel ke file di Ansible

101

Saya menarik JSON melalui modul URI dan ingin menulis konten yang diterima ke sebuah file. Saya bisa mendapatkan konten dan menampilkannya ke debugger jadi saya tahu konten tersebut telah diterima, tetapi saya tidak tahu praktik terbaik untuk menulis file.

Keith Adler
sumber

Jawaban:

200

Anda bisa menggunakan copymodul, dengan contentparameter:

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

Dokumen di sini: modul salin

Ramon de la Fuente
sumber
5
content = "{{your_json_feed}}" berurusan dengan spasi dan baris baru. Kutipan itu penting.
m.kocikowski
@RamondelaFuente Jika saya ingin menambahkan beberapa konten vars ke file, saya perlu menggunakan modul "copy" beberapa kali atau adakah cara lain?
KishoreReddy
1
@KishoreReddy Saya membayangkan Anda dapat menggunakan sintaks jinja2 untuk menambahkan variabel. Sesuatu seperti "{{variable ~ another_variable}}". Tidak cantik, tetapi jika keadaan menjadi lebih rumit, Anda dapat menggunakan template:modul dan mengisinya dengan variabel yang terdaftar saat runtime.
Ramon de la Fuente
Ini berfungsi lebih baik ketika Anda ingin membuat file jumlah sha256 dalam formulir shahash /path/to/file(perhatikan 2 spasi di antaranya) dan kemudian memvalidasi dari baris perintah (melalui sha256sum -c shafile) apa yang Anda buat melalui Ansible.
Daniel Andrei Mincă
11

Kecuali Anda menulis file yang sangat kecil, Anda mungkin harus menggunakan template .

Contoh:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Janus Troelsen
sumber
2
Sementara jawaban Ramon menjawab dengan tepat apa yang ditanyakan, jawaban ini adalah pendekatan terbaik secara umum. Misalnya, jika Anda memiliki pedoman yang membuat VM di cloud dan ingin membuat inventaris host untuk pedoman lain, template adalah cara yang tepat.
Luis Artola
Bisakah Anda menjelaskan mengapa ini lebih baik?
Vortisitas
@Vorticity lebih baik dari apa?
Janus Troelsen
@JanusTroelsen Maaf, dapatkah Anda menjelaskan mengapa ini lebih baik daripada jawaban yang diterima saat menulis file besar?
Vortisitas
1
@Vortisitas karena menjadi berat ketika Anda memiliki file yang disematkan di file lain. Anda perlu keluar dan penyorotan sintaks tidak akan berfungsi. mekanisme templating memungkinkan memasukkan sesuatu di tengah jika Anda membutuhkannya.
Janus Troelsen
9

Berdasarkan jawaban Ramon, saya mengalami kesalahan. Masalah di mana spasi di JSON yang saya coba tulis, saya perbaiki dengan mengubah tugas di playbook menjadi seperti:

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

Sampai sekarang saya tidak yakin mengapa ini diperlukan. Tebakan terbaik saya adalah bahwa itu ada hubungannya dengan bagaimana variabel diganti di Ansible dan file yang dihasilkan diurai.

Tobias Kremer
sumber
0

Kami dapat langsung menentukan file tujuan dengan destopsi sekarang. Pada contoh di bawah ini, output json disimpan ke dalam 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
venkata
sumber