Score:0

ansible main.yml ถ้าเงื่อนไขอื่น

ธง us

ดังนั้นฉันจึงใช้งาน 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 ถูกสร้างขึ้นแบบนี้ และฉันต้องใช้วิธีนี้

Score:1
ธง th

การสร้างเทมเพลตของตัวแปรทำได้ดีหลังจากขั้นตอนการแยกวิเคราะห์ YAML ดังนั้นคุณจึงไม่สามารถใช้เทมเพลตนี้เพื่อสร้างเทมเพลต YAML ด้วยวิธีนี้

วิธีที่ง่ายที่สุดคือการย้ายเงื่อนไขไปยังนิพจน์ Jinja แต่ละรายการ:

api_secrets:
  API_PROFILE: "{{ api_profile }}"
  SERVER_ADDRESS: "{{ ที่อยู่เซิร์ฟเวอร์ }}"
  MGMT_SERVER_ADDRESS: "{{ การจัดการเซิร์ฟเวอร์_ที่อยู่ }}"
  MGMT_SERVER_PORT: "{{ Management_server_port1 ถ้า 'พอร์ต' ใน mgmt_ports อื่น Management_server_port2 }}"
  MGMT_SERVER_USER: "{{ user1 ถ้า 'พอร์ต' ใน mgmt_ports อื่น user2 }}"

คุณยังสามารถใช้คำสั่ง Jinja ได้ แม้ว่าจะทำให้ค่ายาวขึ้นเล็กน้อยสำหรับผลลัพธ์เดียวกัน

api_secrets:
  API_PROFILE: "{{ api_profile }}"
  SERVER_ADDRESS: "{{ ที่อยู่เซิร์ฟเวอร์ }}"
  MGMT_SERVER_ADDRESS: "{{ การจัดการเซิร์ฟเวอร์_ที่อยู่ }}"
  MGMT_SERVER_PORT: "{% if 'port' in mgmt_ports %}{{ management_server_port1 }}{% else %}{{ management_server_port2 }}{% endif %}"
  MGMT_SERVER_USER: "{% ถ้า 'พอร์ต' ใน mgmt_ports %}{{ user1 }}{% อื่น %}{{ user2 }}{% endif %}"
Score:0
ธง lr

Ansible ไม่ได้มีไว้เพื่อรักษาคำสั่ง If-Else-Statement

อย่างที่คุณพูดถึงที่ด้านล่างของคำถาม เทมเพลต jinja2 จะง่ายกว่า แต่จะไม่ง่ายกว่าเท่านั้น แต่ยังทำให้เป็นวิธีที่ถูกต้องด้วย

ดังนั้น แทนที่จะพยายามทำให้ไฟล์ yaml ของคุณยุ่งเหยิงด้วยคำสั่ง if-else ให้สร้างไฟล์ jinja2 ไฟล์เดียวที่มีพารามิเตอร์เทมเพลตที่จำเป็น (ดูเหมือนว่าคุณมีโครงสร้างเทมเพลต jinja2 อยู่ดี!) และสร้างไฟล์การกำหนดค่าโดยใช้ไฟล์นั้น

จากนั้นคุณสามารถทำคำสั่งเทมเพลตเพื่อรวมเทมเพลตในตำแหน่งที่ถูกต้องด้วยพารามิเตอร์ที่ถูกต้อง

"Playbooks ถูกสร้างขึ้นมาแบบนี้และฉันก็ต้องใช้วิธีนี้" ตะโกนว่าใครก็ตามที่คิดนโยบายนั้นไม่ปลอดภัยหรือเป็นแค่เด็ก

โพสต์คำตอบ

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