ความแตกต่างระหว่างค่าเริ่มต้นและ vars ในบทบาท Ansible คืออะไร


151

เมื่อสร้างบทบาท Ansible ใหม่เทมเพลตจะสร้างทั้ง a varsและdefaultsไดเรกทอรีที่มีmain.ymlไฟล์เปล่า เมื่อกำหนดบทบาทของฉันฉันสามารถวางคำจำกัดความของตัวแปรในสิ่งเหล่านี้และพวกเขาจะสามารถใช้ได้ในงานของฉัน

ความแตกต่างระหว่างการวางคำจำกัดความลงไปdefaultsและvars? สิ่งที่ควรไปเป็นdefaultsและสิ่งที่ควรจะเข้ามาvars? มันสมเหตุสมผลไหมที่จะใช้ทั้งกับข้อมูลเดียวกัน?

ฉันรู้ว่ามีความแตกต่างในลำดับความสำคัญ / ลำดับความสำคัญระหว่างทั้งสอง แต่ฉันต้องการที่จะเข้าใจสิ่งที่ควรไปที่ไหน

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

นี่คือสิ่งที่ดูเหมือนว่า:

---
- directories:
  - foo
  - bar
  - baz

ฉันสามารถวางสิ่งนี้ลงในdefaults/main.ymlหรือในvars/main.ymlจากมุมมองของการดำเนินการมันจะไม่สร้างความแตกต่างใด ๆ - แต่มันควรจะไปที่ไหน?

คำตอบ:


113

เอกสารAnsible เกี่ยวกับตัวแปรนำหน้าสรุปนิโคลนี่:

หากมีการกำหนดตัวแปรหลายตัวที่มีชื่อเดียวกันในสถานที่ต่างกันพวกเขาจะชนะในลำดับที่แน่นอนซึ่งก็คือ:

  • vars พิเศษ (-e ในบรรทัดคำสั่ง) ชนะเสมอ
  • จากนั้นตัวแปรการเชื่อมต่อที่กำหนดในสินค้าคงคลังจะมา (ansible_ssh_user ฯลฯ )
  • จากนั้นมา "ส่วนใหญ่ทุกอย่างอื่น" (สวิตช์บรรทัดคำสั่ง, vars ในการเล่น, รวม vars, vars บทบาท ฯลฯ )
  • จากนั้นส่วนที่เหลือของตัวแปรที่กำหนดไว้ในสินค้าคงคลังมา
  • ข้อเท็จจริงมาแล้วค้นพบเกี่ยวกับระบบ
  • จากนั้น "ค่าเริ่มต้นของบทบาท" ซึ่งเป็น "ค่าเริ่มต้น" ที่สำคัญที่สุดและสูญเสียความสำคัญในทุกสิ่ง

สมมติว่าคุณมีบทบาท "tomcat" ที่คุณใช้ในการติดตั้ง Tomcat บนเครือข่ายโฮสต์ แต่คุณต้องใช้ Tomcat รุ่นต่าง ๆ ในโฮสต์คู่จำเป็นต้องใช้เพื่อทำงานเป็นผู้ใช้ที่แตกต่างกันในกรณีอื่น ๆ เป็นต้นdefaults/main.ymlไฟล์อาจดู บางสิ่งเช่นนี้

tomcat_version: 7.0.56
tomcat_user: tomcat

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

แก้ไข: โปรดทราบว่ารายการด้านบนนี้ใช้สำหรับ Ansible 1.x ใน Ansible 2.x รายการได้รับการขยาย เช่นเคยเอกสารเบิ้ลให้คำอธิบายรายละเอียดของความเป็นผู้นำตัวแปรสำหรับ 2.x.


4
ขอบคุณนั่นคือหน้าเว็บที่ยอดเยี่ยม - นั่นคือสิ่งที่ฉันกำลังมองหา ฉันเข้าไปดูรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่จะใส่defaultsและอะไรvarsเพิ่มเติม
nwinkler

42
มันคุ้มค่าเน้น: บทบาท vars มีลำดับความสำคัญสูงชั่วร้าย จากประสบการณ์ของฉันพวกเขาสูงกว่า play vars ซึ่งน่ารำคาญจริงๆ
tedder42

5 ปีต่อมา แต่ ... ฉันมักจะมองด้วยวิธีนี้: การตั้งค่าบทบาทเป็นสิ่งที่ฉันคาดว่าผู้ใช้ของบทบาทจะแทนที่ใน vars ของพวกเขาที่ไหนสักแห่ง Vars บทบาท OTOH อนุญาตให้ฉันหลีกเลี่ยงการเข้ารหัสข้อมูลยาก ๆ ในงาน แต่มีแนวโน้มว่าจะถูกแทนที่เท่านั้นสำหรับการทดสอบและเปลี่ยนแปลงโดยผู้ดูแลบทบาท ตัวอย่างเช่นชื่อผู้ใช้เริ่มต้นของผู้ดูแลระบบจะเป็นค่าเริ่มต้น แต่เวอร์ชันการพึ่งพาจะอยู่ใน vars
ntwrkguru

41

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

