Score:0

เทมเพลต jinja2 แบบ Ansible จากรูปแบบ JSON ที่ให้มาเป็นแบบพิเศษ

ธง us

ฉันมีเทมเพลต 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 พิเศษสำหรับรายการเดียว มีวิธีใดบ้างที่จะทำให้มันใช้งานได้?

มีแนวทางที่ดีกว่านี้หรือไม่?

flowerysong avatar
th flag
ข้อสังเกตเล็กน้อย: สิ่งที่คุณส่งผ่านคือ YAML ไม่ใช่ JSON ดูเหมือน JSON มากเพราะเป็น YAML แบบโฟลว์ แต่แยกความแตกต่างได้ง่ายเนื่องจาก JSON ไม่อนุญาตให้ใช้เครื่องหมายอัญประกาศเดี่ยวในลักษณะที่เป็นอยู่
Score:1
ธง th

คุณกำลังผ่านวัตถุ / พจนานุกรม แต่รหัสของคุณคาดว่าจะมีรายการ คุณต้องรวมไว้ในรายการเมื่อคุณส่งเข้ามา หรือบัญชีสำหรับโครงสร้างที่เป็นไปได้ที่แตกต่างกันเมื่อคุณใช้งาน

ก่อนอื่นคุณควรลดจำนวนสถานที่ที่อ้างอิง nginx_vhosts โดยใช้รายการลูปปัจจุบันโดยตรงในแม่แบบของคุณ:

# {{ ansible_managed }}

# เปลี่ยนเส้นทาง www เป็น non-www
เซิร์ฟเวอร์ {
    ฟัง {{ nginx_port }};
    ฟัง [::]:{{ nginx_port }};
    ปิด port_in_redirect;

    server_name www.{{ item.name }};
    ส่งคืน 301 http://{{ item.name }}$request_uri;
}

จากนั้นคุณสามารถแก้ไขโครงสร้างที่คุณส่งผ่านได้เล็กน้อย:

"{ 'nginx_vhosts': [{ 'ชื่อ': 'test101.com', 'สถานะ': 'ปัจจุบัน', 'repo': 'git101', 'สาขา': 'ต้นแบบ' }]}"

หรือแก้ไขลูปของคุณเล็กน้อย:

- ชื่อ: "สร้างไฟล์กำหนดค่า nginx vhost"
  แม่แบบ:
    src: templates/nginx-vhost-template.j2
    ปลายทาง: "{{ nginx_vhosts_dir }}/{{ item.name }}.conf"
    เจ้าของ: "{{ nginx_user }}"
    กลุ่ม: "{{ nginx_group }}"
    โหมด: "0640"
  วนซ้ำ: "{{ [ nginx_vhosts ] | แบน }}"
  เมื่อไร:
    - item.state == 'ปัจจุบัน'
  แจ้ง:
    - nginx-รีสตาร์ท
Bogdan Stoica avatar
us flag
มันสมเหตุสมผลแล้ว มันใช้งานได้อย่างมีเสน่ห์! ขอขอบคุณ!

โพสต์คำตอบ

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