Bagaimana cara mendapatkan log / detail dari eksekusi modul pedoman yang mungkin?


95

Katakanlah saya menjalankan yang berikut ini.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Saya tahu pasti bahwa itu berhasil.

Di mana / bagaimana saya melihat "Hello World" bergema / dicetak oleh skrip saya pada host jarak jauh (MyTestHost)? Atau kode kembali / keluar dari skrip?

Penelitian saya menunjukkan kepada saya bahwa dimungkinkan untuk menulis plugin untuk mencegat callback eksekusi modul atau sesuatu di baris tersebut dan menulis file log. Saya lebih suka tidak membuang waktu saya dengan itu.

Misalnya sesuatu seperti stdout di bawah (perhatikan bahwa saya menjalankan ansible dan bukan ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$

Jawaban:


114

Jika Anda meneruskan -vbendera ke ansible-playbook di baris perintah, Anda akan melihat stdout dan stderr untuk setiap tugas yang dijalankan:

$ ansible-playbook -v playbook.yaml

Ansible juga memiliki dukungan bawaan untuk logging. Tambahkan baris berikut ke file konfigurasi Anda yang memungkinkan :

[defaults] 
log_path=/path/to/logfile

Ansible akan mencari file konfigurasi di beberapa tempat:

  • ansible.cfg di direktori saat ini tempat Anda menjalankan ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
Terima kasih. Hanya serakah: Dapatkah saya secara dinamis memulai / menghentikan pencatatan dari pedoman? Suka set -xdan set +xdalam skrip shell.
Kashyap

@thekashyap Saya rasa saat ini tidak memungkinkan.
Lorin Hochstein

9
Anda dapat menggunakan no_log: Truebendera untuk mencegah perintah atau buku pedoman dari pencatatan tetapi itu sangat halus seperti yang saya yakini.
Ade Miller

4
Bisa tolong jelaskan bagaimana saya menempatkan logrotateke log_pathsehingga setiap ansiblerun memiliki file yang berbeda (dengan perintah / pedoman termasuk dalam file)?
styrofoam terbang

Saya butuh tiga vdetik untuk menjadi stdout dan stderr
rich

24

Tugas skrip playbook akan menghasilkan stdoutseperti perintah non-playbook, hanya perlu disimpan ke variabel menggunakan register. Setelah kita mendapatkannya, modul debug dapat mencetak ke aliran keluaran playbook.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

Outputnya akan terlihat seperti ini:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}

tapi Halo sendiri tugas belum memberikan stdout apapun
Saurabh Chandra Patel

Ini adalah metode pilihan saya. Jadilah ahli dalam menggunakan nilai variabel terdaftar dalam pernyataan debug dan dunia adalah tiram Anda.
Joshua K

14

Ada juga cara lain untuk menghasilkan file log.

Sebelum menjalankan ansible-playbookjalankan perintah berikut untuk mengaktifkan logging:

  • Tentukan lokasi untuk file log.

    ekspor ANSIBLE_LOG_PATH = ~ / ansible.log

  • Aktifkan Debug

    ekspor ANSIBLE_DEBUG = Benar

  • Untuk memeriksa file log yang dihasilkan.

    kurang dari $ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG adalah jenis terpisah dari menentukan file log. Itu bahkan terpisah dari pemilihan verbositas! Ini masih sangat bagus untuk disebutkan - debug akan memberi Anda pesan debug yang berorientasi pada pengembang, pada tingkat verbositas yang benar-benar ekstrim. Bagus untuk dimiliki.
AlanSE

4

Plugin resmi

Anda dapat menggunakan plugin panggilan balik keluaran . Misalnya, mulai dari Ansible 2.4, Anda dapat menggunakan plugin callback keluaran debug :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(Secara alternatif, jalankan export ANSIBLE_STDOUT_CALLBACK=debugsebelum menjalankan playbook Anda)

Penting: Anda harus menjalankan ansible-playbookdengan opsi -v( --verbose) untuk melihat efeknya. Dengan stdout_callback = debugset, hasilnya sekarang akan terlihat seperti ini:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Ada modul lain selain debugmodul jika Anda ingin keluaran diformat berbeda. Ada json, yaml, unixy, dense, minimal, dll ( daftar lengkap ).

Misalnya, dengan stdout_callback = yaml, hasilnya akan terlihat seperti ini:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Plugin pihak ketiga

Jika tidak ada plugin resmi yang memuaskan, Anda dapat mencoba human_logplugin tersebut. Ada beberapa versi:


3

Menggunakan plugin callback, Anda dapat memiliki stdout dari keluaran perintah Anda dalam bentuk yang dapat dibaca dengan play : gist: human_log.py

Edit untuk contoh keluaran:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859

1

Bantuan baris perintah yang memungkinkan, seperti ansible-playbook --helpmenunjukkan cara meningkatkan verbositas keluaran dengan menyetel mode verbose (-v) ke lebih banyak verbositas (-vvv) atau untuk menghubungkan debugging verbosity (-vvvv). Ini akan memberi Anda beberapa detail yang Anda cari di stdout, yang kemudian dapat Anda log.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.