การแยกวิเคราะห์เอาต์พุต Ansible ด้วยเครื่องมือ Linux

ฉันมี Playbook ไร้สาระที่เพิ่งรันคำสั่งเพื่อรับรายการ vhost ในทุกโฮสต์ในกลุ่มเว็บเซิร์ฟเวอร์ เนื่องจาก vhost ทั้งหมดอยู่ใน /var/www จึงง่ายต่อการรับรายชื่อเว็บ

ปัญหาคือวิธีที่ Ansible ส่งคืนข้อมูล ตัวอย่างเช่น:

ok: [host1] => {
    "var": {
        "out.stdout_lines": [
            "",
            "host1.com"
        ]
    }
}
ok: [host2] => {
    "var": {
        "out.stdout_lines": [
            "",
            "host2.com"
        ]
    }
}

คุณรู้วิธีง่ายๆ ในการเรียกชื่อ vhosts หรือไม่? ใช้ grep awk หรืออะไรทำนองนั้น?


person Rubendob    schedule 19.08.2016    source แหล่งที่มา


คำตอบ (2)


วิธีที่สกปรก: เพิ่มเครื่องหมาย (เช่น ANSBLMRK_) นำหน้าแต่ละบรรทัดใน stdout_lines ก่อนพิมพ์ ดังนั้นคุณจึงมีรายการหากเป็น "ANSBLMRK_host2.com" ตามด้วย grep และ cut

วิธีที่ดี: ตั้งค่า ANSIBLE_STDOUT_CALLBACK=json และไปป์ที่ jq

person Konstantin Suvorov    schedule 19.08.2016
comment
สวัสดีคอนสแตนติน ANSIBLE_STDOUT_CALLBACK นี้เป็นปลั๊กอินประเภทหนึ่งใช่ไหม - person Rubendob; 19.08.2016
comment
ใช่ คุณสามารถปรับแต่งเอาต์พุต ansible ด้วยปลั๊กอินได้ json เป็นค่ามาตรฐานที่พิมพ์เอาต์พุต Playbook ทั้งหมดไปยังออบเจ็กต์ JSON ดังนั้นคุณจึงสามารถแยกวิเคราะห์ด้วยเครื่องมืออื่นๆ เช่น jq ได้อย่างง่ายดาย - person Konstantin Suvorov; 19.08.2016

อาจแค่เขียนไฟล์ที่มีชื่อโฮสต์ใน Playbook ของคุณแล้วใช้ในภายหลัง:

tasks:

- name: make output file
  file: name=./list_of_hosts state=touch

- name: show my hostname
  lineinfile: dest=./list_of_hosts line="{{ item }}"
  with_items:
    "{{ out.stdout_lines[1] }}"
person Rob H    schedule 19.08.2016