ניהול תצורה הצהרתי של Windows עם DSC — מתחילים IaC עם dsc.exe

· עודכן בתאריך: · · Windows, DSC, IaC, PowerShell, winget, ניהול תצורה

היסטוריית עדכונים (גרסה ראשונה, פורסמה בתאריך 28 Aug 2026)
פרסום ראשון

“רוצים לבנות מחדש מחשב סטנדרטי”, “רוצים להריץ שוב setup שנכשל באמצע”, “רוצים למצוא הגדרה שמישהו שינה ידנית”. כשמנהלים לקוחות ושרתים של Windows עם runbooks וסקריפטים, הקשה היא לשחזר את אותן הגדרות ולשמור עליהן.

runbook מתחיל להיסחף מהמציאות ברגע שהוא רץ, אלא אם ממשיכים לעדכן אותו אחרי כל שינוי. גם ב-BAT וגם ב-PowerShell, כדי שהרצה שנייה לא תעשה apply כפול ולא תיעצר בשגיאה, צריך לכתוב בעצמכם בדיקות קיום ופיצולים. DSC (Desired State Configuration) מעביר את העומס הזה מניהול “צעדים” לניהול “מצב רצוי”.

המאמר הזה עוסק ב-Microsoft DSC v3 (dsc.exe), שהופיע ב-2025 ככלי שורת פקודה בלי תלות ב-PowerShell. זו נקודת הכניסה לניהול לקוחות ושרתים של Windows עצמם כ-IaC הצהרתי (Infrastructure as Code), באותו ראש שבו משתמשים ב-Terraform וב-Ansible ב-Linux ובענן.1

הקהל הוא מפתחים ואנשי IT שרוצים להעביר את ניהול התצורה של Windows מ-runbooks וסקריפטים. הבסיס הוא Windows 10/11, DSC 3.0 ואילך, ופעולת PowerShell בסיסית, ורמת הקושי היא בינונית. שמות ה-adapters מ-DSC 3.2 ואילך, וגרסת WinGet הנדרשת, מוסברים בנפרד במקומות הרלוונטיים.

1. קודם המסקנה — כותבים מצב, בודקים, ורק אז מחילים

אם מתחילים עכשיו ניהול תצורה הצהרתי ל-Windows, בוחרים ב-Microsoft DSC v3 (dsc.exe). כותבים את “המצב הרצוי” ב-YAML/JSON, ואת ההשוואה למצב הנוכחי ואת ההחלה משאירים ל-DSC ול-resources. גם כשמחילים את אותה תצורה שוב ושוב, פריטים שכבר במצב הרצוי לא נגעים. זה ניהול אידמפוטנטי בבסיסו.23

עם זאת, “אפשר להחיל כמה פעמים שרוצים” ו”מותר להחיל את התוכן הזה” הם שני דברים שונים. קודם קוראים את המצב, בודקים את ההפרש ואת התחזית, ורק אז מחילים. בנוסף, DSC v3 אינו agent תושב, ולכן audit ותיקון תקופתיים מתכננים בנפרד.41

סדר הקריאה הוא כזה:

מה מחליטים עכשיו פרק לקריאה מה מקבלים
על איזה DSC מדובר, ומה אפשר להשאיר לו פרקים 2–3 הבחנה בין דורות, ותפקידי get, test ו-set
לנסות בקטן ולארוז לקובץ תצורה פרקים 4–5 מאימות resource בודד עד החלת התצורה כולה
לנצל נכסי PSDSC ו-winget קיימים פרק 6 adapters ותנאי המעבר של פורמט הקובץ
לשמור על המצב שהוחל פרקים 7–8 זיהוי drift, הרשאות הרצה, וטיפול ב-secrets
מניהול צעדים לניהול מצבבסקריפט runbook מממשים בעצמכם בדיקת קיום ופיצולים כדי שאפשר יהיה להריץ שוב, ואילו ב-DSC מצהירים על המצב הרצוי ו-DSC וה-resources לוקחים על עצמם את ההשוואה ואת ההחלהכותבים צעדים (BAT, PowerShell)מממשים בעצמכם בדיקת קיום ופיצוליםכותבים מצב (DSC)משווים למצב הנוכחימחילים רק מה שצריך

איור 1: האחריות על הרצה חוזרת עוברת מכתיבת ענפים בצעדים, להצהרה על מצב ולשימוש ב-resources.

ב-diagram, solid line מציינת relation שתמיד מתקיים ו-dashed line מציינת relation מותנה (התנאים מופיעים בהסבר של כל relation ב-detail page). הרשימה המלאה של ה-relations (סה”כ 17, כולל evidence ו-certainty) וההגדרות של ה-concepts המרכזיים נמצאות ב-detail page של ה-knowledge map (ביפנית). Data: JSON-LD / Turtle

2. מזהים איזה DSC משתמשים בו — ארבעה קווים, ומה שאין ב-v3

2.1. הגיבור של המאמר הזה הוא dsc.exe עצמאי

חיפוש “DSC” מחזיר מידע מארבעה קווים שנבדלים גם בכתיבה וגם בהרצה. קודם בודקים על איזה מהם מדבר המסמך שקוראים.5

קו מה זה בפועל מיקום
PSDSC v1.1 מובנה ב-Windows PowerShell 5.1 Legacy. LCM תושב, פורמט MOF
PSDSC v2 מודול ל-PowerShell 7 PSDesiredStateConfiguration 2.x
PSDSC v3 (preview) מודול PowerShell לתמיכת Linux של Azure Machine Configuration
Microsoft DSC v3 dsc.exe עצמאי נושא המאמר. בלי תלות ב-PowerShell, cross-platform

