มีสองสิ่งที่เกิดขึ้นที่นี่ อย่างแรกคือคุณได้สร้าง 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