Tampilkan output dengan Ansible

39

Saya memiliki permainan Ansible untuk PGBouncer yang menampilkan beberapa output dari modul statistik yang dibangun ke dalam PGBouncer.

Masalah saya adalah bahwa ketika Ansible mencetak output ke terminal, itu akan merusak baris baru. Alih-alih melihat

----------
| OUTPUT |
----------

saya melihat

----------\n| OUTPUT |\n----------

Adakah yang tahu bagaimana cara mendapatkan "print cantik" output?

mjallday
sumber

Jawaban:

14

Tidak ada cara untuk melakukan apa yang Anda inginkan secara asli di Ansible. Anda dapat melakukan ini sebagai solusinya:

ansible-playbook ... | sed 's/\\n/\n/g'
jarv
sumber
1
Pada OSX saya harus menggunakan sed -e 's/\\n/'$'\\\n/g'. Juga relevan: comicjk.com/20
Navin
4
lihat sorins answer serverfault.com/a/846232/240508 yang benar pada tahun 2017 dan memungkinkan> 2.3
Vadimo
Sebagian besar \nmuncul dalam hasil, sehingga Anda dapat menggunakan regexp ini dalam pesan debug Anda:msg: "{{ result.stdout | regex_replace('\\n', '\n') }}"
klml
sayangnya, melakukan ini menghilangkan pewarnaan bagus & berguna yang Anda dapatkan pada keluaran yang memungkinkan
Mehdi LAMRANI
62

Jika Anda ingin lebih banyak mendefinisikan ramah manusia:

ANSIBLE_STDOUT_CALLBACK=debug

Ini akan memungkinkan menggunakan modul keluaran debug (sebelumnya dinamai human_log) meskipun meskipun nama yang disayangkan kurang bertele-tele dan lebih mudah dibaca oleh manusia.

Jika Anda mendapatkan kesalahan bahwa modul ini tidak tersedia, perbarui Ansible atau tambahkan modul ini secara lokal jika Anda tidak dapat memutakhirkan ansible, itu akan berfungsi dengan versi yang lebih mungkin seperti 2.0 atau mungkin bahkan 1.9.

Opsi lain untuk mengonfigurasi ini adalah menambahkan stdout_callback = debugke ansible.cfg Anda

Sorin
sumber
13
ini harus menjadi jawaban DITERIMA pada tahun 2017 output log ramah manusia dikirim keluar dari kotak.
Vadimo
1
Berikut beberapa kiat untuk menjadikan ini lebih permanen: github.com/ansible/ansible/issues/27078#issuecomment-364560173
kramer65
1
Atau ANSIBLE_STDOUT_CALLBACK=yaml. Saya lebih suka itu karena format bagus fail msgketika saya memberikan objek.
Marinos An
13

Anda dapat menggunakan plugin callback . Ini akan mem-parsing output Anda dan mudah dihidupkan dan dimatikan.

xddsg
sumber
2
Catatan: Dengan 2.0.x yang dimungkinkan, Anda harus mewarisi dari yang CallbackBasediimpor dengan from ansible.plugins.callback import CallbackBaseagar kelas panggilan balik berfungsi.
allo
12

Ditemukan ini cara di forum kelompok Ansible Proyek:

- name: "Example test"
  command:
    ...
  register: test
- name: "Example test stdout"
  debug:
    msg: "{{ test.stdout.split('\n') }}"
- name: "Example test stderr"
  debug:
    msg: "{{ test.stderr.split('\n') }}"

Kami pada dasarnya mengubah ini menjadi daftar dengan membaginya dengan baris baru dan kemudian mencetak daftar itu.

jhutar
sumber
Itu membuat keluaran shell jauh lebih terbaca! Bagus!
Asfand Qazi
Solusi ini tampaknya memiliki satu kelemahan utama - jika eksekusi modul "Uji contoh" gagal, biasanya seluruh playbook build gagal dan Anda tidak akan pernah melihat output yang diformat, terutama yang untuk stderr yang mungkin paling menarik.
René
@ Ren Anda benar. Untuk itu Anda dapat menambahkan ignore_errors: yeske perintah asli dan kemudian sesuatu seperti `- menegaskan: bahwa:" test.rc == 0 ".
jhutar
0

Jika Anda ingin melihatnya dalam format yang secara praktis meniru output standar, Anda dapat menggunakan debugplugin callback dengan debugmodul di Ansible 2.7+ seperti ini:

- name: "Test Output"
  debug:
    msg: "{{ test_result.stdout_lines | join('\n') }}"
daveystones
sumber