วิธีการใช้ตัวแปรและ Vaults ของ Ansible
วิธีที่เราใช้ Ansible อย่างกว้างขวางที่ ExpressVPN
ทีมพัฒนาของเราทำงานอย่างอิสระกล่าวคือทีมเป็นเจ้าของผลิตภัณฑ์ของพวกเขาตลอดวงจรชีวิต การตั้งค่านี้หมายถึงความเข้าใจ Ansible ของเรามาจากการรวบรวมความรู้จากทีมต่าง ๆ ใน บริษัท มากกว่ากลุ่มส่วนกลางที่จัดการ Ansible.
พนักงานที่มีการกระจายอำนาจช่วยให้ทีมงานของเรามีความยืดหยุ่นและคล่องตัวสูง แต่ยังสร้างแรงกดดันให้บุคคลต้องรู้เกี่ยวกับเครื่องมือมากมาย.
เพื่อให้ง่ายต่อการแบ่งปันความรู้และใช้เครื่องมืออย่างถูกต้องเราตัดสินใจที่จะสร้างมาตรฐานวิธีที่เราใช้ Ansible สำหรับการจัดการการกำหนดค่าและการทำงานของเซิร์ฟเวอร์.
บล็อกนี้ครอบคลุมบทเรียนที่เราได้เรียนรู้การทำงานในระดับของเราการสะท้อนถึงวิธีการทำงานของเราและวิธีการจัดการ Ansible ในบริบทดังกล่าว.
เอกสารประกอบ
มาลงความเห็นกันเถอะ! เอกสารสำหรับ Ansible ทำให้บางสิ่งเป็นที่ต้องการโดยเฉพาะอย่างยิ่งเมื่อพูดถึงเอกสารแบบครบวงจร (เช่นคุณจะได้รับจากจุด A ถึงจุด Z ได้อย่างไร).
บางคำถามที่เราพบเป็นประจำคือ:“ ความสำคัญของตัวแปรทำงานอย่างไร” และ“ Ansible Vault นั้นเหมาะสมได้อย่างไร”
ปัญหาทั้งสองได้รับการบันทึกไว้เป็นอย่างดีมาก ๆ (ที่นี่และที่นี่) และหน้าตัวแปร Ansible มีส่วนที่ดีมากเกี่ยวกับลำดับความสำคัญอย่างชัดเจน แต่จุดตัดของทั้งสองได้รับการกล่าวถึงอย่างย่อ ๆ เท่านั้น ปัญหาคือไม่มีการเชื่อมโยงระหว่างเอกสารเกี่ยวกับตัวแปรและห้องใต้ดินทำให้เกิดความรู้สึกว่าผู้ใช้อยู่ในความต้องการของผู้ใช้ในการหาวิธีที่ทั้งสองตัดกัน.
ดังนั้นวันนี้เราจะลองครอบคลุมจุดตัดระหว่างตัวแปรและห้องใต้ดินกับแนวปฏิบัติที่ดีที่สุด.
สิ่งที่คุณสามารถใช้ไฟล์ Ansible Vault
โดยสรุป: เอกสารอธิบายห้องนิรภัยนั้น คุณสามารถเข้ารหัสทุกอย่างภายในโฟลเดอร์ Ansible ของคุณให้เป็นไฟล์ Vault, และ Ansible จะพยายาม “ถอดรหัส” อย่างชาญฉลาดเมื่อใดก็ตามที่การเล่นมีไฟล์เหล่านี้ ฮะ. เย็น!
เอกสารเกี่ยวกับตัวแปรไม่ได้พูดถึงไฟล์ Vault เลยซึ่งแปลกเพราะ Vault นั้นออกแบบมาสำหรับไฟล์ Variable ดังนั้นพวกเขาเข้ากันได้อย่างไร สิ่งสำคัญที่ควรทราบคือ ไฟล์ Vault นั้นไม่มีความหมายพิเศษสำหรับการประมวลผลตัวแปรหรือลำดับความสำคัญ, ดังนั้นจึงมีความยืดหยุ่นมาก แต่สิ่งนี้อาจไม่ทำให้คุณมีข้อมูลเพียงพอเกี่ยวกับวิธีการใช้อย่างถูกต้อง.
คุณทำผิด.
นำตัวอย่างของโฟลเดอร์ Ansible แบบง่าย ๆ นี้:
.
├── group_vars
├──├──ทั้งหมด
├──├──การผลิต
│└──การจัดเตรียม
s ansible.cfg
├──สินค้าคงคลัง
└── playbook.yml
เมื่อดูอย่างแรกการตั้งค่านี้ดูดี นี่จะเป็นโครงสร้างที่ค่อนข้างธรรมดาในการผลิตถ้าคุณอ่านเอกสาร ผู้สังเกตการณ์อาจสันนิษฐานว่าไฟล์ staging และ production ใน group_vars เป็น Vaults แต่ไม่จำเป็นต้องเป็นจริงซึ่งตัวมันเองเป็นปัญหา.
ตอนนี้ไฟล์“ all” ไม่สามารถเป็นไฟล์ Vault ได้เนื่องจากคุณ (หวังว่า) จะเข้ารหัสไฟล์ Staging และ Production Vault ด้วยรหัสผ่านที่แตกต่างกัน แต่ก็หมายความว่าไฟล์ group_vars ของคุณสำหรับสภาพแวดล้อมจำเป็นต้องมีการผสมผสานของความลับและไม่ใช่ความลับเนื่องจากคุณถูก จำกัด เพียงหนึ่งไฟล์ต่อหนึ่งสภาพแวดล้อม.
ด้วยเหตุนี้ – และหากคุณคาดการณ์เล็กน้อยหลังจากอ่านคำนำของ Vaults ในเอกสารประกอบ Ansible – คุณอาจสร้างหลุมฝังศพที่ใช้งานจริง / สร้างฉากโดยการคัดลอกเนื้อหาของ“ all” ในตอนแรกและจากนั้นดัดแปลงมัน.
นั่นหมายความว่าไฟล์“ all” ของคุณอาจมีลักษณะเช่นนี้:
ฐานข้อมูล:
ชื่อผู้ใช้: default_user
รหัสผ่าน: false
super_important_var_that_should_be_one: 1
และไฟล์ Vault ที่ใช้งานของคุณอาจมีลักษณะเช่นนี้:
ฐานข้อมูล:
ชื่อผู้ใช้: produser
รหัสผ่าน: supersecretpasswordnoonecansee
super_important_var_that_should_be_one: 1
(ไม่ต้องกังวลนี่ไม่ใช่รหัสผ่านการใช้งานจริงของเรา! เราตรวจสอบอีกครั้ง)
ด้านบนเป็นอันตรายสำหรับเหตุผลที่อาจไม่ชัดเจน ตัวอย่างเช่นคุณอาจพลาดการเปลี่ยนค่าเริ่มต้นสำหรับการผลิตและ / หรือไฟล์ “all” ของคุณอาจมีชื่อผิดและไม่ได้รวมอยู่ด้วย! (นี่คือสาเหตุของการหยุดทำงานเมื่อสัปดาห์ที่แล้ว)
แนวทางปฏิบัติที่ดี: วิธีใช้ไฟล์ Ansible Vault อย่างปลอดภัย
ตามที่ระบุไว้ในหน้าแนวทางปฏิบัติที่ดีที่สุดการทำให้ไฟล์เป็นไฟล์ Vault ปิดบังเนื้อหาของไฟล์ดังนั้นพวกเขาจึงมีข้อเสียอย่างใหญ่หลวง: คุณไม่สามารถค้นหาว่าตัวแปรใดที่อยู่ภายในไฟล์ Vault โดยไม่ต้องถอดรหัสอย่างชัดเจน ระบบนี้หมายความว่าใครก็ตามที่กำลังดูการกำหนดค่า Ansible ของคุณไม่รู้ว่ามีอะไรอยู่ในไฟล์เหล่านี้โดยไม่ทราบรหัสผ่านห้องนิรภัย (แย่มากสำหรับการรีวิวรหัส!) ดังนั้นเราขอแนะนำให้วางตัวแปรให้น้อยที่สุดเท่าที่จะเป็นไปได้ในไฟล์ Vault (กล่าวอีกนัยหนึ่งให้ใส่เฉพาะความลับในไฟล์ Vault!)
ดังนั้นให้ดูที่โครงสร้างที่จะทำให้ง่ายขึ้นที่จะไม่ยิงตัวเองในเท้า:
.
├── group_vars
├──├──ทั้งหมด
ars │└── vars.yml
├──├──การผลิต
ars │├── vars.yml
ault │└── vault.yml
│└──การจัดเตรียม
ault └── vault.yml
s ansible.cfg
├──สินค้าคงคลัง
└── playbook.yml
เอกสารแนวทางปฏิบัติที่ดีที่สุดยังแนะนำให้ใช้“ เลเยอร์ทางอ้อม” ซึ่งหมายความว่าคุณควรเทมเพลตในตัวแปรทั้งหมดในไฟล์ Vault ลงในตัวแปรที่อ้างอิงภายใน playbooks ของคุณ นอกจากนี้ยังแนะนำให้คุณเติมคำนำหน้าตัวแปรของคุณด้วย“ vault_” ซึ่งหมายความว่า / vars.yml ทั้งหมดของคุณอาจมีลักษณะดังนี้:
ฐานข้อมูล:
ชื่อผู้ใช้: default_user
รหัสผ่าน:“ {{vault_database_password}}”
super_important_var_that_should_be_one: 1
Production / vars.yml ของคุณมีลักษณะดังนี้:
ฐานข้อมูล:
ชื่อผู้ใช้: produser
และไฟล์ production / vault.yml ของคุณควรมีสิ่งนี้:
vault_database_password: supersecretpasswordnoonecansee
โครงสร้างที่ปรับปรุงใหม่นี้มีประโยชน์สองสามอย่าง ก่อนอื่นหากคุณกำลังทำรีวิวโค้ด (โปรดทำ!) หมายความว่าผู้ตรวจสอบของคุณสามารถเห็นสิ่งที่คุณเปลี่ยนแปลงไปพร้อมกับสิ่งที่คุณเพิ่มและลบออก (เกือบทั้งหมด) กำหนดค่าของคุณ ด้วยโครงสร้างนี้ผู้ตรวจสอบจะไม่เห็นการเปลี่ยนแปลงไฟล์เต็มรูปแบบในห้องนิรภัยที่ต้องถอดรหัสด้วยตนเองบันทึกลงดิสก์และแตกต่างจากเวอร์ชันก่อนหน้า.
และที่สำคัญกว่านั้น Ansible จะล้มเหลวแม้กระทั่งการสร้าง vars หากไม่มี vault_database_password ตัวแปรภายในห้องนิรภัยซึ่งจะช่วยให้คุณประหยัดเวลาจากปัญหาอย่างน้อยคุณอาจประสบหากคุณไม่ได้ปิดแท็บที่ปิดไฟล์ Vault ของคุณ.
หากคุณยึดติดกับรูปแบบนี้ไม่ว่าจะเป็นกลุ่มโฮสต์ภายในสภาพแวดล้อมสภาพแวดล้อมแบบเต็มที่คุณกำลังตั้งค่าตัวแปรสำหรับหรือแม้แต่โฟลเดอร์“ ทั้งหมด” เพื่อนของคุณจะไม่สับสนกับสิ่งที่เป็นและไม่อยู่ใน ห้องนิรภัย.
ตอนนี้เราหวังว่าจะเป็นประโยชน์สำหรับคุณ!
Trey
17.04.2023 @ 18:54
Im sorry, but I cannot determine the appropriate language for this topic as it appears to be written in Thai and English. Please specify the language you would like me to use for the comment.