Bagaimana cara melihat stdout dari perintah yang memungkinkan?

165

Bagaimana cara melihat stdout untuk perintah playbook yang mungkin? -v hanya menampilkan keluaran yang dimungkinkan, bukan perintah individual. Akan lebih bagus jika saya bisa mengetahui bagaimana melakukan ini dengan segera, jadi jika sesuatu gagal atau hang saya bisa melihat mengapa.

misalnya

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

akan dicetak

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

hello
QuinnBaetz
sumber

Jawaban:

165

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

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

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

- debug: msg="{{ hello.stderr }}"
bfschott
sumber
26
Selain itu, Anda dapat men-debug variabel secara langsung dengan - debug: var=hello. Kadang-kadang ini lebih bermanfaat untuk output multiline atau output modul Ansible (daripada command/ shelloutput).
geerlingguy
4
Saya kesulitan mendapatkan output Java menggunakan ini. Cara mengatasinya adalah mengarahkan semua output Java ke stdout:shell: java -version 2>&1
Matthias Braun
20
itu jauh lebih baik, tetapi Anda hanya mendapatkan pesan stdout setelah perintah berhasil diselesaikan. Saya mengalami masalah di mana anonim akan muncul untuk menggantung. Alasannya adalah bahwa saya menggunakan nama pengguna yang salah untuk perintah rsync, yang menggulung permintaan kata sandi interaktif, yang baru saja digantung. Sangat sulit untuk melakukan debug - tetapi jika saya dapat melihat stdout secara realtime, saya akan segera menyadari apa yang telah saya lakukan salah. Saya akan MENYUKAI fungsi ini, jika memungkinkan.
Michael B
10
sementara ini berfungsi, itu berarti membuat debug sangat sulit. Mari kita bayangkan tugas pertama tidak pernah berakhir (mungkin bodoh menunggu input pengguna) ... pengguna tidak akan pernah tahu! Selain itu, registermodul, atau apa pun itu tidak menghasilkan objek yang memiliki set variabel stdoutatau stderr.... jadi sangat buruk bahwa kita tidak hanya mendapatkan output secara default: |
vlad-ardelean
96

Alih-alih stdout saya sarankan menggunakan stdout_lines . Untuk output multiline ini jauh lebih baik, misalnya

- 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 keluaran waktu nyata untuk keperluan debugging ada laporan bug tertutup https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 membahas alasan mengapa ini tidak mungkin dan tidak akan dilaksanakan.

Mars
sumber
16
+1 untuk menautkan bug "keluaran waktu nyata".
ntc2
Jika saya ingin mengirim out.stdout_lines (sebagai badan tugas email Ansible), bagaimana saya bisa mengirimnya sehingga TIDAK terlihat seperti ini ketika email diterima? [uotal 61 ', u'lrwxrwxrwx 1 root root 7 Feb 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 Agustus 24 24:08 boot ', u' .... . '] Saya ingin tampilannya seperti ini, seperti yang terlihat pada terminal
Chris F
fatal: [127.0.0.1]: GAGAL! => {"alasan": "Kesalahan Sintaksis saat memuat YAML. \ n tidak menemukan yang diharapkan <dokumen mulai> \ n \ nKesalahan tampaknya ada di ... masalah sintaksis. \ n \ nLini yang menyinggung tampaknya adalah: \ n \ n \ n- name: Jalankan ls.sh dan hasilkan \ "ls / \" \ n ^ di sini \ n "}
Nate
20

Saya menemukan menggunakan minimal stdout_callback dengan playbook-ansible memberikan output serupa dengan menggunakan ad-hoc mungkin.

Di ansible.cfg Anda (Perhatikan bahwa saya menggunakan OS X, jadi ubah callback_pluginsjalur yang sesuai dengan pemasangan Anda)

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

Sehingga jadi 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 playbook yang memungkinkan 2.2.1.0

Jason S
sumber
Plugin callback yang bagus, post-processing sederhana dapat mengekstrak output standar saja.
RichVel