วิธีดู stdout ของคำสั่ง ansible?


165

ฉันจะดู stdout สำหรับคำสั่ง ansible-playbook ได้อย่างไร -v แสดงเอาต์พุตที่ออกได้เท่านั้นไม่ใช่คำสั่งแต่ละคำสั่ง มันจะดีมากถ้าฉันสามารถหาวิธีทำสิ่งนี้ได้ทันทีดังนั้นหากมีบางอย่างล้มเหลว

เช่น

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

จะพิมพ์

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

hello

เกี่ยวข้อง: serverfault.com/questions/667252/…
Capi Etheriel

คำตอบ:


165

ฉันคิดว่าคุณสามารถลงทะเบียนผลลัพธ์กับตัวแปรแล้วพิมพ์ด้วยการดีบัก

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

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

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

26
- debug: var=helloนอกจากนี้คุณยังสามารถแก้ปัญหาตัวแปรโดยตรงกับ บางครั้งสิ่งนี้มีประโยชน์มากขึ้นสำหรับเอาต์พุตแบบหลายบรรทัดหรือเอาต์พุตโมดูลแบบ Ansible (แทนที่จะเป็นcommand/ shellเอาต์พุต)
geerlingguy

4
ฉันมีปัญหาในการรับเอาต์พุต Java โดยใช้สิ่งนี้ การแก้ไขคือการเปลี่ยนเส้นทางเอาต์พุตของ Java ทั้งหมดไปยัง stdout:shell: java -version 2>&1
Matthias Braun

20
ไม่มีอะไรดีไปกว่านี้อีกแล้ว แต่คุณจะได้รับข้อความ stdout หลังจากที่คำสั่งดำเนินการเสร็จสมบูรณ์ ฉันมีปัญหาที่ ansible จะปรากฏขึ้นเพื่อแขวน เหตุผลก็คือฉันใช้ชื่อผู้ใช้ที่ไม่ถูกต้องสำหรับคำสั่ง rsync ซึ่งสพูลคำขอรหัสผ่านแบบโต้ตอบซึ่งแขวนคอกันไม่ได้ มันยากมากที่จะทำการดีบัก - แต่ถ้าฉันเห็น stdout แบบเรียลไทม์ฉันจะรู้ทันทีว่าฉันทำอะไรผิด ฉันชอบฟังก์ชั่นนี้ถ้าเป็นไปได้
Michael B

10
ในขณะที่ใช้งานได้หมายความว่า ansible ทำให้การดีบักยากจริงๆ ลองนึกภาพงานแรกไม่เคยยุติ (บางทีมันอาจจะโง่ที่กำลังรอข้อมูลจากผู้ใช้) ... ผู้ใช้จะไม่มีทางรู้! ยิ่งกว่านั้นregisterโมดูลหรืออะไรก็ตามที่ไม่ได้ผลิตวัตถุที่มีstdoutหรือstderrชุดตัวแปร .... ดังนั้นมันจึงแย่มากที่เราไม่ได้รับเอาท์พุทเป็นค่าเริ่มต้น: |
vlad-ardelean

96

แทนที่จะstdoutฉันจะแนะนำให้ใช้stdout_lines สำหรับการส่งออกหลายบรรทัดนี้จะดีกว่ามากเช่น

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

    - debug: var=out.stdout_lines

จะช่วยให้

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"
        ]
    }
}

เกี่ยวกับเอาต์พุตแบบเรียลไทม์สำหรับจุดประสงค์ในการดีบักมีรายงานบั๊กที่ปิดอยู่ https://github.com/ansible/ansible/ansues/3887#issuecomment-54672569 อธิบายถึงสาเหตุที่เป็นไปไม่ได้และจะไม่ถูกนำมาใช้


16
+1 สำหรับการเชื่อมโยงข้อผิดพลาด "ส่งออกตามเวลาจริง"
ntc2

ถ้าฉันต้องการส่งออก stdout_lines (เป็นเนื้อหาของงานจดหมาย Ansible) ฉันจะส่งได้อย่างไรเพื่อให้ไม่เป็นเช่นนี้เมื่อได้รับอีเมล [u'total 61 ', u'lrwxrwxrwx 1 รูทราก 7 ก.พ. 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 รูตราก 1024 1024 24 24:08 บูต ', u' .... . '] ฉันต้องการให้มันมีลักษณะเช่นนี้เท่าที่เห็นในสถานี
Chris F

ร้ายแรง: [127.0.0.1]: ล้มเหลว! => {"เหตุผล": "ข้อผิดพลาดทางไวยากรณ์ขณะโหลด YAML ไม่พบ <เอกสารเริ่ม> \ n \ n ข้อผิดพลาดดูเหมือนจะเกิดขึ้นใน ... ปัญหาทางไวยากรณ์ \ n \ n บรรทัดที่ละเมิดดูเหมือนจะเป็น: \ n \ n \ n- ชื่อ: เรียกใช้ ls.sh และเอาท์พุท \ "ls / \" \ n ^ ที่นี่ \ n "}
เนท

20

ฉันพบว่าการใช้งานขั้นต่ำ stdout_callbackกับ ansible-playbook นั้นให้ผลลัพธ์ที่คล้ายคลึงกับการใช้ ad-hoc ansible

ใน ansible.cfg ของคุณ (โปรดทราบว่าฉันอยู่บน OS X ดังนั้นให้ปรับเปลี่ยนcallback_pluginsเส้นทางเพื่อให้เหมาะกับการติดตั้งของคุณ)

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

เพื่อให้เป็นงานเช่นนี้

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

ให้เอาต์พุตแบบนี้เช่นคำสั่ง ad-hoc

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

ฉันใช้ ansible-playbook 2.2.1.0


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