Microsoft DSC v3 אינו עדכון פשוט של מודול PowerShell DSC (PSDSC). זה מוצר נפרד, שנכתב מחדש אחרי שחתכו את התלות ב-PowerShell. התצורה נכתבת כנתוני JSON/YAML, ו-resources אפשר לממש בכל שפה. DSC עצמו רץ על Linux, macOS ו-Windows.1

ייחוס ארבעת דורות DSCמ-PSDSC v1.1 שמובנה ב-Windows PowerShell 5.1 נגזרים PSDSC v2 ל-PowerShell 7 ו-PSDSC v3 preview ל-Machine Configuration, ואילו Microsoft DSC v3, שנכתב מחדש בנפרד בלי תלות ב-PowerShell, הוא הקו הראשי הנוכחיכתיבה מחדשPSDSC v1.1 (מובנה ב-WinPS 5.1)PSDSC v2 (PowerShell 7)PSDSC v3 previewMicrosoft DSC v3 (dsc.exe)Azure Machine Configurationנושא המאמר

איור 2: גם כשהשם הוא DSC, מבחינים בין דורות של מודול PowerShell לבין dsc.exe עצמאי.

מכאן ואילך, “DSC” במאמר הזה פירושו Microsoft DSC v3. בחיפוש, הוספת “DSC v3” או “dsc.exe” מקלה להפריד מחומר של דורות ישנים. איך קוראים ל-PSDSC resources קיימים מכוסה בפרק 6.

2.2. v3 אינו שירות תושב שזוכר תצורה ומתקן לבד

ה-LCM (Local Configuration Manager) של PSDSC v1.1 היה agent תושב שהחזיק את התצורה וביצע החלה תקופתית ותיקון אוטומטי. ב-DSC v3 אין LCM; זו פקודה שרצה רק כשקוראים לה. התקנת dsc.exe והחלה חד-פעמית לא מתקנות שינויים שיגיעו אחר כך מעצמן.1

LCM התושב של v1.1 מול מודל הפקודה של v3ב-PSDSC v1.1 LCM תושב החזיק את התצורה וטיפל ב-pull תקופתי ובתיקון אוטומטי, ואילו DSC v3 מופעל רק כפקודה, ולכן את תשתית התזמון בוחרים ומכינים בעצמכם מ-Task Scheduler, CI ו-Machine ConfigurationPSDSC v1.1: LCM תושבמחזיק את התצורה, pull תקופתי, תיקון אוטומטיDSC v3: הפעלת פקודה בלבדאת תשתית ההרצה מכינים בעצמכםTask Scheduler, CI, Machine Configuration

איור 3: ב-v3 מפרידים בין “איך מגדירים” לבין “מתי זה רץ”, ואת השני משאירים ל-Task Scheduler או לשכבת ניהול גבוהה יותר.

זו לא נסיגה של יכולת, אלא שינוי תכנון שפותח את אופן ההרצה לכלים מודרניים. ועדיין, מי שמגיע עם הראש של תפעול pull server ב-v1.1 מתבלבל. אם צריך אכיפה מתמשכת, בוחרים תשתית הרצה כמו Task Scheduler, CI או Machine Configuration. התפעול עצמו בפרק 7.

3. מבינים תצורה הצהרתית — משווים צעדים למצב

3.1. מוציאים בדיקת קיום ופיצולים מתוך ההצהרה

לדוגמה, שומרים ב-Registry את מצב ההפעלה של אפליקציה. ב-PowerShell אימפרטיבי בודקים אם המפתח קיים, יוצרים אותו אם צריך, ואז מגדירים את הערך. את הצעדים שמאפשרים הרצה חוזרת מנהלים בעצמכם.

