Pertanyaan Bagaimana cara melihat stdout perintah ansible?


Bagaimana saya melihat stdout untuk perintah-perintah main-main? -v hanya menunjukkan keluaran yang mungkin, bukan perintah individu. Akan lebih bagus lagi jika saya bisa mengetahui cara melakukan ini dengan segera, jadi jika sesuatu gagal atau macet, saya dapat melihat mengapa.

misalnya

- name: print to stdout
  action: command echo "hello"

akan mencetak

TASK: [print variable] ******************************************************** 

hello

123
2017-09-06 21:01




terkait: serverfault.com/questions/667252/… - Capi Etheriel
stackoverflow.com/questions/20563639/… - JonnyJD


Jawaban:


Saya pikir Anda dapat mendaftarkan hasilnya ke variabel, lalu cetak dengan debug.

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"

126
2017-09-14 13:01



Selain itu, Anda dapat mendebug variabel secara langsung dengan - debug: var=hello. Kadang-kadang ini lebih bermanfaat untuk output multiline atau output modul Ansible (bukan command/shell keluaran). - geerlingguy
Saya kesulitan mendapatkan keluaran Java menggunakan ini. Perbaikannya adalah untuk mengalihkan semua output Java ke stdout: shell: java -version 2>&1 - Matthias Braun
itu jauh lebih baik, tetapi Anda hanya mendapatkan pesan stdout setelah perintah telah berhasil diselesaikan. Saya mengalami masalah di mana ansible akan muncul untuk menggantung. Alasannya adalah karena saya menggunakan nama pengguna yang salah untuk perintah rsync, yang membuat permintaan kata sandi interaktif, yang hanya digantung saja. Sangat sulit untuk melakukan debug - tetapi jika saya dapat melihat stdout secara realtime, saya akan segera menyadari kesalahan yang telah saya lakukan. Saya akan MENCINTAI fungsi ini, jika memungkinkan. - Michael B
sementara ini bekerja, itu berarti membuat debugging sangat sulit. Mari kita bayangkan tugas pertama tidak pernah berakhir (mungkin dengan bodoh menunggu input pengguna) ... pengguna tidak akan pernah tahu! Apalagi, itu register modul, atau apa pun itu tidak menghasilkan objek yang memiliki stdout atau stderr set variabel .... jadi sangat buruk bahwa kita tidak hanya mendapatkan output secara default: | - vlad-ardelean


Dari pada stdout Saya sarankan menggunakan stdout_lines. Untuk keluaran multiline, ini jauh lebih bagus, mis.

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

memberi

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

Mengenai output waktu nyata untuk keperluan debugging ada laporan bug yang tertutup https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 mendiskusikan alasan mengapa hal ini tidak mungkin dan tidak akan dilaksanakan.


75
2017-09-08 18:12



+1 untuk menautkan bug "keluaran waktu nyata". - ntc2
Jika saya ingin mengirim out.stdout_lines (sebagai badan dari tugas surat Ansible), bagaimana saya bisa mengirimkannya sehingga TIDAK terlihat seperti ini ketika email diterima? [u'total 61 ', u'lrwxrwxrwx 1 root root 7 Feb 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 24 Agu 22:08 boot ', u' .... . '] Saya ingin terlihat seperti ini, seperti yang terlihat di terminal - Chris F


Saya menemukan menggunakan minimal  stdout_callback dengan ansible-playbook memberikan hasil yang sama untuk menggunakan ad-hoc ansible.

Di ansible.cfg Anda (Perhatikan bahwa saya di OS X jadi ubah callback_plugins jalur yang sesuai dengan instalasi Anda)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

Sehingga tugas seperti ini

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

Memberikan output seperti ini, seperti perintah ad-hoc

example | SUCCESS | rc=0 >>
hi ...

Saya menggunakan ansible-playbook 2.2.1.0


13
2018-04-06 08:12



Plugin callback yang bagus, proses pasca yang sederhana dapat mengekstrak keluaran standar saja. - RichVel