ฉันมีเทมเพลต jinja2 นี้:
# {{ ansible_managed }}
{% สำหรับ vhost ใน nginx_vhosts %}
{%- ถ้า vhost.name == item.name -%}
# เปลี่ยนเส้นทาง www เป็น non-www
เซิร์ฟเวอร์ {
ฟัง {{ nginx_port }};
ฟัง [::]:{{ nginx_port }};
ปิด port_in_redirect;
server_name www.{{ vhost.name }};
ส่งคืน 301 http://{{ vhost.name }}$request_uri;
}
{%- เอนดิฟ -%}
{%- สิ้นสุดสำหรับ -%}
บทบาทที่สามารถแก้ไขได้ด้วยไฟล์ yaml vhosts.yml มีคำจำกัดความดังนี้:
nginx_vhosts:
- ชื่อ: "test1.com"
ที่เก็บ: "git1"
สาขา: ปริญญาโท
สถานะ: ปัจจุบัน
- ชื่อ: "test2.com"
ที่เก็บ: "git2"
สาขา: ปริญญาโท
สถานะ: ปัจจุบัน
...
- ชื่อ: "test101.com"
ที่เก็บ: "git101"
สาขา: ปริญญาโท
สถานะ: ปัจจุบัน
งานภายใน playbook.yml:
- ชื่อ: "สร้างไฟล์กำหนดค่า nginx vhost"
แม่แบบ:
src: templates/nginx-vhost-template.j2
ปลายทาง: "{{ nginx_vhosts_dir }}/{{ item.name }}.conf"
เจ้าของ: "{{ nginx_user }}"
กลุ่ม: "{{ nginx_group }}"
โหมด: 0640
with_items:
- "{{ nginx_vhosts }}"
เมื่อไร:
- item.state == 'ปัจจุบัน'
แจ้ง:
- nginx-รีสตาร์ท
ฉันวิ่งตากเช่น:
ansible-playbook -l web1 playbook.yml --tags=nginx-vhost-config
ซึ่งทำงานได้ดี มันจะสร้างจากเทมเพลตไฟล์การกำหนดค่า nginx vhost บนเซิร์ฟเวอร์ระยะไกลเป็น domain1.com.conf และอื่น ๆ สำหรับคำจำกัดความที่พบทั้งหมด
สมมติว่าในไฟล์ vhosts.yml ฉันมี test1.com ถึง test100.com ฉันจะเพิ่มสมมติว่า test101.com และฉันต้องการรันงานอย่างเคร่งครัดสำหรับ test101.com นั้น ไม่ใช่สำหรับโฮสต์ก่อนหน้าทั้งหมด ดังนั้นฉันจึงลองสิ่งนี้:
ansible-playbook -l web1 playbook.yml --tags=nginx-vhost-config -e "{ 'nginx_vhosts': { 'ชื่อ': 'test101.com', 'สถานะ': 'ปัจจุบัน', 'repo': ' git101', 'สาขา': 'ต้นแบบ' }}"
ปัญหานี้คือส่งผลให้เกิดข้อผิดพลาดเมื่อพยายามแทนที่ค่าจากเทมเพลต jinja2
เกิดข้อยกเว้นระหว่างการปฏิบัติงาน หากต้องการดูการย้อนกลับทั้งหมด ให้ใช้ -vvv ข้อผิดพลาดคือ: ansible.errors.AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode object' ไม่มีแอตทริบิวต์ 'ชื่อ'
ฉันยังได้ลองใช้ ห่วง แทน with_items แต่ไม่มีโชค
ฉันเข้าใจว่าเมื่อใช้ vars พิเศษ เนื้อหาที่ให้มาจะอยู่ในรูปแบบ JSON แต่ฉันไม่สามารถหาวิธีอื่นในการส่งเนื้อหาจาก vhosts.yml เป็น vars พิเศษสำหรับรายการเดียว มีวิธีใดบ้างที่จะทำให้มันใช้งานได้?
มีแนวทางที่ดีกว่านี้หรือไม่?