เราวางแผนที่จะสร้าง VM ให้เป็นอัตโนมัติสำหรับโครงสร้างพื้นฐานการสร้างของเราเพื่อให้เราสามารถ:
- ปรับขนาดรีซอร์สการบิลด์ตามความต้องการเช่นโดยการเพิ่มเอเจนต์บิลด์เพิ่มเติมเมื่อต้องการและลบออกเมื่อไม่ต้องการ
- สร้างสภาพแวดล้อมการสร้างใหม่ทั้งหมดหรือบางส่วนหาก / เมื่อเครื่องตาย
- ทำซ้ำสภาพแวดล้อมการสร้างเมื่อเราต้องการตั้งค่าการทดสอบ
หนึ่งในขั้นตอนในกระบวนการนี้คือสร้างภาพฐาน VM โดยอัตโนมัติ (ในกรณีของเราโดยใช้ Hyper-V) เพื่อที่เราจะได้สคริปต์ที่:
- สร้าง VHDX ใหม่จาก ISO ด้วยสคริปต์Convert-WindowsImage ขณะนี้เรากำลังใช้ Windows 2012R2 อยู่ แต่จะเริ่มต้นใช้งานกับ 2016 ทันทีที่พร้อมใช้งาน
- เพิ่มสคริปต์แบบอัตโนมัติไปยัง VHDX ใหม่พร้อมการกำหนดค่าพื้นฐานทั้งหมดที่เราต้องการ
- อัพเดต VHDX ด้วย windows patches ล่าสุดโดยใช้สคริปต์Apply-WindowsUpdate
- สร้าง Hyper-V VM ใหม่ตาม VHDX และเริ่มต้น
- รอให้ VM บูตและรอบริการ WinRM เพื่อให้พร้อมรับการเชื่อมต่อระยะไกล
- รอให้ windows ทำการกำหนดค่าเริ่มต้นและกำหนดค่าแพตช์ใหม่ให้เสร็จ
- ใช้แพตช์เพิ่มเติม
- เริ่มต้นใหม่เพื่อให้การกำหนดค่าของแพตช์ล่าสุดเสร็จสมบูรณ์
- รอให้ windows ทำการกำหนดค่าแพตช์ให้เสร็จ
- พุชสคริปต์ sysprep ไปยังเครื่องและเรียกใช้สคริปต์นั้น สิ่งนี้จะเรียกใช้ sysprep จากนั้นปิดเครื่อง
- ลบ VM แต่เก็บ VHDX
- ลบ sysprep และไม่ต้องใส่ไฟล์ออกจาก VHDX จากนั้นทำการบีบอัด VHDX
- ย้าย VHDX ไปยังตำแหน่งเทมเพลตและทำเครื่องหมายว่าอ่านอย่างเดียว
ปัญหาที่เราประสบอยู่ในขั้นตอนที่ 6 และ 9 โดยปกติแล้วเรารอให้การกำหนดค่าทั้งหมดเสร็จสิ้นก่อนที่เราจะรีบูต / ปิดเครื่อง แต่ดูเหมือนจะไม่มีวิธีการตรวจสอบว่า windows ได้เสร็จสิ้นขั้นตอนการกำหนดค่าแล้ว
เมื่อผ่าน UI จะมีความชัดเจนมากเมื่อทำขั้นตอนใดขั้นตอนหนึ่งเนื่องจากการเข้าสู่ระบบ UI ไม่ปรากฏขึ้นจนกว่ากระบวนการจะพร้อม อย่างไรก็ตามเมื่อใช้ WinRM เพื่อเชื่อมต่อกับเครื่องจากระยะไกลสิ่งนี้จะมีความชัดเจนน้อยกว่าเนื่องจาก WinRM ให้การเข้าถึงเครื่องก่อนที่จะเสร็จสิ้นด้วยการกำหนดค่า
ดังนั้นคำถามก็คือวิธีที่พิสูจน์ได้ว่าโง่ที่สุดในการตรวจสอบการเชื่อมต่อระยะไกลที่ Windows ได้ทำการตั้งค่าการอัพเดท ฯลฯ เพื่อให้เราสามารถรีบูต / ปิดเครื่องโดยไม่ทำให้เกิดปัญหาในภายหลัง
------ แก้ไข -----
ในที่สุดเราก็ใช้คำตอบของ Katherine เวอร์ชันที่แก้ไขแล้วซึ่งสคริปต์ของเราก็รอwindeploy
และngen
ดำเนินการให้เสร็จสมบูรณ์ ระบุว่าngen
ยังไม่สมบูรณ์จนกว่าจะดีหลังจากที่ระบบปฏิบัติการเสร็จสิ้นการเริ่มต้นใช้งานและเป็นโบนัส VHDX สุดท้ายจะมี. NET Framework ngen-ed ทั้งหมดซึ่งหมายความว่าเราไม่ต้องจัดการกับสิ่งนั้นเมื่อเราสร้างใหม่ VMs ของเทมเพลตดิสก์ สคริปต์ทั้งสองที่เราใช้ในการสร้างเทมเพลต VHDXและสคริปต์เพื่อสร้างสภาพแวดล้อมการทดสอบในท้องถิ่นนั้นอยู่ใน GitHub ในกรณีที่ทุกคนสนใจ