ฉันจะบันทึกงานที่ส่งออกไปยังไฟล์ได้อย่างไร


10

หนึ่งในงานของฉันเบิ้ลนำเข้าฐานข้อมูล Oracle impdpใช้

นี้จะสร้างจำนวนมากno_log: Trueของการส่งออกไปยังคอนโซลดังนั้นผมจึงได้ตั้ง

อย่างไรก็ตามเมื่อล้มเหลวฉันต้องการดูบันทึก!

ฉันจะสร้างบันทึกการใช้งานนี้เป็นไฟล์และไม่ไปที่คอนโซลได้อย่างไร


คุณใช้โมดูลคำสั่งหรือไม่
Xiong Chiamiov

แนวคิดหนึ่ง [แฮ็คเพิ่มเติม] คือการเขียนบันทึกไปยังไฟล์ภายนอกบางส่วนแล้วมีงานหลังจากที่ใช้งานfailed_whenเงื่อนไขแล้วลบไฟล์บันทึกหากก่อนหน้านี้ งานสำเร็จแล้ว :)
Dawny33

เหตุใดคุณจึงเห็นเอาต์พุตคอนโซลในระหว่างการรันสำเร็จ ฉันไม่เห็นการกำหนดค่าสำหรับและฉันคิดว่ามันเป็นไปไม่ได้ที่จะแสดง stdout ในระหว่างการดำเนินการงานที่ประสบความสำเร็จมันควรจะเกิดขึ้น [ok: ชื่อโฮสต์] อย่างไรก็ตามเมื่อตรวจพบข้อผิดพลาดเอาต์พุตจะถูกดัมพ์ไปยังคอนโซลควบคุม ansible (และบันทึก ansible ที่กำหนดไว้) คุณจะแบ่งปันการกำหนดค่าที่ให้ stdout ขนาดใหญ่ระหว่างการเรียกใช้ที่ประสบความสำเร็จเป็นประจำหรือไม่
hvindin

@hvindin ใส่-vvvหลังจากansible-playbookคำสั่งสำหรับการบันทึก verbose
Dawny33

1
การลงทะเบียนตัวแปรดูเหมือนจะเป็นการเคลื่อนไหวที่ดีที่สุดดูความคิดเห็นของฉันในคำตอบของคุณสำหรับความคิดเห็นของฉันเกี่ยวกับสิ่งที่ต้องทำกับผลลัพธ์จากคำสั่งทริกเกอร์ ansible
hvindin

คำตอบ:


4

[แปลงความคิดเห็นของฉันเป็นคำตอบ]

วิธีหนึ่งในการทำเช่นนี้คือการเขียนบันทึกไปยังไฟล์ภายนอกบางไฟล์แล้วมีงานหลังจากที่ใช้งานสภาพที่ล้มเหลวแล้วและลบไฟล์บันทึกหากงานก่อนหน้าประสบความสำเร็จ

สิ่งนี้จะช่วยคุณได้

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

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

หมายเหตุ: นี่อาจไม่ใช่วิธีที่ดีที่สุดในการจัดการปัญหาของคุณ แต่นี่เป็นแฮ็คที่ช่วยให้ฉันทำการบันทึกและตรวจสอบ


2
ฉันจะไปอีกหนึ่งและบอกว่าคุณสามารถเขียนคำสั่งของคุณไปยัง stdout / stderr จากนั้นก็ทิ้งพวกเขาออกไปเป็นการตอบสนองต่อความล้มเหลว ดังนั้นเป็นตัวอย่างในตัวอย่างข้างต้นของคุณหากคุณไม่ต้องการหยุดการทำงานในกรณีที่เกิดความล้มเหลวให้ใช้งานล้มเหลวในการส่งออก stdout และ stderr ที่ลงทะเบียนใน PyScript เมื่อ rc! = 0 ดูเหมือนจะเป็นโซลูชั่นแบบองค์รวมมากขึ้น หากคุณใช้กลไกที่สร้างขึ้นภายใน ansibles หากคุณมีการบันทึกการตั้งค่า ansible บนเซิร์ฟเวอร์ควบคุมเป็นตัวอย่างจากนั้นเซิร์ฟเวอร์การควบคุมนั้นจะบันทึกความล้มเหลวในการบันทึก ansible ซึ่งฉันคิดว่าจะเป็นสถานที่ที่ถูกต้องสำหรับมัน
hvindin

3

ฉันคิดว่าสิ่งที่คุณต้องทำคือการลงทะเบียนเอาต์พุตของทุกคำสั่งที่คุณต้องการ (เก็บไว้ในตัวแปร) แล้วก็ทิ้งตัวแปรในไฟล์ ด้วยวิธีนี้คุณสามารถตรวจสอบได้ในภายหลัง

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

จากนั้นใน 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 }} 

ตัวอย่างที่ฉันใช้มาจากที่นี่


3

ฉันแก้ไขมันโดยการเพิ่ม

ignore_errors: true
register: results

