ฉันจะรับบันทึก / รายละเอียดของการดำเนินการโมดูล Ansible-playbook ได้อย่างไร


96

สมมติว่าฉันดำเนินการต่อไปนี้

$ 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

$

ฉันรู้แน่ว่ามันสำเร็จ

ฉันจะเห็น "Hello World" สะท้อน / พิมพ์โดยสคริปต์ของฉันบนรีโมตโฮสต์ (MyTestHost) ได้อย่างไร หรือรหัสส่งคืน / ออกของสคริปต์?

งานวิจัยของฉันแสดงให้ฉันเห็นว่าเป็นไปได้ที่จะเขียนปลั๊กอินเพื่อสกัดกั้นการเรียกกลับการเรียกใช้โมดูลหรือบางอย่างในบรรทัดเหล่านั้นและเขียนไฟล์บันทึก ฉันไม่อยากเสียเวลาไปกับสิ่งนั้น

เช่นบางอย่างเช่น stdout ด้านล่าง (โปรดทราบว่าฉันใช้งาน Ansible และไม่ใช่ 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"
}

$

คำตอบ:


115

หากคุณส่ง-vแฟล็กไปยัง ansible-playbook บนบรรทัดคำสั่งคุณจะเห็น stdout และ stderr สำหรับแต่ละงานที่ดำเนินการ:

$ ansible-playbook -v playbook.yaml

Ansible ยังรองรับการบันทึกในตัวอีกด้วย เพิ่มบรรทัดต่อไปนี้ในไฟล์คอนฟิกูเรชันที่ตอบได้ของคุณ:

[defaults] 
log_path=/path/to/logfile

Ansible จะดูไฟล์ config ในหลาย ๆ ที่:

  • ansible.cfg ในไดเร็กทอรีปัจจุบันที่คุณเรียกใช้ ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
ขอบคุณ. แค่โลภ: ฉันสามารถเริ่ม / หยุดการบันทึกจาก playbook แบบไดนามิกได้หรือไม่? ชอบset -xและset +xในเชลล์สคริปต์
Kashyap

@thekashyap ฉันไม่คิดว่าตอนนี้จะเป็นไปได้
Lorin Hochstein

9
คุณสามารถใช้no_log: Trueแฟล็กเพื่อป้องกันไม่ให้คำสั่งหรือเพลย์บุ๊กเข้าสู่ระบบได้ แต่ฉันเชื่อว่ามันเป็นแบบละเอียด
Ade Miller

4
คุณช่วยอธิบายได้ไหมว่าฉันต้องทำอย่างไรlogrotateเพื่อlog_pathให้ทุกการansibleรันมีไฟล์ที่แตกต่างกัน (พร้อมคำสั่ง / playbook ที่รวมอยู่ในไฟล์)
ไตโรโฟมบิน

ฉันต้องการสามvวินาทีเพื่อให้ได้มาซึ่งความ
รวย

24

งานสคริปต์ PlayBook จะสร้างstdoutเช่นเดียวกับคำสั่งที่ไม่ playbook registerของมันก็จะต้องมีการบันทึกไว้ในตัวแปรที่ใช้ เมื่อเราได้สิ่งนั้นแล้วโมดูลดีบักสามารถพิมพ์ไปยังสตรีมเอาต์พุตของเพลย์บุ๊ก

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 }}`."

ผลลัพธ์ควรมีลักษณะดังนี้:

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`."
}

แต่สวัสดีตัวเองงานไม่ได้ให้ความสำคัญใด ๆ
Saurabh Chandra Patel

นี่เป็นวิธีที่ฉันชอบ ใช้ค่าของตัวแปรที่ลงทะเบียนในคำสั่ง debug ให้ดีและโลกนี้ก็คือหอยนางรมของคุณ
Joshua K

16

นอกจากนี้ยังมีวิธีอื่นในการสร้างไฟล์บันทึก

ก่อนรันansible-playbookรันคำสั่งต่อไปนี้เพื่อเปิดใช้งานการบันทึก:

  • ระบุตำแหน่งสำหรับล็อกไฟล์

    ส่งออก ANSIBLE_LOG_PATH = ~ / ansible.log

  • เปิดใช้งานการแก้ไขข้อบกพร่อง

    ส่งออก ANSIBLE_DEBUG = True

  • เพื่อตรวจสอบไฟล์บันทึกที่สร้างขึ้น

    น้อยกว่า $ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG แยกจากการระบุล็อกไฟล์ มันแยกจากการเลือกฟุ่มเฟื่อยด้วยซ้ำ! สิ่งนี้ยังดีมากที่จะโทรออก - การดีบักจะทำให้คุณได้รับข้อความดีบักที่มุ่งเน้นนักพัฒนาในระดับความฟุ่มเฟื่อย ดีที่จะมีรอบ
AlanSE

4

ปลั๊กอินอย่างเป็นทางการ

คุณสามารถใช้ปลั๊กอินโทรกลับเอาท์พุท ตัวอย่างเช่นเริ่มต้นใน Ansible 2.4 คุณสามารถใช้ปลั๊กอินการเรียกกลับเอาต์พุตดีบัก :

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

(ในทางกลับกันเรียกใช้export ANSIBLE_STDOUT_CALLBACK=debugก่อนที่จะเรียกใช้ playbook ของคุณ)

สำคัญ: คุณต้องรันansible-playbookด้วยตัวเลือก-v( --verbose) เพื่อดูเอฟเฟกต์ ด้วยการstdout_callback = debugตั้งค่าผลลัพธ์ควรมีลักษณะดังนี้:

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

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

มีโมดูลอื่น ๆ นอกเหนือจากdebugโมดูลนี้หากคุณต้องการให้เอาต์พุตมีรูปแบบที่แตกต่างกัน มีjson, yaml, unixy, dense, minimalฯลฯ ( รายการเต็มรูปแบบ )

ตัวอย่างเช่นด้วยstdout_callback = yamlผลลัพธ์จะมีลักษณะดังนี้:

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>

ปลั๊กอินของบุคคลที่สาม

หากไม่มีปลั๊กอินทางการใดที่น่าพอใจคุณสามารถลองใช้human_logปลั๊กอินได้ มีไม่กี่เวอร์ชัน:


3

การใช้ปลั๊กอินการเรียกกลับคุณสามารถกำหนดผลลัพธ์คำสั่งของคุณในรูปแบบที่อ่านได้ด้วย play: gist: human_log.py

แก้ไขตัวอย่างผลลัพธ์:

 _____________________________________
< 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

วิธีใช้บรรทัดคำสั่ง Ansible เช่นansible-playbook --helpแสดงวิธีเพิ่มความละเอียดของเอาต์พุตโดยการตั้งค่าโหมด verbose (-v) เป็น verbosity มากขึ้น (-vvv) หรือเพื่อการเชื่อมต่อ debugging verbosity (-vvvv) สิ่งนี้ควรให้รายละเอียดบางอย่างที่คุณอยู่ใน stdout ซึ่งคุณสามารถเข้าสู่ระบบได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.