ดังนั้นฉันจึงใช้งาน ansible ที่มีไฟล์ main.yml ในโฟลเดอร์ defaults/ role เนื้อหาของไฟล์นั้นคือ:
---
api_secrets:
'API_PROFILE': "{{ api_profile }}"
'SERVER_ADDRESS': "{{ ที่อยู่เซิร์ฟเวอร์ }}"
'MGMT_SERVER_ADDRESS': "{{ การจัดการเซิร์ฟเวอร์_ที่อยู่ }}"
ตอนนี้ฉันต้องการรวมบล็อก api_secrets หลังจาก MGMT_SERVER_ADDRESS อะไรทำนองนี้:
{% ถ้า '"พอร์ต" ใน mgmt_ports' %}
'MGMT_SERVER_PORT': "{{ การจัดการเซิร์ฟเวอร์_พอร์ต1 }}"
'MGMT_SERVER_USER': "{{ user1 }}"
{% อื่น %}
'MGMT_SERVER_PORT': "{{ การจัดการเซิร์ฟเวอร์_พอร์ต2 }}"
'MGMT_SERVER_USER': "{{ user2 }}"
{% เอนดิฟ %}
ด้วยทุกสิ่งจากที่นี่ ไฟล์จะถูกสร้างขึ้นบนเซิร์ฟเวอร์โดยมีเนื้อหาด้านบน และแน่นอนว่าแทนที่ตัวแปรด้วยค่าจริง
ไม่ว่าฉันจะพยายามอย่างไร ก็มักจะเกิดข้อผิดพลาดที่แตกต่างกันไป ฉันลองด้วย "{% if ... endif %}" รวมถึง ''
ข้อผิดพลาดจะเป็นดังนี้:
ข้อผิดพลาด! ข้อผิดพลาดทางไวยากรณ์ขณะโหลด YAML
พบอักขระที่ไม่สามารถเริ่มต้นโทเค็นใดๆ
ข้อผิดพลาดดูเหมือนจะอยู่ใน '/opt/ansible/roles/api/defaults/main.yml': บรรทัดที่ 55 คอลัมน์ 2 แต่อาจ
อยู่ที่อื่นในไฟล์ขึ้นอยู่กับปัญหาไวยากรณ์ที่แน่นอน
บรรทัดที่ละเมิดดูเหมือนจะเป็น:
{% ถ้า '"พอร์ต" ใน mgmt_ports' %}
^ ที่นี่
ฉันได้ลองสิ่งนี้แล้ว:
"{% ถ้า (พอร์ตใน mgmt_ports) %}
'MGMT_SERVER_PORT': "{{ การจัดการเซิร์ฟเวอร์_พอร์ต1 }}"
{% อื่น %}
'MGMT_SERVER_PORT': "{{ การจัดการเซิร์ฟเวอร์_พอร์ต2 }}"
{% เอนดิฟ %}"
ในกรณีนี้ ข้อผิดพลาดคือ:
ข้อผิดพลาด! ข้อผิดพลาดทางไวยากรณ์ขณะโหลด YAML
ไม่พบสิ่งที่คาดหวัง ':'
ข้อผิดพลาดดูเหมือนจะอยู่ใน '/opt/ansible/roles/api/defaults/main.yml': บรรทัดที่ 56 คอลัมน์ 24 แต่อาจ
อยู่ที่อื่นในไฟล์ขึ้นอยู่กับปัญหาไวยากรณ์ที่แน่นอน
บรรทัดที่ละเมิดดูเหมือนจะเป็น:
"{% ถ้า (พอร์ตใน mgmt_ports) %}
'MGMT_SERVER_PORT': "{{ การจัดการเซิร์ฟเวอร์_พอร์ต1 }}"
^ ที่นี่
เราอาจผิด แต่สิ่งนี้ดูเหมือนว่าอาจเป็นปัญหากับ
คำพูดที่ขาดหายไป อ้างอิงวงเล็บนิพจน์เทมเพลตทุกครั้ง
เริ่มต้นค่า ตัวอย่างเช่น:
with_items:
- {{ ฟู }}
ควรเขียนเป็น:
with_items:
- "{{ ฟู }}"
วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?
ฉันรู้ว่าการใช้เทมเพลต jinja2 จะง่ายกว่านี้ แต่ playbooks ถูกสร้างขึ้นแบบนี้ และฉันต้องใช้วิธีนี้