Score:0

ส่ง json เป็นพารามิเตอร์ในงาน "command" แบบไดนามิก

ธง lc

ฉันมีหน้าที่นี้ใน playbook ของฉัน:

- ชื่อ: อัปเดตแท็กอินสแตนซ์
    คำสั่ง: การอัปเดตอินสแตนซ์การคำนวณ oci -c {{ ช่อง }} --freeform-tags {{ tag_var_json }}

ให้เป็นไปตาม เอกสารออราเคิล สำหรับคำสั่งนี้ พารามิเตอร์ --แท็กรูปแบบอิสระ ยอมรับ json ที่แสดงถึงคู่คีย์-ค่าสำหรับแท็ก ฉันต้องสร้าง json นี้แบบไดนามิกใน Playbook ดังนั้นก่อนที่จะเรียกใช้งานนั้น ฉันมีสิ่งนี้สำหรับการทดสอบ:

  - ชื่อ: สร้างวัตถุ json เพื่อใช้เป็นแท็ก
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

แต่ฉันต้องทำอะไรผิดเพราะฉันได้รับข้อผิดพลาดนี้:
ร้ายแรง: [localhost]: ล้มเหลว! => {"msg": "งานมีตัวเลือกที่มีตัวแปรที่ไม่ได้กำหนด ข้อผิดพลาดคือ: 'tag_var' ไม่ได้กำหนด

มีวิธีที่ง่ายกว่าในการสร้าง json โดยตรงใน playbook และส่งเป็นอาร์กิวเมนต์ไปยังพารามิเตอร์นั้นหรือไม่?

ขอขอบคุณ.

anx avatar
fr flag
anx
คีย์ YAML ควรไม่ซ้ำกัน ดังนั้นตัวอย่างของคุณจึงไม่ถูกต้อง คุณอาจหมายถึงการตั้งค่าตัวแปรในงานอื่น?
anx avatar
fr flag
anx
คุณอาจตีความข้อผิดพลาดผิดเนื่องจากสิ่งที่ส่งคืนจากคำสั่งของคุณหรือไม่ นี่คือ *ตัวแก้ไข* ที่พูดถึง ไม่ใช่คำพูดของข้อความที่ส่งกลับจากบางโปรแกรมที่เรียก!
Ress avatar
lc flag
ฉันยังใหม่กับ ansible ขอโทษด้วย ฉันแค่พยายามส่ง json เป็นข้อโต้แย้งไปยังพารามิเตอร์ตามที่เห็นด้านบน แต่ฉันต้องสร้าง json ดังกล่าวใน playbook เดียวกัน
Score:1
ธง th

มีสองสิ่งที่เกิดขึ้นที่นี่ อย่างแรกคือคุณได้สร้าง YAML ที่โปรแกรมแยกวิเคราะห์ยอมรับ แต่ทำงานในลักษณะที่ไม่คาดคิดเล็กน้อย (และจะสร้างคำเตือนใน Ansible เวอร์ชันปัจจุบัน)

  - ชื่อ: สร้างวัตถุ json เพื่อใช้เป็นแท็ก
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

คีย์ใน YAML นั้นไม่ซ้ำกัน เมื่อ parser พบอินสแตนซ์ที่สองของคีย์เดียวกัน มันจะโยนอันแรกออกไป เนื่องจากคุณได้ทำซ้ำ set_factซึ่งเทียบเท่ากับ:

  - ชื่อ: สร้างวัตถุ json เพื่อใช้เป็นแท็ก
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

อย่างไรก็ตาม การแก้ไขข้อผิดพลาดทางไวยากรณ์จะยังคงส่งผลให้เกิดความล้มเหลว

  - ชื่อ: สร้างวัตถุ json เพื่อใช้เป็นแท็ก
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
      tag_var_json: "{{ tag_var | to_json }}"

ข้อโต้แย้งที่จะ set_fact ต้องมี templated ก่อนจึงจะเรียกใช้งาน โดยที่ tag_var ยังไม่ได้กำหนด (เนื่องจากงานนี้กำลังกำหนดอยู่)

วิธีหนึ่งที่ถูกต้องในการเขียนงานนี้คือแยกงานสองงาน:

  - ชื่อ: สร้างวัตถุแท็ก
    set_fact:
      tag_var:
        ทดสอบ: thisistest

  - ชื่อ: สร้างสตริง JSON สำหรับการแท็ก
    set_fact: 
      tag_var_json: "{{ tag_var | to_json }}"

อย่างไรก็ตาม, set_fact ไม่จำเป็นเลย คุณสามารถตั้งค่า var ได้โดยตรงบนงานที่คุณใช้ ซึ่งทั้งมีประสิทธิภาพมากกว่าและทำให้มีขอบเขตที่แน่นแฟ้นยิ่งขึ้น

- ชื่อ: อัปเดตแท็กอินสแตนซ์
    คำสั่ง: oci คำนวณอินสแตนซ์อัปเดต -c {{ ช่อง }} --freeform-แท็ก "{{ tag_var | to_json }}"
  วาร์:
    tag_var:
      ทดสอบ: thisistest

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา