วิธีการโครงสร้าง DevOps รหัสที่เกี่ยวข้องและกำหนดค่าในที่เก็บรหัส?


10

เรากำลังเติบโตในฐานะ บริษัท ผลิตภัณฑ์ของเรากำลังขยายตัวและกิจกรรมที่เกี่ยวข้องกับ DevOps และความพยายามของเราก็เพิ่มขึ้นเช่นกัน - เราได้เปลี่ยนจาก Bamboo เป็นเจนกินส์ที่ยืดหยุ่นและสามารถกำหนดค่าได้มากขึ้นโดยใช้ท่อส่งและปลั๊กอินอื่น ๆ เปลี่ยนเป็น Ansible และเริ่มใช้ Docker ที่นี่และที่นั่นภายใน

ทุกสิ่งเหล่านี้ต้องการการเขียนโค้ดหรือการกำหนดค่าในระดับหนึ่ง - สคริปต์และการกำหนดค่า Ansible, สคริปต์ Groovy Jenkins, Dockerfiles และ YAML configs

สำหรับตอนนี้เราได้สร้างแยกต่างหาก "ปฏิบัติการ" พื้นที่เก็บข้อมูลกับไดเรกทอรีระดับสูงสำหรับjenkins, ansible, dockerและother(ซึ่งเป็นชื่อที่น่ากลัว แต่สำหรับตอนนี้ทุกสิ่ง "อื่น ๆ" DevOps อัตโนมัติจะมี)

วิธีการของเราไม่ถูกต้องและอาจไม่ขยายตัว แต่แนวทางปฏิบัติที่ดีที่สุดและคำแนะนำในการเก็บรหัสที่เกี่ยวข้องกับ DevOps ในที่เก็บรหัสหรือที่เก็บคืออะไร


6
ฉันไปกับวิธี "แต่ละส่วนเป็นแอพหนึ่ง repo ต่อแอพ" ในพ่อครัวที่มีความหมายว่า 1 repo ต่อตำรา
Tensibai

@ Tensibai ใช่ฉันกลัวว่า repo "ops" อันเดียวจะกลายเป็นสิ่งที่ไม่สามารถทำได้อย่างรวดเร็ว ขอบคุณ
alecxe

1
นั่นเป็นรูปแบบดั้งเดิมของการจัดการตำราอาหารในพ่อครัว 1 repo กับตำราอาหารทั้งหมดและพิสูจน์แล้วว่าเป็นปืนลูกซองในกรณีส่วนใหญ่ดังนั้นการเปลี่ยนแปลง แต่ฉันไม่ค่อยสบายใจที่จะพูดว่ามันพอดีกับท่อ Jenkins (ถ้า v2) และ ไฟล์นักเทียบท่าควรมีชีวิตอยู่กับโครงการที่พวกเขาจัดการกับ IMO และฉันไม่รู้ว่าคุณใส่อะไรไว้ใต้อื่นดังนั้นฉันจึงไม่สามารถให้คำแนะนำได้ที่นี่จริงๆ
Tensibai

@Tensibai เข้าใจแล้ว! อื่น ๆ ประกอบด้วยยูทิลิตี้ทุบตีและหลามส่วนใหญ่หรือสคริปต์ที่เรียกใช้งานเป็นระยะ ๆ สำหรับเครื่องมือภายในหลายอย่าง .. พวกเขาไม่เข้ากับทุกที่และเราไม่สามารถนึกถึงสถานที่ที่ดีกว่า "อื่น ๆ " ได้ฉันจะดูว่าฉันสามารถโพสต์เนื้อหาได้หรือไม่ ของไดเรกทอรีเป็นคำถามเช่นกัน ขอบคุณ
alecxe

1
ฉันแยกพวกมันออกเป็น repo หลายอันด้วยการทำงาน 'affinity' สคริปต์ที่ทำงานกับแอพ X ด้วยกันคุณอาจมีสคริปต์ที่ใช้กับสองแอพ แต่ถ้าแอพ A เปลี่ยนไปตามวิธีที่สคริปต์มีเพื่อจัดการแอพที่มันพูดถึง มันจะดีกว่าถ้ามีสองรุ่นแยกกันดังนั้น ATEOTD ฉันจะเก็บมันไว้ในแอพพลิเคชั่นที่เกี่ยวข้องหรือถ้ามันขยายแอพพลิเคชั่นหลายรายการในที่เก็บเฉพาะต่องานดังนั้นคุณจึงมีรุ่นที่สอดคล้องกับแอพพลิเคชั่น ไม่จำเป็นต้องติดแท็กสคริปต์ที่ไม่เกี่ยวข้องในเวลาเดียวกัน
Tensibai