# אימפרטיבי: כותבים את ה"צעדים". מנהלים כל פיצול וכל סדר בעצמכם
$path = 'HKCU:\Software\MyCompany\App'
if (-not (Test-Path $path)) {
    New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name 'Mode' -Value 'standard'

ב-DSC כותבים את אותה דרישה כהצהרה על מצב. בדיקת קיום ופיצול היצירה לא מופיעים אצל מי שמצהיר. דוגמה מלאה שמכניסה את הקטע הזה ל-resources של configuration document מופיעה בפרק 5.

# הצהרתי: כותבים את ה"מצב". יצירה ותיקון הם העבודה של ה-resource
- name: מצב ההפעלה של האפליקציה
  type: Microsoft.Windows/Registry
  properties:
    keyPath: HKCU\Software\MyCompany\App
    valueName: Mode
    valueData:
      String: standard

ההבדל אינו ש-PowerShell לא יכול להיות אידמפוטנטי. את הבדיקה ואת ההחלה שכתבתם בסקריפט משאירים ל-resource. גם מכונה שנכשלה באמצע וגם מכונה שכבר מוגדרת יכולות לקבל מחדש את אותו “מצב רצוי” כבסיס.2

3.2. ה-resource לוקח על עצמו get, test ו-set

במרכז DSC נמצא ה-resource. הוא מספק את הפעולות ליעד תצורה מסוג מסוים, כמו ערך Registry, Windows feature או משתנה סביבה. המשתמש כותב “מה צריך להיות באיזה מצב”, ומשאיר את “איך מגדירים” ל-resource.6

פעולה תפקיד הבדל במימוש
get שולפים את המצב הנוכחי כל resource מממש
test בודקים אם המצב הנוכחי תואם להצהרה אם אין מימוש ייעודי, DSC ממלא ב-test סינתטי שמשווה את מה שנשלף להצהרה
set מכוונים למצב הרצוי מממשים רק resources שיכולים לאכוף מצב. ל-resources לקריאה בלבד, כמו מידע על מערכת ההפעלה, אין אותו

כשמחילים תצורה שלמה ב-dsc config set, DSC קודם עושה test לכל instance וקורא ל-set רק לאלה שאינם במצב הרצוי. זה המנגנון שמאפשר להחיל את אותה תצורה שוב ושוב.3

לולאת ההתכנסות של get, test ו-settest משווה את המצב הרצוי שנכתב ב-configuration document למצב הנוכחי, לא קורה כלום אם אין הפרש, ואם יש, set מחיל רק את ההפרש ו-get מאשר את התוצאה, זרימת התכנסות אידמפוטנטיתאין הפרשיש הפרשconfiguration document (מצב רצוי)test: השוואה למצב הנוכחילא עושים כלום (אידמפוטנטי)set: מחילים רק את ההפרשget: מאשרים את המצב שנוצר

איור 4: בהחלת תצורה שלמה קודם משווים, ואז משנים רק את ה-resource instances שצריך.

3.3. לא מערבבים resource set בודד עם config set של התצורה כולה

dsc resource set תמיד קורא ל-set של ה-resource שצוין. האם רץ test מראש תלוי במימוש של ה-resource וב-implementsPretest במניפסט. חשוב לא להניח ש-pre-test ש-config set עושה קיים גם ב-resource set.3

ההבדל ב-pre-test בין החלת תצורה שלמה לקריאה בודדתconfig set בודק כל instance וקורא ל-set רק כשצריך, ואילו resource set תמיד קורא ל-set של ה-resource, ו-pre-test שם תלוי במימוש ובמניפסטכןלאconfig setבודקים כל instanceבמצב הרצוי?לא קוראים ל-setקוראים ל-setresource setקוראים ל-set של ה-resourcepre-test תלוי במימוש

איור 5: גם כשהשם הוא set, מבחינים בין פעולת תצורה שלמה ש-DSC בודק מראש לבין פעולה בודדת שמועברת ישר ל-resource.

בתחלה צופים עם get ו-test בודדים, ורק כשמנהלים כמה מצבים יחד מאחדים ל-configuration document. כך קל יותר להבין. idempotency היא תכונה להרצה חוזרת; היא לא מבטלת מחסור בהרשאות או שגיאות הרצה של resource.

4. הפעולות הראשונות — מתקינים וצופים עם get ו-test

4.1. מכינים dsc.exe ובודקים אילו resources זמינים

יש שתי דרכי התקנה: מחלצים ארכיון מ-GitHub release ומוסיפים ל-PATH, או, ב-Windows, מתקינים עם winget ממקור Microsoft Store.1

# חיפוש והתקנה של מהדורת stable ממקור Microsoft Store
winget search DesiredStateConfiguration --source msstore
winget install --id 9NVTPZWRC6KQ --source msstore

אחרי ההתקנה, מציגים את ה-resources הזמינים במכונה המקומית.

dsc resource list

מפרידים בין “DSC עצמו מותקן” לבין “אפשר להשתמש ב-resource שרוצים”. כאן מוצאים את שם ה-type, ואז מציינים את ה-properties לקלט. אם משתמשים ב-PSDSC resources של דור ישן, בודקים גם את ה-adapters בפרק 6.

4.2. בהתחלה קוראים Registry תחת המשתמש

גם בלי לכתוב configuration document אפשר לקרוא ל-resources אחד-אחד. הדוגמה הבאה קוראת ערך תחת HKCU עם get, ובודקת עם test אם הוא במצב הרצוי. אף אחת מהפעולות האלה אינה משנה ערך.7

# שולפים את המצב הנוכחי (get)
dsc resource get --resource Microsoft.Windows/Registry `
  --input '{"keyPath":"HKCU\\Software\\MyCompany\\App","valueName":"Mode"}'

# בודקים אם זה במצב הרצוי (test) — בלי שום שינוי
dsc resource test --resource Microsoft.Windows/Registry `
  --input '{"keyPath":"HKCU\\Software\\MyCompany\\App","valueName":"Mode","valueData":{"String":"standard"}}'
ארבע הפעולות של פקודת dsc resourceתחת פקודת dsc resource תלויות ארבע פעולות, list למנות resources, get לשלוף את המצב הנוכחי, test להעריך את המצב הרצוי בלי שינויים, ו-set להחיל את המצב (רק ל-resources שמממשים Set)פקודת dsc resourcelist: מנות resourcesget: שולפים את המצב הנוכחיtest: הערכה בלבד, בלי שינוייםset: החלה (resources שתומכים ב-Set)

איור 6: מחפשים resource ב-list, קוראים את הערך הנוכחי ב-get, בודקים את ההפרש מההצהרה ב-test, ורק אז עוברים ל-set.

set שמשנה את כל המכונה, כמו HKLM או הגדרות מערכת, דורש הרשאות admin. את הניסיונות הראשונים מתחילים מדוגמאות בהיקף המשתמש (כמו HKCU), ובפעולות שמשנות בודקים את היעד ואת ההרשאות. גם שימוש ב-adapter ל-Windows PowerShell PSDSC resources מניח הרצה כ-administrator.7 איך מפרידים בין משתמש הרצה לבין התצורה מכוסה בפרק 8.

5. ה-configuration document — מההצהרה עד אישור אחרי ההחלה

5.1. מרכזים ב-YAML “מה צריך להיות באיזה מצב”

configuration document הוא קובץ YAML/JSON שמצהיר על כמה resource instances יחד. לפחות מגדירים $schema ו-resources, ולכל instance כותבים name (שם תצוגה ייחודי במסמך), type (השם המלא של ה-resource) ו-properties (המצב הרצוי).2

# standard-pc.dsc.config.yaml — המצב הרצוי של מחשב סטנדרטי
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
parameters:
  appMode:
    type: string
    defaultValue: standard
resources:
  - name: מצב ההפעלה של האפליקציה
    type: Microsoft.Windows/Registry
    properties:
      keyPath: HKCU\Software\MyCompany\App
      valueName: Mode
      valueData:
        String: "[parameters('appMode')]"

בדוגמה הזו אורזים את ההצהרה מפרק 3 לקובץ, ומעבירים את מצב ההפעלה לפרמטר appMode. ערכים שמשתנים לפי מחלקה או סביבה אפשר להפריד מגוף התצורה. עם parameters ו-variables מצמצמים הגדרות כפולות ומבטאים גם ערכים דינמיים. הביטויים הם תת-קבוצה של פונקציות ARM template.2

מבנה של configuration documentconfiguration document מורכב מ-schema שמזהה את סכמת המסמך, מ-parameters ומ-variables שסופגים הבדלי סביבה, וממערך resources של resource instances, שלכל אחד מהם יש name, type ו-propertiesconfiguration document (YAML / JSON)$schema: URI של סכמת המסמךparameters / variablesresources: מערך instancesname, type, properties

איור 7: כשמפרידים את סכמת המסמך, את הערכים לפי סביבה ואת הצהרות ה-resources, אפשר לקרוא את כוונת ההגדרה כנתונים.

היתרון בכך שהתצורה הופכת לנתונים הוא שאפשר לסקור ב-diff של YAML “מה צריך להיות מוגדר במכונה הזו”. זה לא אומר שהנתונים חסרי סיכון. ה-resources שמפנים אליהם משנים את המערכת, ולכן גם אימות האמינות בפרק 8 נחוץ.8

5.2. מתקדמים בסדר test, what-if, set, get

לפני ההחלה תמיד שמים תצפית. dsc config test מדווח אם יש הפרש מהמצב הרצוי, ו-dsc config set --what-if מציג תחזית בלי לשנות.4

ארבעת הצעדים של החלה בטוחהבודקים הפרשים עם dsc config test, שלא מבצע שינויים, צופים מראש את השינויים עם אפשרות what-if של dsc config set, מחילים עם set אחרי ששוכנעתם, ומאשרים את התוצאה עם get, בסדר הבטוח הזהdsc config test (יש הפרש או אין)set --what-if (תחזית השינוי)dsc config set (החלה)dsc config get (אישור התוצאה)

איור 8: קודם רואים את ההפרש, אחר כך את תחזית השינוי, ורק כשמרוצים מחילים. בסוף קוראים שוב את המצב בפועל.

# 1. בודקים אם יש הפרשים (בלי שינויים)
dsc config test --file .\standard-pc.dsc.config.yaml

# 2. מציגים תחזית של מה שההחלה תשנה (בלי שינויים)
dsc config set --file .\standard-pc.dsc.config.yaml --what-if

# 3. מחילים אחרי ששוכנעתם
dsc config set --file .\standard-pc.dsc.config.yaml

# 4. מאשרים את המצב אחרי ההחלה
dsc config get --file .\standard-pc.dsc.config.yaml

כל שלב מראה דבר אחר. test הוא הכרעה אם יש התאמה, what-if הוא תחזית שינוי, ו-get הוא שליפת המצב בפועל. אם ה-resource לא מממש what-if ישירות, התחזית מסונתזת מתוצאת test, ולכן לא מבלבלים תחזית עם מדידה אחרי ההחלה.4

הסדר הזה הופך שינוי הגדרה מהימור חד-פעמי לשרשרת החלטות לפי שלב. אימות הרשאות בהחלה ואמינות ה-resource לא מוחלפים ב-idempotency או ב-what-if.

5.3. אם מתחילים מסביבה קיימת, עושים export ל-resources שתומכים בזה

dsc config export הוא כניסה הפוכה, שכותבת את הסביבה הנוכחית. מעבירים ב---file מסמך קלט שמנה resources שתומכים ב-export, ומקבלים בפלט הסטנדרטי configuration document שמכיל את כל ה-instances הקיימים שלהם.9

# מעבירים מסמך קלט שמנה את ה-resources היעד ושומרים את ה-configuration document הנוכחי
dsc config export --file .\export-targets.dsc.config.yaml > .\current-state.dsc.config.yaml

לא כל resource ניתן לייצוא, וכל סוג resource במסמך הקלט מוצהר פעם אחת בלבד. את המצב הנוכחי שמתקבל לוקחים כנקודת התחלה, ואז מחליטים מה לנהל כסטנדרט. export כותב את המצב הנוכחי; ההחלטה שזה המצב הרצוי שייכת לתפעול.9

מהמצב הנוכחי בונים את ההצהרה שרוצים לנהלכשמנים במסמך הקלט resources שתומכים ב-export מתקבל configuration document עם ה-instances הקיימים, ואחרי בדיקת התוכן התפעול מחליט איזה מצב לנהל כסטנדרטמנים resources שתומכים ב-exportdsc config exportמסמך תצורה של instances קיימיםבודקים את התוכן ומחליטים על סטנדרטהצהרה על המצב שרוצים לנהל

איור 9: כתיבת המצב הנוכחי וההחלטה מה לאמץ כסטנדרט הם שני שלבים נפרדים.

6. מנצלים נכסים קיימים — adapters ו-WinGet Configuration

6.1. ל-PSDSC resources קוראים ב-adapter שמתאים לסביבת ההרצה

גם אם v3 הוא מוצר נפרד, PSDSC resources קיימים לא מתבזבזים. אפשר לקרוא להם מ-configuration document של v3 דרך adapter resources. ב-DSC 3.2 השמות השתנו, לכן משווים את גרסת ההתקנה לשמות במסמכים.10

סביבה שמריצה resource קיים שם ה-adapter מ-DSC 3.2 ואילך השם שלפני כן
PowerShell 7. resources מבוססי class Microsoft.Adapter/PowerShell Microsoft.DSC/PowerShell
Windows PowerShell 5.1. resources תואמים מבוססי MOF ומבוססי סקריפט Microsoft.Adapter/WindowsPowerShell Microsoft.Windows/WindowsPowerShell

גם כש-DSC עצמו לא תלוי ב-PowerShell, resource קיים שנקרא דרך adapter רץ בסביבת PowerShell המתאימה. בצד Windows PowerShell משתמשים ב-PSDesiredStateConfiguration 1.1 המובנה, ומטפלים ב-resources תואמים מסוג סקריפט, class ו-binary.10

מבנה השכבות סביב DSC v3שכבות orchestration כמו winget configure ו-Azure Machine Configuration קוראות ל-DSC v3, ו-DSC v3 קורא ל-native resources ישירות ול-PSDSC resources קיימים דרך adapter resourceswinget configure, Machine Configurationdsc.exe (DSC v3)native resources (Registry וכו')adapter resourcesPSDSC resources קיימים (נכסי PowerShell)

איור 10: DSC v3 קורא ל-native resources ישירות, ונכסי PowerShell קיימים עוברים דרך adapter.

6.2. בסכמת v3 של WinGet מציינים את DSC v3 כמעבד

נקודת החיבור האחרת היא WinGet Configuration. גם קבצי .winget שהוצגו ב-מאמר על kitting של מחשבים משתמשים, בסכמת v3, ב-DSC v3 כמעבד. נדרשים WinGet 1.11 ואילך ומעבד dscv3.11

ב-metadata.winget.processor.identifier של קובץ התצורה מציינים dscv3, וכותבים resources ישירות בשורש המסמך. הגוף הוא configuration document של DSC v3.

# WinGet Configuration v3 — הגוף הוא configuration document של DSC v3
$schema: https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/2023/08/config/document.json
metadata:
  winget:
    processor:
      identifier: dscv3
resources:
  - name: מצב ההפעלה של האפליקציה
    type: Microsoft.Windows/Registry
    properties:
      keyPath: HKCU\Software\MyCompany\App
      valueName: Mode
      valueData:
        String: standard

אי אפשר להעביר פורמט v2 קיים כמו שהוא ל-dscv3. קובץ v2 עם properties.configurationVersion: 0.2.0 ועם ה-resources מתחת ל-properties ממשיך לרוץ על המעבד הקודם. כדי להעלות אותו ל-DSC v3 מעבירים את הפורמט לפי “Convert to v3” במאגר הדוגמאות הרשמי.11

כלומר, מפרידים מה עושים reuse. ב-PSDSC מדובר בקריאה ל-resource דרך adapter; ב-WinGet מדובר בהתאמת פורמט הקובץ והמעבד. הצהרת המצב שלומדים ב-DSC v3 היא בסיס משותף שמחבר את dsc.exe המקומי, את winget configure ב-kitting, ואת שכבות ניהול גבוהות כמו Machine Configuration.1

7. תפעול מתמשך — Git כמקור האמת, וזיהוי drift

7.1. קודם מאוטמטים רק זיהוי, ומפרידים אותו מתיקון

configuration documents שמים ב-מאגר Git. אם שינויים עוברים סקירה ב-pull request, מיזוג, ואז החלה, התצורה הרצויה והיסטוריית השינויים שלה יושבות באותו מקום. עוברים מניהול שבו ממשיכים לעדכן runbook בנפרד, לניהול שבו ההצהרה הבר-הרצה היא מקור האמת.

אחרי ההחלה, אם מישהו משנה הגדרה ידנית והמכונה זזה מהמצב שהוצהר, זה configuration drift. הזיהוי הוא הרצה מתוזמנת של dsc config test. test לא משנה כלום, ולכן אפשר להפריד זיהוי מתיקון. קודם מאוטמטים רק זיהוי, ותיקון ב-set עושים אחרי שבדקים את ההפרש.

מחזור התפעול של ניהול תצורה שמתחיל מ-Gitconfiguration documents שנשמרים במאגר Git עוברים סקירה ב-pull request לפני ההחלה, הרצות test תקופתיות מ-Task Scheduler או CI מזהות drift, ואחרי בדיקת ההפרש המחזור חוזר לתיקון או לעדכון התצורהזוהה driftהתצורה נכונההמציאות נכונהמאגר Git (configuration documents)שינויים נסקרים ב-pull requestמחילים עם dsc config setהרצה מתוזמנת: dsc config testבודקים את ההפרש ומחליטים איך לטפלמתקנים עם set

איור 11: סוקרים את ההצהרה ומחילים אותה, ומזהים הפרש ב-test תקופתי. האם לתקן או לעדכן את ההצהרה מחליטים לפי התוכן.

drift אינו תמיד טעות. אם השינוי היה נחוץ בשטח, לא מחזירים את המכונה אלא מעדכנים את ה-configuration document, סוקרים וממזגים. אם ההצהרה נכונה, מתקנים ב-set. בשני המקרים המשמעת זהה: מקור האמת נשאר בתוך Git.

7.2. מבחינים בין “לא הצלחנו לבדוק” לבין “יש סטייה”

בהרצה מתוזמנת חשוב לא לדווח הצלחה רק כי הפקודה הופעלה. הדוגמה הבאה מבחינה בין כשל הרצה של DSC, שגיאת בדיקה בחלק מה-resources, ו-drift, ומסיימת ב-non-zero בכל אחד מהם.

# להרצה מתוזמנת: מבחינים בין כשל של test עצמו, שגיאות לפי resource, ו-drift, ומסיימים ב-non-zero לכולם
$json = dsc config test --file C:\config\standard-pc.dsc.config.yaml
if ($LASTEXITCODE -ne 0 -or -not $json) {
    Write-Error "ההרצה של dsc config test עצמה נכשלה (קוד יציאה: $LASTEXITCODE)"
    exit 2
}
$result = $json | ConvertFrom-Json
if ($result.hadErrors) {
    # אימות המסמך נכשל או ש-resource כלשהו יצא ב-non-zero. הבדיקה לא הושלמה, לכן לא מדווחים healthy
    Write-Error "בדיקת חלק מה-resources הסתיימה בשגיאות. בודקים את messages"
    exit 2
}
if ($result.results.result.inDesiredState -contains $false) {
    Write-Error "זוהה configuration drift"
    exit 1
}
מבחינים בין כשל בדיקה תקופתית לבין driftבדוגמת הבדיקה התקופתית בודקים את קוד היציאה ואת הפלט של DSC, אחר כך בודקים שגיאות בדיקה ב-hadErrors, ואם inDesiredState בתוצאה הוא false מדווחים driftכןלאכןלאכןלאקוד היציאה והפלט של DSCההרצה נכשלה או אין פלט?כשל בדיקה (יציאה 2)hadErrors?inDesiredState הוא false?זוהה drift (יציאה 1)בבדיקה הזו אין הפרש

איור 12: לא מדווחים על שגיאת בדיקה כאילו “אין הפרש”. drift הוא תוצאה שבה הבדיקה הושלמה והמצב לא תואם.

הדוגמה הזו היא הצורה הבסיסית של תצורה שמנה ישירות, כמו בפרק 5, resource instances רגילים. לפני שמכניסים לניטור, מאשרים את צורת התוצאה ואת הטיפול בשגיאות מול התצורה וה-resources שאימצתם. כשל אימות מסמך או שגיאת resource ש-hadErrors מסמן אסור לסווג כמצב תקין.

7.3. את תשתית ההרצה המתוזמנת בוחרים לפי איך מנהלים את המכונה ואת הארגון

ב-DSC v3 אין LCM, ולכן מתי ומי מפעיל test מחליטים בנפרד. בלקוחות אפשר להשתמש ב-Task Scheduler, ובציי שרתים ב-CI runners. תכנון הרצה unattended מכוסה במאמר נפרד.

בארגונים שריכזו את הניהול ב-Azure, Machine Configuration הוא המעטפת המנוהלת שעושה audit ומחילה הגדרות OS על Azure VM, ודרך Azure Arc גם על שרתים on-premises.12 בוחרים אם להריץ את הפקודה המקומית לפי לוח זמנים, או להעלות לשכבת ניהול גבוהה יותר.

8. מה לבדוק לפני ההחלה — הרשאות הרצה, secrets ואמינות

8.1. מפרידים הגדרות משתמש מהגדרות מכונה כבר בשלב התצורה

set שנוגע לכל המכונה, כמו HKLM או Windows features, דורש elevation. גם שימוש ב-Windows PowerShell PSDSC resources דרך adapter מניח הרצה כ-administrator.7

אם מפרידים הגדרות לפי משתמש מהגדרות לפי מכונה כבר ב-configuration document, קל יותר לתכנן את ה-execution context. לא מספיק שהרצה אינטראקטיבית עבדה; מאשרים גם את המשתמש ואת ההרשאות כשזה רץ מ-Task Scheduler וכדומה.

מפרידים את ה-execution context לפי יעד התצורהמפרידים הגדרות לפי משתמש והגדרות לפי מכונה ב-configuration document, מאשרים את המשתמש היעד ואת ההרשאות הנדרשות, ואז מעבירים להרצה אינטראקטיבית או להרצה מתוזמנתההגדרות שרוצים לנהלתצורה לפי משתמשתצורה לפי מכונהמאשרים משתמש יעד והרשאותהרצה אינטראקטיבית או מתוזמנת

איור 13: לא מפיצים YAML באותו אופן לכולם בלי להחליט גם באיזה משתמש ובאילו הרשאות מחילים את התצורה.

8.2. לא מכניסים secrets ל-Git, ובודקים גם את ה-resources שאליהם מפנים

configuration document הוא נתונים שנכנסים ל-Git. סיסמאות ומפתחות API לא נכתבים ישירות; עושים parameterization ומעבירים בזמן הריצה. הפרמטרים בפרק 5 הם דוגמה להפרדת הבדלי סביבה, אבל גם ניתוק secrets מגוף התצורה חשוב.

קבצי .winget ו-configuration documents שהתקבלו ממאגר ציבורי קוראים לפני שמריצים. בודקים לא רק את תוכן הקובץ, אלא גם אם אפשר לסמוך על ה-resources שאליהם הוא מפנה. ל-configuration document יש כוח לשנות את המערכת דרך resources. זו חובה תפעולית שהתיעוד הרשמי מזהיר עליה במפורש.8

9. סיכום — מקומץ הגדרות בונים מקור אמת בר-הרצה

אם מתחילים עכשיו IaC הצהרתי ל-Windows, זה Microsoft DSC v3 (dsc.exe). אחרי שמבחינים בין ארבעת קווי ה-DSC, קודם צופים עם get ו-test בודדים, ואז מאחדים לתצורה ב-YAML/JSON. בהחלה שומרים על הסדר test, what-if, set, get, ומפרידים הכרעה, תחזית, החלה ואישור.54

אפשר להחיל שוב ושוב כי כותבים “מצב רצוי” ולא “צעדים”, ו-DSC וה-resources לוקחים על עצמם את ההשוואה ואת ההחלה הנדרשת. PSDSC resources קיימים עושים reuse דרך adapters, ונכסי WinGet מתחברים אחרי שמעבירים את הפורמט לסכמת v3.31011

בתפעול מתמשך יוצאים מכך של-v3 עצמו אין LCM. מקור האמת של התצורה יושב ב-Git, מזהים drift ב-test תקופתי, מתקנים אם התצורה נכונה, ומעדכנים את התצורה אם המציאות נכונה.1 הרשאות הרצה, secrets ואמינות היעד שאליו מפנים מתכננים יחד עם סדר ההחלה.

אין צורך לשאת סטייה בין runbook למציאות בלי יכולת למצוא אותה. מתחילים בכך שכותבים קומץ הגדרות של המכונה שלכם ל-configuration document ומריצים test, והופכים את הסטייה להפרש שאפשר לזהות.

מאמרים קשורים

תחומי ייעוץ קשורים

KomuraSoft LLC מסייעת במעבר של תצורת לקוחות ושרתים של Windows לניהול הצהרתי, באוטומציה של kitting ושל סביבת סטנדרט פנימית, ובהפיכת runbooks שתלויים באדם אחד לבר-הרצה.

קישורים

  1. Microsoft Learn, Microsoft Desired State Configuration overview. על כך ש-DSC v3 הוא פלטפורמת תצורה הצהרתית ואידמפוטנטית שרצה על Linux, macOS ו-Windows בלי תלות ב-PowerShell; על כך שהוא לא כולל LCM (Local Configuration Manager), מופעל כפקודה, ואינו נשאר תושב כשירות; על התאימות שלו ל-PSDSC resources דרך adapter resources; על התקנה ממקור Microsoft Store של winget (מזהה stable 9NVTPZWRC6KQ) או מ-GitHub releases; ועל כך ש-WinGet, Microsoft Dev Box ו-Azure Machine Configuration הם שותפים מוקדמים בשכבת ה-orchestration.  2 3 4 5 6 7

  2. Microsoft Learn, DSC configuration documents. על כך ש-configuration document הוא קובץ נתוני YAML/JSON שמצהיר על המצב הרצוי בעוד “איך מגדירים” הוא האחריות של ה-resource; על כך שהמאפיינים הנדרשים הם $schema ו-resources, ולכל instance יש name, type ו-properties; על כך ש-parameters ו-variables מצמצמים הגדרות כפולות ומבטאים ערכים דינמיים; על כך שמסמכים מעובדים בארבע הפעולות dsc config get/test/set/export; ועל תמיכה בתת-קבוצה של פונקציות הביטוי של תבניות ARM.  2 3 4

  3. Microsoft Learn, dsc resource set. על כך ש-dsc config set תמיד בודק כל instance (עם מימוש test של ה-resource או test סינתטי) וקורא ל-set רק ל-instances שאינם במצב הרצוי; על כך שלעומת זאת dsc resource set הבודד תמיד קורא ל-set, וכל pre-test תלוי ב-set.implementsPretest במניפסט של ה-resource; ועל כך של-resources בלי implementsPretest מומלץ להריץ dsc resource test לפני set.  2 3 4

  4. Microsoft Learn, dsc config set. על כך ש-dsc config set היא הפקודה שמחילה על המערכת את המצב הרצוי ב-configuration document, ועל כך שאפשרות –what-if מציגה תחזית של “מה היה משתנה, ואיך, אילו זה היה רץ” בלי לבצע שינויים בפועל. גם, מתוך DSC Resource manifest whatIf property, על כך שהמידע הזה מסונתז מתוצאת test כש-resource לא מממש התנהגות what-if ישירות.  2 3 4

  5. Microsoft Learn, Desired State Configuration (DSC) Overview. על כך של-DSC יש ארבע גרסאות (PSDSC 1.1 שמובנה ב-Windows PowerShell 5.1, PSDSC 2.0 ל-PowerShell 7, PSDSC 3.0 preview שמשמש לתמיכת Linux של Azure Machine Configuration, ו-Microsoft DSC 3.0 כמוצר עצמאי בלי תלות ב-PowerShell), ועל כך ש-Microsoft DSC 3.0 הוא באמת cross-platform ויכול להשתמש ב-PSDSC resources קיימים.  2

  6. Microsoft Learn, DSC Resources. על כך ש-resource הוא ממשק סטנדרטי ליעד תצורה, שבו כותבים “מה המצב הרצוי” בתחביר הצהרתי וה-resource לוקח על עצמו את “איך מגדירים”; על כך של-resources תמיד יש את פעולות Get ו-Test ולרובם יש גם תמיכה באכיפה דרך Set; על ציון resources בשם type מלא (owner.group.area/name); ועל כך ש-adapter resources מאפשרים שימוש ב-resources שאינם מסוג פקודה. 

  7. Microsoft Learn, Get started with DSC. על זרימת המבוא של גילוי resources, קריאה אליהם בנפרד, וניהול configuration documents; על הפעלה בודדת של Microsoft.Windows/Registry resource עם get, test ו-set; על אימות, החלה ואישור של תצורה עם dsc config test/set/get; ועל הצורך במסוף administrator כשעובדים עם Windows PowerShell PSDSC resources.  2 3

  8. Microsoft Learn, configure command (winget). על כך ש-winget configure היא הפקודה שמגדירה מכונה למצב רצוי עם קובץ WinGet Configuration; על האזהרה לסקור את תוכן הקובץ ולאמת את אמינות ה-resources המעורבים לפני ההרצה; ועל פקודות המשנה show/list/test/validate/export להצגת תוכן קובץ, למנות תצורות שהוחלו, לבדוק את המצב הנוכחי מול המצב הרצוי, לאמת קובץ, ולייצא תצורה.  2

  9. Microsoft Learn, dsc config export. על כך שפקודת המשנה export מייצרת ומחזירה configuration document שמגדיר כל instance קיים של ה-resources שמנויים במסמך הקלט שמועבר עם –file או –input; ועל כך שמסמך הקלט מוגבל ל-resources שבמניפסט שלהם יש מקטע export, וכל סוג resource מוצהר פעם אחת בלבד.  2

  10. Microsoft Learn, Microsoft.Adapter/WindowsPowerShell. על כך שה-adapter resource מאפשר ל-DSC v3 לגלות ולקרוא ל-PSDSC resources תואמי Windows PowerShell 5.1 (סקריפט, class ו-binary); על כך שהוא משתמש במודול PSDesiredStateConfiguration 1.1 המובנה; על כך שהשם הזה מחליף ב-DSC 3.2 את ה-adapter הקודם Microsoft.Windows/WindowsPowerShell; ועל שימוש ב-Microsoft.Adapter/PowerShell (לשעבר Microsoft.DSC/PowerShell) ל-resources מבוססי class ב-PowerShell 7.  2 3

  11. Microsoft Learn, WinGet Configuration file v3 schema reference. על כך שסכמת WinGet Configuration v3 משתמשת ב-DSC v3 כמעבד; על הצורך ב-WinGet 1.11 ואילך ובמעבד dscv3 (מותקן אוטומטית כחבילה נפרדת Microsoft.DesiredStateConfiguration); על ציון dscv3 ב-metadata.winget.processor.identifier וכתיבת resources ישירות בשורש המסמך; ועל כך שמדריך המרה מפורמט v2 מסופק במאגר הדוגמאות הרשמי.  2 3

  12. Microsoft Learn, Understanding Azure Machine Configuration. על כך שתכונת Machine Configuration של Azure Policy עושה audit ומגדירה הגדרות בתוך מערכת ההפעלה, באופן מנוהל, למכונות וירטואליות ב-Azure ולשרתים עם Azure Arc. 

מאמרים עדכניים עם אותן תגיות, להעמקה בנושאים קרובים.

העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.

המאמר קשור ישירות לשירותים הבאים.

שאלות נפוצות

שאלות נפוצות בפניות בנושא המאמר.

נראה שיש כמה גרסאות של DSC. באיזו להשתמש?
אם מתחילים עכשיו ניהול תצורה הצהרתי, משתמשים ב-Microsoft DSC v3 (dsc.exe). ל-DSC יש ארבעה קווים: PSDSC v1.1 שמובנה ב-Windows PowerShell 5.1, PSDSC v2 כמודול ל-PowerShell 7, PSDSC v3 (preview) שמשמש לתמיכת Linux של Azure Machine Configuration, ו-Microsoft DSC v3 שנכתב מחדש כפקודה עצמאית בלי תלות ב-PowerShell. v3 הוא cross-platform, כותב תצורה כנתוני YAML/JSON במקום סקריפטי PowerShell, ויכול לעשות reuse ל-PSDSC resources קיימים דרך adapters. בחיפוש, הוספת "DSC v3" או "dsc.exe" מקלה להפריד את התוצאות מחומר של דורות ישנים.
מה ההבדל בין DSC v3 לבין סקריפט runbook (BAT או PowerShell)?
סקריפט runbook מתאר "את הצעדים להרצה", ולכן צריך לבנות idempotency בעצמכם כדי למנוע apply כפול או שגיאות בהרצה השנייה. DSC כותב את "המצב הרצוי" כנתונים, וה-resources לוקחים על עצמם את ההשוואה למצב הנוכחי (test) ואת החלת ההפרש (set). לא משנה כמה פעמים מריצים את אותו configuration document, הוא לא נוגע בפריטים שכבר במצב הרצוי, ולכן אפשר להפיץ ולהריץ שוב בלי לדאוג למספר ההרצות. ומכיוון שהתצורה היא נתוני YAML, סקירות diff וניהול גרסאות ב-Git קלות בהרבה מאשר עם סקריפטים.
האם נכסי PowerShell DSC ו-WinGet Configuration הקיימים יתבזבזו?
לא. DSC v3 יכול לקרוא ל-PSDSC resources קיימים מבוססי class ומבוססי MOF דרך adapter resources (Microsoft.Adapter/PowerShell ו-Microsoft.Adapter/WindowsPowerShell ב-DSC 3.2 ואילך; Microsoft.DSC/PowerShell ו-Microsoft.Windows/WindowsPowerShell לפני כן). WinGet Configuration, מסכמת v3 שלו (WinGet 1.11 ואילך), משתמש ב-DSC v3 כמעבד. קבצי .winget בפורמט v2 ממשיכים לרוץ על המעבד הקודם, אבל כדי להעלות אותם למעבד DSC v3 צריך להמיר אותם לפורמט v3 לפי מדריך ההמרה הרשמי.
איך אוכפים תצורה "ברציפות" עם DSC v3?
DSC v3 עצמו הוא כלי שמופעל כפקודה; אין לו agent תושב או מנגנון תיקון אוטומטי כמו ה-LCM (Local Configuration Manager) של v1.1. אם צריך apply ו-audit מתמשכים, או שבונים זיהוי drift משלכם בהרצת dsc config test מ-Task Scheduler או מ-CI, או שמעלים את זה לשכבת orchestration כמו Azure Machine Configuration (שיכולה לכסות גם שרתים on-premises דרך Azure Arc).
מפחיד להריץ dsc config set ישר. אפשר לבדוק את ההשפעה מראש?
כן. הרצת dsc config test מראה אילו resource instances אינם במצב הרצוי, בלי לבצע שינויים. בנוסף, ל-dsc config set יש אפשרות --what-if שמציגה תחזית של "מה היה משתנה, ואיך, אילו זה היה רץ" בלי לשנות בפועל. בודקים קודם את ההפרשים עם test ועם --what-if, ומריצים set רק כשמרוצים; הסדר הזה בטוח.

פרופיל הכותב

עמוד היכרות עם כותב המאמר.

Go Komura

מנהל KomuraSoft LLC

מתמחה בפיתוח תוכנה עבור Windows, ייעוץ טכני וחקירת תקלות, בעיקר בפרויקטים עם מערכות קיימות ובאגים שקשה לשחזר.

קישורים ציבוריים

חזרה לבלוג