ในบทความ " Variable Precedence - ตำแหน่งที่จะวางบทบาทของคุณ Vars " ผู้เขียนให้ตัวอย่างหนึ่งของสิ่งที่จะใส่vars: ค่าคงที่ระบบเฉพาะที่ไม่เปลี่ยนแปลงมากนัก ดังนั้นคุณสามารถมีvars/debian.ymlและvars/centos.ymlมีชื่อตัวแปรเหมือนกัน แต่มีค่าต่างกันและรวมไว้ด้วยตามเงื่อนไข


4

IMHO จะทำไม่ได้และไม่สมเหตุสมผลว่าสถานที่มีความสำคัญสูงเบิ้ลดังกล่าวในการกำหนดค่าในvarsของบทบาท การกำหนดค่าในvars/main.ymlและdefaults/main.ymlควรจะต่ำและอาจมีลำดับความสำคัญเดียวกัน

มีตัวอย่างชีวิตจริงของกรณีที่เราต้องการพฤติกรรมประเภทนี้หรือไม่?

มีตัวอย่างที่เราไม่ต้องการ

จุดที่ทำให้ที่นี่คือการกำหนดค่าที่defaults/main.ymlไม่สามารถเป็นแบบไดนามิก การกำหนดค่าในvars/main.ymlกระป๋อง ตัวอย่างเช่นคุณสามารถรวมการกำหนดค่าสำหรับระบบปฏิบัติการเฉพาะและรุ่นแบบไดนามิกดังที่แสดงในgeerlingguy.postgresql

แต่เนื่องจากความสำคัญกว่านั้นแปลกและทำไม่ได้ใน geerlingguy Ansible จึงจำเป็นต้องแนะนำตัวแปรเทียมที่สามารถเห็นได้ในตัวแปร

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

นี่เป็นตัวอย่างชีวิตจริงที่เป็นรูปธรรมซึ่งแสดงให้เห็นว่าสิ่งที่สำคัญกว่านั้นไม่สามารถทำได้

อีกจุดหนึ่งที่ทำให้ที่นี่คือเราต้องการให้บทบาทสามารถกำหนดค่าได้ บทบาทสามารถเป็นภายนอกจัดการโดยบุคคลอื่น ตามกฎทั่วไปคุณไม่ต้องการให้การกำหนดค่าในบทบาทมีลำดับความสำคัญสูง


นี่ควรเป็นความเห็นไม่ใช่คำตอบ
ntwrkguru

3

โดยพื้นฐานแล้วสิ่งใดก็ตามที่เข้าสู่“ การกำหนดค่าเริ่มต้นของบทบาท” (โฟลเดอร์ค่าเริ่มต้นภายในบทบาท) นั้นเป็นสิ่งที่ถูกกล่าวโทษได้ง่ายที่สุดและแทนที่ได้อย่างง่ายดาย สิ่งใดในไดเร็กทอรี vars ของบทบาทจะแทนที่เวอร์ชันก่อนหน้าของตัวแปรนั้นในเนมสเปซ แนวคิดที่นี่เพื่อติดตามคือยิ่งคุณได้รับขอบเขตมากเท่าไหร่ก็ยิ่งมีความสำคัญมากกว่าด้วยบรรทัดคำสั่ง -e vars พิเศษที่ชนะเสมอ โฮสต์และ / หรือตัวแปรคลังโฆษณาสามารถเอาชนะค่าเริ่มต้นของบทบาทได้ แต่ไม่รวมอย่างชัดเจนเช่นไดเรกทอรี vars หรืองาน include_vars คุณหมอ


-4

ตัวแปรและค่าเริ่มต้นเดินจับมือกัน นี่คือตัวอย่าง

-name: install package
 yum: name=xyz{{package_version}} state=present

ในไฟล์เริ่มต้นของคุณคุณจะมีสิ่งที่ชอบ:

package_version: 123

สิ่งที่จะทำได้คือมันจะเอาคุณค่าของpackage_versionมันไปวางไว้ข้างชื่อแพ็คเกจดังนั้นมันจะอ่านที่ไหนสักแห่งตาม:

-name: install package
 yum: name=xyz123 state=present

วิธีนี้มันจะติดตั้งxyz123และไม่xyz123.4หรือสิ่งที่อยู่ในพื้นที่เก็บข้อมูลที่ดีของ xyz

ในตอนท้ายมันจะทำ yum install -y xyz123

ดังนั้นโดยทั่วไปแล้วค่าเริ่มต้นคือค่าที่มีอยู่หากคุณไม่ได้ตั้งค่าเฉพาะสำหรับตัวแปรทำให้พื้นที่นั้นไม่สามารถว่างเปล่าได้


ลงคะแนนเนื่องจากไม่ได้ตอบคำถาม เห็นได้ชัดว่าdefaultsมีการใช้เมื่อไม่มีการvarsกำหนด แต่คำตอบไม่ได้อธิบายว่าทำไมคุณถึงกำหนดค่าเป็นหนึ่งหรืออื่น ๆ ซึ่งเป็นสิ่งที่ OP ถาม เปรียบเทียบกับคำอธิบายด้านล่าง
โทมัสอีร์สช
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.