วิธีการใช้ตัวแปรและ Vaults ของ Ansible

ExpressVPN ใช้ Ansible อย่างไร

วิธีที่เราใช้ Ansible อย่างกว้างขวางที่ ExpressVPN

ทีมพัฒนาของเราทำงานอย่างอิสระกล่าวคือทีมเป็นเจ้าของผลิตภัณฑ์ของพวกเขาตลอดวงจรชีวิต การตั้งค่านี้หมายถึงความเข้าใจ Ansible ของเรามาจากการรวบรวมความรู้จากทีมต่าง ๆ ใน บริษัท มากกว่ากลุ่มส่วนกลางที่จัดการ Ansible.

พนักงานที่มีการกระจายอำนาจช่วยให้ทีมงานของเรามีความยืดหยุ่นและคล่องตัวสูง แต่ยังสร้างแรงกดดันให้บุคคลต้องรู้เกี่ยวกับเครื่องมือมากมาย.

เพื่อให้ง่ายต่อการแบ่งปันความรู้และใช้เครื่องมืออย่างถูกต้องเราตัดสินใจที่จะสร้างมาตรฐานวิธีที่เราใช้ Ansible สำหรับการจัดการการกำหนดค่าและการทำงานของเซิร์ฟเวอร์.

บล็อกนี้ครอบคลุมบทเรียนที่เราได้เรียนรู้การทำงานในระดับของเราการสะท้อนถึงวิธีการทำงานของเราและวิธีการจัดการ Ansible ในบริบทดังกล่าว.

เอกสารประกอบ

มาลงความเห็นกันเถอะ! เอกสารสำหรับ Ansible ทำให้บางสิ่งเป็นที่ต้องการโดยเฉพาะอย่างยิ่งเมื่อพูดถึงเอกสารแบบครบวงจร (เช่นคุณจะได้รับจากจุด A ถึงจุด Z ได้อย่างไร).

บางคำถามที่เราพบเป็นประจำคือ:“ ความสำคัญของตัวแปรทำงานอย่างไร” และ“ Ansible Vault นั้นเหมาะสมได้อย่างไร”

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

ดังนั้นวันนี้เราจะลองครอบคลุมจุดตัดระหว่างตัวแปรและห้องใต้ดินกับแนวปฏิบัติที่ดีที่สุด.

สิ่งที่คุณสามารถใช้ไฟล์ Ansible Vault

โดยสรุป: เอกสารอธิบายห้องนิรภัยนั้น คุณสามารถเข้ารหัสทุกอย่างภายในโฟลเดอร์ Ansible ของคุณให้เป็นไฟล์ Vault, และ Ansible จะพยายาม “ถอดรหัส” อย่างชาญฉลาดเมื่อใดก็ตามที่การเล่นมีไฟล์เหล่านี้ ฮะ. เย็น!

เอกสารเกี่ยวกับตัวแปรไม่ได้พูดถึงไฟล์ Vault เลยซึ่งแปลกเพราะ Vault นั้นออกแบบมาสำหรับไฟล์ Variable ดังนั้นพวกเขาเข้ากันได้อย่างไร สิ่งสำคัญที่ควรทราบคือ ไฟล์ Vault นั้นไม่มีความหมายพิเศษสำหรับการประมวลผลตัวแปรหรือลำดับความสำคัญ, ดังนั้นจึงมีความยืดหยุ่นมาก แต่สิ่งนี้อาจไม่ทำให้คุณมีข้อมูลเพียงพอเกี่ยวกับวิธีการใช้อย่างถูกต้อง.

วิธีที่จะไม่ใช้ Ansibleคุณทำผิด.

นำตัวอย่างของโฟลเดอร์ 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 ของคุณ.

หากคุณยึดติดกับรูปแบบนี้ไม่ว่าจะเป็นกลุ่มโฮสต์ภายในสภาพแวดล้อมสภาพแวดล้อมแบบเต็มที่คุณกำลังตั้งค่าตัวแปรสำหรับหรือแม้แต่โฟลเดอร์“ ทั้งหมด” เพื่อนของคุณจะไม่สับสนกับสิ่งที่เป็นและไม่อยู่ใน ห้องนิรภัย.

ตอนนี้เราหวังว่าจะเป็นประโยชน์สำหรับคุณ!