Bagaimana Saya Mencatat Output Tugas ke File?

9

Salah satu tugas saya mengimpor database Oracle menggunakan impdp.

Ini menghasilkan banyak output ke konsol jadi saya telah mengatur no_log: True.

Namun, ketika ini gagal saya ingin melihat log!

Bagaimana saya bisa membuat log tugas khusus ini ke file dan bukan ke konsol?

opticyclic
sumber
Anda menggunakan modul perintah?
Boikot SE untuk Monica Cellio
Satu ide [lebih dari peretasan] adalah untuk menulis log ke beberapa file eksternal, dan kemudian memiliki tugas setelah itu yang menggunakan failed_whenkondisi, dan menghapus file log, jika sebelumnya. tugas berhasil :)
Dawny33
Mengapa Anda bisa melihat output konsol selama menjalankan yang sukses? Saya belum melihat konfigurasi untuk, atau saya pikir itu tidak mungkin untuk, menunjukkan stdout selama pelaksanaan tugas yang sukses, seharusnya muncul [ok: nama host]. Namun ketika kesalahan terdeteksi output akan dibuang ke konsol kontrol yang dimungkinkan (dan setiap log yang mungkin ditentukan) maukah Anda berbagi konfigurasi yang memberi Anda stdout besar selama menjalankan sukses reguler?
hvindin
@hvindin Dimasukkan ke dalam -vvvsetelah ansible-playbookperintah untuk mendapatkan log verbose.
Dawny33
1
Mendaftarkan variabel tampaknya merupakan langkah logis terbaik, lihat komentar saya pada jawaban Anda untuk pendapat saya tentang apa yang harus dilakukan dengan output dari perintah yang dipicu yang mungkin.
hvindin

Jawaban:

4

[Konversi komentar saya menjadi jawaban]

Salah satu cara untuk melakukannya adalah dengan menulis log ke beberapa file eksternal, dan kemudian memiliki tugas setelah itu yang menggunakan kondisi fail_when, dan menghapus file log, jika tugas sebelumnya berhasil.

Sesuatu seperti ini akan membantu Anda.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Catatan: Ini mungkin bukan cara terbaik untuk menangani masalah Anda. Tapi, ini adalah retasan yang membantu saya melakukan pendataan dan pemantauan.

Dawny33
sumber
2
Saya akan melangkah lebih jauh dan mengatakan Anda bisa terus menulis perintah Anda ke stdout / stderr kemudian hanya membuangnya sebagai respons terhadap kegagalan. Jadi, sebagai contoh dalam contoh di atas jika Anda ingin menghentikan eksekusi jika terjadi kegagalan, maka gunakan tugas gagal untuk hanya menampilkan stdout dan stderr yang terdaftar di PyScript ketika rc! = 0 akan tampak solusi yang lebih holistik. Jika Anda menggunakan mekanisme insiilt ansibles maka jika Anda memiliki logging yang memungkinkan mengatur pada server kontrol, sebagai contoh, maka server kontrol akan mencatat kegagalan dalam log yang mungkin. Yang saya pikir akan menjadi tempat yang tepat untuk itu
hvindin
3

Saya pikir yang perlu Anda lakukan adalah mendaftarkan output dari setiap perintah yang Anda butuhkan (menyimpannya dalam variabel) dan kemudian hanya membuang variabel dalam file. Dengan begitu Anda bisa memeriksanya nanti.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Kemudian di dumpall.j2:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

Contoh yang saya gunakan adalah dari sini

13ditarik
sumber
3

Saya memecahkan ini dengan menambahkan

ignore_errors: true
register: results

ke tugas no_log. Ini memungkinkan melanjutkan ke tugas berikutnya, bahkan ketika tugas gagal. Kemudian untuk tugas selanjutnya tentukan tugas debug, yang selalu gagal dan menampilkan variabel terdaftar, tetapi hanya berjalan ketika tugas sebelumnya gagal:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Begitu pun dengan no_log: true, ini akan memungkinkan menampilkan hasil tugas yang gagal. Solusi ini tidak masuk ke file seperti yang diminta tetapi memenuhi kebutuhan Anda untuk 'melihat log ketika gagal', dan tentu saja, Anda dapat mengarahkan atau menggunakan tee untuk menampilkan hasil lengkap yang mungkin ke file, yang akan, dengan solusi ini juga berisi log dari tugas yang gagal.

Robin Roevens
sumber
2

Apa yang saya lakukan ketika saya memiliki perintah untuk dieksekusi dan ingin mendapatkan log hanya jika terjadi kegagalan adalah sebagai berikut (diawali oleh comamnd shell seperti /bin/sh -c '...'jika inisiator tidak menggunakan systempanggilan atau menjalankan perintah secara langsung tanpa shell) :

command 2&>1 > command-log.txt || cat command-log.txt

Ini akan mengarahkan kesalahan dan output standar ke file dan menampilkan konten file jika terjadi kegagalan saja. Jika perintahnya sangat bertele-tele dan Anda tidak ingin menyimpan log ketika tidak apa-apa, Anda bisa menggunakannya:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Kutipan untuk &&dan ||penggunaan dari sh manpage :

Simbol && (||) menyebabkan daftar berikut ini dijalankan hanya jika pipa sebelumnya mengembalikan nilai nol (bukan nol).

Itu mungkin bukan cara yang paling idiomatis untuk melakukannya dengan mungkin tetapi memiliki keuntungan menjadi sangat portabel dengan sistem manajemen konfigurasi yang memberikan kemampuan untuk menampilkan perintah stdout.

Tensibai
sumber
0

Dengan asumsi dimungkinkan melemparkan kesalahan ke stderr Anda dapat menangkap output kesalahan dalam program apa pun ke file menggunakan pengalihan output:

some command 2> error.log

Namun saya tidak berpikir ini masalahnya.

Sebaliknya Anda akan cenderung ingin merujuk ke panduan ini untuk memutuskan kapan akan terjadi kesalahan http://docs.ansible.com/ansible/playbooks_error_handling.html dan kemudian grep output untuk string yang menunjukkan kesalahan sebelum keluaran ke file

yaitu.

ansible-playbook my-playbook | grep 'error' > error.log

yosefrow
sumber
-2

Saya pikir apa yang Anda cari mungkin terlalu redirect stdout dan jalan ke file.

Biasanya, some-command &> logfile.log

atau varian ....

sparq
sumber
Yang hanya sebagian jawaban, OP ingin melihat log jika terjadi kesalahan.
Tensibai
Saya tidak menganggap ini sebagai jawaban parsial untuk pertanyaan ini. Tidak apa-apa untuk skrip shell, tetapi tidak berguna untuk pengkodean di ansible .
anak ayam
@chicks Saya pikir itu bisa menjadi solusi yang valid pada pendekatan metode 'shell' dalam ansible (yang saya tidak tahu banyak)
Tensibai
-2

Tee akan menjadi alat yang sangat sederhana untuk masuk, Anda dapat merujuk perintah berikut.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Eric Zhang
sumber
2
1. Ini memengaruhi seluruh proses, bukan hanya satu tugas. 2. Tidak ada gunanya memipis melalui tee jika Anda akan mengarahkan stdout ke file; itu bukan cara Anda menggunakan perintah. 3. Jika Anda menggunakan tee dengan benar, itu masih akan menampilkan semua spam ke konsol, yang OP tidak inginkan.
Boikot SE untuk Monica Cellio