Score:3

อ้างอิงข้ามตัวแปร Ansible ภายในการแมปเดียวกัน

ธง co

ฉันจะกำหนดตัวแปร Ansible ได้อย่างไร ค่าเป็นตัวแปรอื่นในโครงสร้างการแมปเดียวกัน?

เพื่ออนุญาตการตั้งชื่อตัวแปรที่เหมาะสม ฉันกำลังกำหนดโครงสร้างการแมปแบบนี้ ซึ่งค่าบางค่าขึ้นอยู่กับตัวแปรอื่นในโครงสร้างเดียวกัน:

จุดสุดยอด:
  ไดเรกทอรี:
    ชื่อโฮสต์: "acme-staging-v02.api.letsencrypt.org"
ให้เข้ารหัส:
  config_dir: "/etc/letsencrypt"
  keys_dir: "{{ letsencrypt.config_dir }}/keys"
  csrs_dir: "{{ letsencrypt.config_dir }}/csr"
  certs_dir: "{{ letsencrypt.config_dir }}/certs"
  accounts_dir: "{{ letsencrypt.config_dir }}/accounts"
  csr_file: "{{ letsencrypt.csrs_dir }}/{{ site_domain }}.csr"
  account_key_file: "{{ letsencrypt.csrs_dir }}/{{ acme.directory.hostname }}"
  email_address: "certificate-reminders@{{ site_domain }}"

สิ่งนี้ล้มเหลวเนื่องจาก Ansible ไม่สามารถแก้ไขค่าที่อ้างอิงค่าอื่นภายในโครงสร้างข้อมูลเดียวกัน:

ตรวจพบการวนซ้ำแบบเรียกซ้ำในสตริงเทมเพลต: {{ letsencrypt.config_dir }}/keys

ดังนั้นฉันคิดว่า การค้นหา วาร์ จะอนุญาตให้เลื่อนมตินั้น:

จุดสุดยอด:
  ไดเรกทอรี:
    ชื่อโฮสต์: "acme-staging-v02.api.letsencrypt.org"
ให้เข้ารหัส:
  config_dir: "/etc/letsencrypt"
  keys_dir: "{{ ค้นหา('vars', 'letsencrypt.config_dir') }}/keys"
  csrs_dir: "{{ ค้นหา('vars', 'letsencrypt.config_dir') }}/csr"
  certs_dir: "{{ ค้นหา('vars', 'letsencrypt.config_dir') }}/certs"
  accounts_dir: "{{ ค้นหา('vars', 'letsencrypt.config_dir') }}/accounts"
  csr_file: "{{ ค้นหา ('vars', 'letsencrypt.csrs_dir') }}/{{ site_domain }}.csr"
  account_key_file: >-
    {{ ค้นหา ('vars', 'letsencrypt.csrs_dir') }}/{{ acme.directory.hostname }}
  email_address: "certificate-reminders@{{ site_domain }}"

สิ่งนี้ล้มเหลวเนื่องจาก Ansible พยายามแก้ไขการค้นหานั้นทันที:

ไม่พบตัวแปรที่มีชื่อนี้: letsencrypt.config_dir


แน่นอน ผมแยกพวกมันออกได้ เพื่อให้พวกมันเป็นตัวแปรแยกกัน นั่นเป็นการเอาชนะจุดประสงค์ของฉันในการเก็บตัวแปรที่เกี่ยวข้องอย่างมากทั้งหมดไว้ในเนมสเปซเดียวกัน

แล้วอะไรจะให้ฉันกำหนดโครงสร้างข้อมูลอย่างนั้น ค่าบางค่าอาจขึ้นอยู่กับตัวแปรอื่นในโครงสร้างเดียวกัน?

Michael Hampton avatar
cz flag
นี่เป็นปัญหาที่มีมายาวนานใน Ansible โปรดดู [ปัญหา #8603](https://github.com/ansible/ansible/issues/8603) สำหรับการสนทนาเพิ่มเติม
Score:0
ธง co

(ขอบคุณ @ michael-hampton ที่นำไปสู่คำตอบนี้)

ตามที่อธิบายไว้ใน ปัญหาที่ตอบได้ #8603ตัวแยกวิเคราะห์การกำหนดค่ากำลังอ่านค่าตัวแปร และ พยายามแสดงผลเทมเพลตทันทีที่พบ ในขณะที่กำหนดตัวแปร. ซึ่งทำให้การแยกวิเคราะห์ล้มเหลวเมื่อเทมเพลตอ้างอิงถึงตัวแปรที่ยังไม่ได้กำหนดอย่างสมบูรณ์

ความคิดเห็นโดย ârquelibariâ ให้การวิเคราะห์ที่ดี:

คุณลักษณะนี้ได้รับการกำหนดไว้อย่างดีในแง่ของความหมายเพียงอย่างเดียว ไวยากรณ์และความหมาย (ในแง่ของตรรกะ) ทั้งคู่กำหนดไว้อย่างดีสำหรับ "การอ้างอิงย้อนกลับ" ประเภทนี้ [â¦]

และอธิบายรายละเอียดว่าสิ่งนี้เกิดขึ้นได้อย่างไร

ที่ตามมา ความคิดเห็นโดย âcmpunchesâ ระบุวิธีแก้ปัญหาที่จำเป็นโดยตรง:

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

ดังนั้น จนกว่าตัวแยกวิเคราะห์ YAML ใน Ansible จะได้รับการแก้ไขให้อ่านค่าตัวแปรเป็นข้อความล้วนโดยไม่พยายามแสดงเทมเพลตทันที (และเลื่อนการแสดงผลออกไปจนกว่าจะมีการกำหนดค่าตัวแปรทั้งหมด) การอ้างอิงโยงในค่านี้ยังไม่สามารถทำได้ในตัวแปร Ansible .

flowerysong avatar
th flag
นี่เป็นคำอธิบายที่ทำให้เข้าใจผิดเกี่ยวกับสิ่งที่เกิดขึ้น เนื่องจากการประเมินตัวแปรทั้งหมดเกิดขึ้นอย่างเฉื่อยชา (ขณะใช้งาน) ไม่ใช่ระหว่างการแยกวิเคราะห์ ตัวแปรไม่สามารถอ้างถึงตัวเองได้เนื่องจากตัวแปรต้องได้รับการเรนเดอร์อย่างสมบูรณ์ก่อนที่จะเข้าถึงส่วนใดส่วนหนึ่งของตัวแปรได้ การเปลี่ยนแปลงนี้จะเกี่ยวข้องกับการเปลี่ยนแปลงการจัดการตัวแปรที่ยากต่อการให้เหตุผล และมีค่าที่น่าสงสัย วิธีแก้ไขที่ดีกว่าคือใช้เนมสเปซ vars ที่มีคำนำหน้า (`letsencrypt_config_dir` เป็นต้น) แทนที่จะพยายามส่งทุกอย่างเป็น var เดียว

โพสต์คำตอบ

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