การดูแลระบบ Computer มักยึดติดกับขั้นตอน (Step) และ Configuration โดยเฉพาะการติดตั้ง Application (Software deployment), ควบคุมค่า Configuration ของ OS หรือ Application และเก็บค่า Configuration นั้นไว้ เพื่อควบคุมสถานะให้มันใช้งานได้ เวลาที่ระบบมีปัญหามันมักเป็นเรื่องที่ติดค้างอยู่ในใจของผู้ที่ต้องดูแลระบบ เมื่อได้ยินคำถาม เช่น “ใครไปแก้อะไร?” หรือ “ทำอะไรไม่เหมือนกันกับเครื่องที่ใช้งานได้หรือเปล่า” บางทีระบบงานอาจใช้งานมากจนเพิ่มจำนวนเครื่อง (scale-out) หรือย้ายเครื่องไปเครื่องใหม่ที่มีประสิทธิภาพดีกว่า (scale-up) จะต้องติดตั้ง Application ใหม่ ก็ต้องไปหาขั้นตอนการทำหรือไปตามคนที่ทำเป็นมาทำให้ได้ไหม? สมัยนี้ Hardware ก็ไปทาง Virtualization หรืออยู่บน Cloud เป็นหลัก ทำให้การย้ายเครื่องทำได้ง่าย เหตุการณ์ที่ยกมานี้มีโอกาสเกิดขึ้นจริงได้เสมอ ถ้าเรามองภาพ Server กันใหม่ ว่าเครื่อง Server มันประกอบด้วย Hardware, Application และ Configuration แล้วทำเราเอกสารบันทึกขั้นตอนการ Setup และค่า Configuration เก็บไว้ทำเป็น Version เมื่อมีเอกสารนี้แล้วเวลาจะทำอะไรก็อ้างอิงจากเอกสารนี้ แล้วนี่ก็เป็นที่มาของระบบที่เรียกว่า Configuration Management
Configuration Management
การเปลี่ยนแปลงในระบบมักถูกเหมาเรียกว่า Change ไปหมด เพราะมันคือการเปลี่ยนแปลง แต่หากมองในด้านการกระทำของ Change ใน 2 ส่วนคือ เปลี่ยนอะไร (What) และ เปลี่ยนอย่างไร (How) มันมีคำเรียกใหม่คือ Configuration Management เพื่อให้เข้าใจง่ายๆ เราจะเรียก Change ว่าคือกระบวนการ (Process) เมื่อต้องการจะเปลี่ยนแปลงอะไรสักอย่าง ที่ควบคุมตลอด Life-Cycle ของการเปลี่ยนแปลงนั้นๆ เช่น การขอ Change เพื่อทำ Web Application, จัดลำดับของ Change ว่าจะเลือกทำอะไรก่อน , Resource , Timeline เป็นต้น ส่วนของ Configuration Management จะเน้นไปการติดตั้ง (Implementation) ของ Change เช่น การทำขั้นตอน (Step) การติดตั้ง Web Application, การบันทึกค่า Configuration เป็นต้น การทำ Configuration Management เป็นกระบวนการดูแลและควบคุมค่า Configuration ในระบบ การไปลงมือทำก็มีเครื่องมือตามหลัก ITIL ก็อาจพูดถึง CMDB แต่ในหัวข้อของเรา จะพูดถึงเครื่องมือ Configuration Management ในส่วนของการทำ Configuration และติดตั้ง
การนำ Configuration Management มาใช้มีประโยชน์ดังนี้
- สร้าง Standard ของการทำงาน จะทำกี่ครั้ง
หรือบนเครื่องไหนก็ให้ผลเหมือนกัน - ทำ Version control ได้
- ควบคุมเวลาได้และประหยัดเวลา
- ทดสอบเพื่อควบคุมคุณภาพได้
- ตรวจสอบผลและแก้ปัญหาได้ง่าย
เครื่องมือ Configuration Manage ที่มีอยู่มากมาย เช่น Chef, Puppet เป็นต้น มันทำงานได้ดีบน Unix/Linux แม้จะมี Version ที่อยู่บน Windows ด้วย แต่มันก็ยังไม่ค่อยดี เพราะการจัดการ Configuration ของ Unix เป็น Document Oriented OS แต่ Windows เป็น API Oriented OS นั่นคือ การ Configure ระบบงาน Unix มักอยู่ในรูป Text File และเมื่อเป็น Windows มักจะเป็น Registry, การเรียก API หรือ WMI
PowerShell DSC
เครื่องมือ Configuration Management ที่ออกมาหลายตัว มีความถนัดกันคนละอย่าง เพราะการเรียกใช้ Function ก่อนหน้านี้ยังไม่มีมาตราฐาน ก็เป็นภาระของผู้ที่ซื้อเอง ที่จะต้องพิจารณาว่าเลือกถูกตัว หรือเหมาะกับงาน แต่ตอนนี้ Microsoft สร้าง PowerShell Desire State Configuration (DSC) ขึ้นมาเพื่อสร้างเป็นมาตรฐาน ทำให้ใช้ PowerShell จัดการ Configuration Management ได้ โดยเป็นได้ทั้งการเขียนเพื่อใช้เองหรือเรียกจาก พวกเครื่องมาที่ซื้อมาก็ไดั
PowerShell – Imperative vs. Declarative และ Idempotent (ไอ-เด็ม-โพ-เทน)
เราจะใช้ PowerShell เพื่อทำหน้าที่ Configuration Management หากพูดถึง PowerShell ที่เป็น Script มันมีรูปแบบที่เรียกว่า Imperative หมายถึง หากอยากทำงานอะไรก็ต้องเขียนขั้นตอนทุกอย่างเอง ตัวอย่าง เมื่อเราต้องดูแล Print Server มันเป็น Windows Service ชื่อ Spooler ในตัวอย่างเป็นรูปด้านซ้ายเป็นแบบ Script (imperative) และด้านขวาเป็นแบบ DSC (declarative)
ด้านซ้ายต้องเขียนเงื่อนไขไปดูว่า Service Start (บรรทัดที่ 1) หรือไม่ ถ้าไม่ Start ก็สั่ง Start (บรรทัดที่ 8) แต่ด้านขวา รูปแบบของ DSC ซึ่งเป็นแบบ Declarative ทางด้านขวาเป็นการสั่งการว่าให้ดู Service Name = Spooler ต้องมีสถานะเป็น Running แบบนี้ไม่ต้องเขียนเงื่อนไข ทำแค่กำหนดค่าที่ต้องการให้เป็นลงไป เราเรียกแบบนี้ว่า Declarative ยังมีอีกคำอันที่จับเรื่อง DSC แล้วต้องรู้จักคือ Idempotent หรือ ทำกี่ครั้งก็เหมือนเดิม หมายถึง การใช้ Configuration Management เราต้องการให้เครื่องอยู่ในสถานะที่เรากำหนดไว้ ดังนั้น เมื่อ Run script DSC แม้ว่าจะ Run กี่ครั้งก็ตาม มันก็ทำให้ Configuration เหมือนที่กำหนดไว้ทุกครั้ง
เริ่ม PowerShell DSC แรกกันเลย
การเขียน PowerShell DSC มี format และลำดับดังนี้
1. สร้าง Configuration ขึ้นมาตามตัวอย่างในภาพ
A. ใช้คำสั่งว่า Configuration แล้วตามด้วยชื่อที่ตั้งขึ้นมาเอง
B. สามารถส่งค่า Parameter ได้ เช่น ที่ใช้บ่อยก็เป็นชื่อ Computer
C. หัวใจของ DSC อันหนึ่งคือ Resource ส่วนนี้ใช้ import resource file
D. ระบุ node โดยใส่ชื่อ Computer name ที่ต้องการ config ลง และลงมือเขียนสิ่งที่เราต้องการทำ ในภาพเป็นการกำหนดให้ Service ที่ชื่อ Spooler ต้องอยู่ในสถานะ Running
2. Compile ได้ผลลัพธ์เป็น mof file (Windows Management Object file) ด้วยการเรียกชื่อ Configuration ตามด้วย Parameter คือ NodeName จะได้ Output เป็นไฟล์อยู่ใน folder
3. สั่ง Run configuration โดยระบุแค่ Path ในตัวอย่างใส่ -Verbose -Wait เพื่อให้แสดง Message ตอนที่มัน Run ด้วย ด้านล่างเป็นผลลัพธ์ โดยก่อนจะ Run ได้ stop service spooler ไว้ จะเป็นว่าช่วงแรกมันจะ Test เพื่อดูว่าต้องทำอะไร ซึ่งมันพบว่า Service stop มันจึงสั่ง Start ในส่วน Set
Script ตัวอย่าง
Configuration ManagePrintServer | |
{ | |
param ( | |
[string[]]$NodeName = 'localhost' | |
) | |
Import-DscResource –ModuleName 'PSDesiredStateConfiguration' | |
Node $NodeName | |
{ | |
Service StartSpooler | |
{ | |
Name = "spooler" | |
State = "running" | |
Ensure = "Present" | |
} | |
} | |
} | |
ManagePrintServer -NodeName localhost -OutputPath C:\mof | |
Start-DscConfiguration -Path C:\mof -Verbose -wait |
สรุป
เราได้ทำความเข้าใจ Configuration Management ว่ามันไม่ได้เป็นเพียง Script ที่ใช้ Run งานทั่วไป แต่มันเป็นการสอนเครื่องว่า เครื่องนี้เราต้องการให้มี Configuration เป็นแบบนี้ แล้วมันจะช่วย Set ให้เป็นแบบนี้เสมอ ในตอนต่อไปเราจะหัดเขียน Configuration เรียนรู้เรื่อง Local Configuration Manager และ Resource
Reference
https://www.pluralsight.com/blog/software-development/powershell-dsc-pull-server
https://pmstudycircle.com/2012/01/configuration-management-vs-change-management/