คำตอบ:


4

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

เหตุผลสำหรับสิ่งนี้คือเราต้องการพิจารณาสิ่งประดิษฐ์ ( เช่นอิมเมจนักเทียบท่าหรือชุดซอฟต์แวร์) เป็นวัตถุของคำกริยาต่อไปนี้:

  • สร้าง
  • ทดสอบ
  • ปรับใช้

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

ตัวอย่างเช่นที่เก็บที่มีรหัสสำหรับเว็บไซต์และบริการไมโคร "a" อาจมีไดเรกทอรีย่อยดังต่อไปนี้เพื่อการดำเนินงาน:

./ops/website
./ops/micro-service-a

แต่ละคนมีสามสคริปต์เรียกว่าbuild, และtest deployตอนนี้การจัดระเบียบรายการระบบอัตโนมัติได้รับการชี้แจงอย่างใดลองเปลี่ยนความสนใจของเราไปยังการกำหนดค่า

เงื่อนไขหลักและข้อกำหนดเกี่ยวกับองค์กรการกำหนดค่าถูกกำหนดโดยdeployคำกริยาเมื่อนำไปใช้กับสิ่งประดิษฐ์ที่เหมือนบริการ deployกริยาควรมีพารามิเตอร์ต่อไปนี้:

  • รุ่นของสิ่งประดิษฐ์ที่จะปรับใช้
  • เป้าหมายการปรับใช้ของสิ่งประดิษฐ์ซึ่งอธิบายสภาพแวดล้อมที่เป็นรูปธรรมซึ่งสิ่งประดิษฐ์ที่นำไปใช้งานจะทำงาน ( เช่นคลัสเตอร์และจุดสิ้นสุดที่ควรพูดคุย)
  • ข้อมูลประจำตัวที่ควรใช้เพื่อเชื่อมต่อกับปลายทางอื่น ๆ ( เช่นฐานข้อมูล)
  • การกำหนดค่ารันไทม์ของ (เช่นระยะเวลาที่รายการแคชควรอยู่ ฯลฯ )

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


5

ฉันสามารถตอบ bout docker หนึ่งในแนวปฏิบัติที่ดีที่สุดในการใช้นักเทียบท่าคือการเก็บไฟล์นักเทียบท่าและเขียนไฟล์ในพื้นที่เก็บข้อมูลเดียวกันของโครงการดังนั้นทุกที่ที่คุณโคลนโครงการคุณสามารถสร้างภาพนักเทียบท่าได้และมันดี เก็บไฟล์ docker หลาย ๆ ไฟล์ไว้เช่น (prod, staging, dev) เพื่อให้คุณสามารถสร้างอิมเมจและรันคอนเทนเนอร์ด้วยตัวเลือกเฉพาะสำหรับแต่ละ env ตัวอย่างเช่นสำหรับเครื่อง dev คุณสามารถใช้เครือข่ายเฉพาะและรันคอนเทนเนอร์อ้างอิงเพิ่มเติมหรืออะไรก็ตาม


4

