แสดงผลด้วย Ansible


37

ฉันมีการเล่น Ansible สำหรับ PGBouncerที่แสดงผลลัพธ์บางอย่างจากโมดูลสถิติที่สร้างไว้ใน PGBouncer

ปัญหาของฉันคือเมื่อ Ansible พิมพ์เอาต์พุตไปยังเทอร์มินัล แทนที่จะมองเห็น

----------
| OUTPUT |
----------

ฉันเห็น

----------\n| OUTPUT |\n----------

ไม่มีใครรู้วิธีรับ Ansible เพื่อ "พิมพ์สวย" ออกหรือไม่

คำตอบ:


14

ไม่มีวิธีการทำสิ่งที่คุณต้องการใน Ansible คุณสามารถทำสิ่งนี้เป็นวิธีแก้ปัญหา:

ansible-playbook ... | sed 's/\\n/\n/g'

1
ใน OSX sed -e 's/\\n/'$'\\\n/g'ผมต้องใช้ ที่เกี่ยวข้องเพิ่มเติม: comicjk.com/20
Navin

4
ดู sorins answer serverfault.com/a/846232/240508ซึ่งเป็นหนึ่งที่ถูกต้องในปี 2017 และ ansible> 2.3
Vadimo

ส่วนใหญ่\nจะปรากฏในผลดังนั้นคุณสามารถใช้ regexp นี้ในข้อความแก้ปัญหาของคุณ:msg: "{{ result.stdout | regex_replace('\\n', '\n') }}"
klml

61

หากคุณต้องการคำจำกัดความที่เป็นมิตรต่อมนุษย์มากขึ้น:

ANSIBLE_STDOUT_CALLBACK=debug

สิ่งนี้จะทำให้สามารถใช้โมดูลเอาท์พุทการดีบัก (ชื่อก่อนหน้านี้human_log) ได้แม้จะมีชื่อที่โชคร้ายน้อยกว่า verbose และมนุษย์อ่านได้ง่ายขึ้นมาก

หากคุณได้รับข้อผิดพลาดว่าโมดูลนี้ไม่พร้อมใช้งานให้อัพเกรด Ansible หรือเพิ่มโมดูลนี้ในตัวเครื่องหากคุณไม่สามารถอัพเกรด ansible ได้มันจะทำงานกับ ansible เช่น 2.0 หรือ probaly เวอร์ชัน 1.9

ตัวเลือกอื่นในการกำหนดค่านี้คือการเพิ่มstdout_callback = debugansible.cfg ของคุณ


13
นี่ควรเป็นคำตอบที่ยอมรับในปี 2560 เอาต์พุตบันทึกที่เป็นมิตรกับมนุษย์ถูกส่งออกจากกล่อง
Vadimo

1
นี่คือเคล็ดลับเพิ่มเติมเพื่อให้ถาวรมากขึ้น: github.com/ansible/ansible/issues/27078#issuecomment-364560173
kramer65

1
ANSIBLE_STDOUT_CALLBACK=yamlหรือ ฉันชอบเพราะรูปแบบที่ดีfail msgเมื่อฉันให้วัตถุ
Marinos

13

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


2
หมายเหตุ: ด้วย ansible 2.0.x คุณจำเป็นต้องสืบทอดจากการCallbackBaseอิมพอร์ตด้วยfrom ansible.plugins.callback import CallbackBaseเพื่อให้คลาส callback ทำงานได้
อัลโล

12

พบวิธีนี้ในฟอรัมกลุ่ม Ansible Project:

- name: "Example test"
  command:
    ...
  register: test
- name: "Example test stdout"
  debug:
    msg: "{{ test.stdout.split('\n') }}"
- name: "Example test stderr"
  debug:
    msg: "{{ test.stderr.split('\n') }}"

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


นั่นทำให้การส่งออกเชลล์ชัดเจนมากขึ้น! ดี!
Asfand Qazi

วิธีนี้ดูเหมือนว่าจะมีข้อเสียเปรียบหลักอย่างหนึ่ง - หากการดำเนินการของโมดูล "ตัวอย่างการทดสอบ" ล้มเหลวโดยปกติการสร้างเพลย์บุ๊คทั้งหมดจะล้มเหลวและคุณจะไม่เห็นผลลัพธ์ที่จัดรูปแบบโดยเฉพาะอย่างยิ่งสำหรับ stderr
René

@ Renéคุณพูดถูก เพื่อให้คุณสามารถเพิ่มignore_errors: yesคำสั่งเดิมและในภายหลังเช่น `- ยืนยัน: ว่า:" test.rc == 0 "
jhutar

1

คุณสามารถใช้โมดูลหยุดชั่วคราว :

- pause:
    prompt: "{{ variable_blob.stdout }}"

ย้ายโดยไม่มีอินพุตโดยการกำหนดนาทีหรือวินาทีแต่จะไม่มีการบันทึกอินพุตของผู้ใช้

เครดิต: https://github.com/ansible/ansible/issues/17446#issuecomment-245391682


0

หากคุณต้องการที่จะเห็นมันในรูปแบบที่เลียนแบบเอาท์พุทมาตรฐานจริงคุณสามารถใช้debugปลั๊กอินโทรกลับกับdebugโมดูลใน Ansible 2.7+ ดังนี้:

- name: "Test Output"
  debug:
    msg: "{{ test_result.stdout_lines | join('\n') }}"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.