ไปที่ no_log-task สิ่งนี้ทำให้ ansible ดำเนินการต่อในภารกิจถัดไปแม้ว่างานจะล้มเหลว จากนั้นสำหรับภารกิจถัดไปจะกำหนดภารกิจการดีบักซึ่งล้มเหลวเสมอและส่งเอาต์พุตตัวแปรที่ลงทะเบียนแล้ว แต่จะรันเฉพาะเมื่อภารกิจก่อนหน้านี้ล้มเหลว:

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

ดังนั้นแม้จะมี no_log: จริงสิ่งนี้จะทำให้สามารถแสดงผลลัพธ์ของงานที่ล้มเหลวได้ โซลูชันนี้ไม่ได้ทำการบันทึกไปยังไฟล์ตามที่ร้องขอ แต่ต้องกรอก 'ดูบันทึกเมื่อล้มเหลว' และแน่นอนว่าคุณสามารถเปลี่ยนเส้นทางหรือใช้ทีออฟเพื่อเอาท์พุท ansible แบบเต็มไปยังไฟล์ซึ่งจะด้วยวิธีนี้ ยังมีบันทึกของงานที่ล้มเหลว


2

สิ่งที่ฉันทำเมื่อฉันได้รับคำสั่งให้เรียกใช้และต้องการบันทึกเฉพาะในกรณีที่เกิดความล้มเหลวเป็นดังนี้ (นำหน้าด้วยเชลล์ comamnd เช่น/bin/sh -c '...'ในกรณีที่ผู้ริเริ่มไม่ได้ใช้การsystemเรียกหรือรันคำสั่งโดยตรงโดยไม่มีเชลล์) :

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

การดำเนินการนี้จะเปลี่ยนเส้นทางข้อผิดพลาดและเอาต์พุตมาตรฐานไปยังไฟล์และแสดงเนื้อหาของไฟล์ในกรณีที่เกิดความล้มเหลวเท่านั้น หากคำสั่งนั้นละเอียดมากและคุณไม่ต้องการเก็บบันทึกไว้เมื่อไรคุณสามารถไปที่:

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

เสนอราคา&&และ||การใช้งานจากsh manpage :

สัญลักษณ์ && (||) ทำให้รายการต่อไปนี้จะถูกดำเนินการเฉพาะถ้าขั้นตอนก่อนหน้านี้ส่งคืนค่าศูนย์ (ไม่ใช่ศูนย์)

นั่นอาจไม่ใช่วิธีที่แปลกที่สุดที่จะทำด้วย ansible แต่มีข้อดีของการพกพาได้ดีกับระบบการจัดการการกำหนดค่าใด ๆ ที่ให้ความสามารถในการแสดงคำสั่ง stdout


0

สมมติว่า ansible โยนข้อผิดพลาดไปยัง stderr อย่างถูกต้องคุณสามารถดักจับเอาต์พุตของข้อผิดพลาดในโปรแกรมใด ๆ ไปยังไฟล์โดยใช้การเปลี่ยนเส้นทางเอาต์พุต:

some command 2> error.log

อย่างไรก็ตามฉันไม่คิดว่าเป็นกรณีนี้

แต่คุณอาจต้องการอ้างอิงคู่มือนี้เพื่อตัดสินใจว่าจะเกิดข้อผิดพลาดเมื่อใดhttp://docs.ansible.com/ansible/playbooks_error_handling.htmlจากนั้น grep เอาต์พุตของคุณสำหรับสตริงที่ระบุข้อผิดพลาดก่อนที่จะส่งออกไฟล์

กล่าวคือ

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


-2

ฉันคิดว่าสิ่งที่คุณกำลังมองหาอาจเป็นเพียงแค่เปลี่ยนเส้นทาง stdout และสตรีทไปสู่ไฟล์

โดยทั่วไป some-command &> logfile.log

หรือตัวแปรบางอย่าง ....


ซึ่งเป็นเพียงคำตอบบางส่วน OP ต้องการดูบันทึกในกรณีที่เกิดข้อผิดพลาด
Tensibai

ฉันไม่ได้เป็นเพียงคำตอบบางส่วนสำหรับคำถามนี้ มันจะดีสำหรับเชลล์สคริปต์ แต่ไร้ประโยชน์สำหรับการเข้ารหัสในเบิ้ล
ลูกไก่

@ ลูกไก่ฉันคิดว่ามันอาจเป็นวิธีแก้ปัญหาที่ถูกต้องเกี่ยวกับวิธีการ 'เชลล์' ภายใน ansible (ซึ่งฉันไม่ค่อยรู้)
Tensibai

-2

Tee จะเป็นเครื่องมือที่ง่ายมากสำหรับการบันทึกคุณสามารถอ้างอิงคำสั่งต่อไปนี้

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1. สิ่งนี้มีผลต่อการทำงานทั้งหมดไม่ใช่แค่งานเดียว 2. ไม่มีประโยชน์ที่คุณจะวางท่อผ่านทีออฟหากคุณต้องการเปลี่ยนเส้นทาง stdout ไปยังไฟล์ นั่นไม่ใช่วิธีที่คุณใช้คำสั่ง 3. ถ้าคุณใช้ tee อย่างถูกต้องมันจะยังส่งสแปมทั้งหมดไปยังคอนโซลซึ่ง OP ไม่ต้องการ
Xiong Chiamiov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.