รหัสของเครื่องมือแต่ละอันจะเข้าสู่ repo ของตนเอง สำหรับเช่น

  1. แม่แบบเจนกินส์ Groovy เป็นเจนกินส์ repo
  2. เพลย์บุ๊ค YAML ที่มีอยู่ใน repo ของตนเอง (ด้วยบทบาทงานไดเรกทอรีย่อยคลังโฆษณา
  3. เทมเพลต Cloudformation / Terrform ใน repo ของตนเอง
  4. ไฟล์นักเทียบท่าในตัวของมันเอง 5 .. และอื่น ๆ

สิ่งนี้จะช่วยให้คุณปรับขนาดได้ดีขึ้นในแง่ของการประสานกระบวนการและการบำรุงรักษาสาขาต่าง ๆ สำหรับแต่ละสภาพแวดล้อม

สิ่งนี้จะให้การควบคุมที่ละเอียดยิ่งขึ้นและลดภาระค่าใช้จ่ายการกำหนดเวอร์ชันทั้งหมดของคุณให้กับระบบควบคุมเวอร์ชัน นอกจากนี้ยังสร้างสาขาแยกสำหรับแต่ละสภาพแวดล้อมและติดแท็กรหัสสำหรับทุกการผลิต (เช่นเดียวกับที่เราทำเพื่อฐานรหัสแอปพลิเคชัน) คิดว่าอินฟราและกระบวนการในแง่ของรหัส (การเปลี่ยนแปลงใด ๆ ในกระบวนการจะต้องมีการประมวลผลและส่งไปยัง QA, SIT, UAT และเป็น PROD) คล้ายกับแอปพลิเคชัน

ตัวอย่างเช่นคุณอาจมี V2.1 ของ Ansible ที่ทำงานอยู่ในการผลิต (สาขาหลัก) แต่ V2.0 ของคอนเทนเนอร์นักเทียบท่าที่ทำงานใน Prod (สาขาหลัก)

เก็บสคริปต์ DB / สคริปต์ทุบตีไว้ในที่เก็บของตนเองและบางทีคุณอาจมีไฟล์ Healthcheck (JSON / YAML) กำหนดค่าเพื่อแสดงเวอร์ชันของเครื่องมือ / ชิ้นส่วนทั้งหมดในแต่ละ URL ที่ปรับใช้เพื่อการติดตามและดำเนินการโดยอัตโนมัติ (เพื่อให้เว็บบล็อกของคุณอ่าน URL และทำการปรับใช้อัตโนมัติ)


2
ข้อผิดพลาดของวิธีนี้คือ v2.1 อยู่ใน qa และไม่ผ่านการตรวจสอบและคุณต้องแก้ไขการผลิตอย่างเร่งด่วนคุณไม่สามารถแก้ไข v2.0 และถ้าคุณทำ v2.2 สำหรับโปรแกรมแก้ไขนี้มีความเสี่ยงสูง สูญหายหรือถูกเขียนทับเมื่อ v2.1 ไปที่การผลิตคูณด้วยจำนวนรหัสที่แยกต่างหากใน repo และในไม่ช้าคุณก็มีฝันร้ายของ backport (มันใช้งานได้ แต่ฉันต้องเพิ่มข้อจำกัดความรับผิดชอบนี้ :))
Tensibai

3
การใช้กิ่งไม้เพื่อติดตามข้อมูลสภาพแวดล้อม / การใช้งานเฉพาะดูเหมือนว่ารูปแบบมดสำหรับฉัน: ถ้าเรามี 20 สภาพแวดล้อมนั่นหมายความว่าเรามี 20 สาขาที่จะซิงค์ ... ซึ่งเป็นแหล่งที่มาของข้อผิดพลาดและความสับสน คุณช่วยอธิบายได้ไหมว่าทำไมคุณไม่ใช้ไฟล์กำหนดค่าเพื่อติดตามข้อมูลสภาพแวดล้อม / การใช้งานเฉพาะและเวิร์กโฟลว์ของคุณทำงานกับสาขาเหล่านี้อย่างไร นี่ไม่ใช่ปัญหาเล็กน้อย!
Michael Le Barbier Grünewald

3

การแยกความแตกต่างระหว่าง Ops, Dev และ DevOps ส่งเสริมการแยกและบังคับใช้ความคิด "โยนข้ามกำแพง" เพื่อเพิ่มความร่วมมือระหว่างทีมหนึ่งควรใส่ทุกอย่างในที่เก็บที่จำเป็นในการสร้างและปรับใช้โครงการ

ต้องบอกว่าคำตอบสำหรับคำถาม:

วิธีการโครงสร้าง DevOps รหัสที่เกี่ยวข้องและกำหนดค่าในที่เก็บรหัส?

คือถ้าจำเป็นต้องมีการกำหนดค่าให้เรียกใช้โครงการดังนั้นควรวางไว้ในไดเรกทอรีเดียวกัน

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