יצירת מודול PowerShell בעולם האמיתי: פונקציות פיגומ

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

מדריך זה ידריך אותך ביצירת מודולים לבניית פתרונות עמידים וניתנים לשימוש חוזר המותאמים לצרכיך.

הפוך את הסקריפטים שלך לבלוקים רבי עוצמה שניתן להשתמש בהם שוב בפרויקטים שונים!

בניית מודול למלאי מחשבים

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

המודול שלנו יכלול:

  • פונקציות לאיסוף מידע חומרתי ספציפי
  • תמיכה במערכות מרוחקות באמצעות סשנים של PowerShell
  • פורמט פלט סטנדרטי לדיווח עקבי

דוגמה מעשית זו מדגימה מושגי פיתוח מודולים חיוניים תוך יצירת כלי שימושי לניהול מערכות.

הגדרת מודול ה-PowerShell

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

בואו נשלב מושגים מרכזיים כדי לבנות מודול PowerShell.

התחל ביצירת ספריית המודול והגדרת המודול עצמו כדי לארגן את העבודה שלך.

## Create the module directory in the all-user location
mkdir 'C:\Program Files\PowerShell\Modules\ComputerInventory'

## Create the module to hold the module functions
Set-Content -Path 'C:\Program Files\PowerShell\Modules\ComputerInventory\ComputerInventory.psm1' -Value ''

הפקודה Set-Content יוצרת מודול בשם ComputerInventory בנתיב כלל-המשתמשים. המיקום נבחר משום שהוא מבטיח גישה למודול לכל משתמש שנכנס למחשב, מה שחיוני בסביבות תעשייתיות שבהן משתמשים מרביים צריכים גישה לאותה פונקציונליות של PowerShell. להבדל מנתיבים המיועדים למשתמש ספציפי, הנתיב המרכזי הזה מבטיח זמינות יציבה של המודול וניהול נוח יותר בכל המערכת.

וודא את זמינות המודול:

## The module is already showing up as available
Get-Module ComputerInventory -ListAvailable

אף על פי שזה כרגע כמיר בקוד, זה מאשר שהוא יטען בצורה מתאימה מאוחר יותר.

יצירת פונקציות תשתיות

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

פתח את המודול בעורך טקסט כמו VS Code, ואז צייר פונקציות בתשתית.

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

function Get-MemoryInfo {
    [CmdletBinding()]
    param()

}

function Get-StorageInfo {
    [CmdletBinding()]
    param()

}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param()

}

שמות הפונקציות עוקבים אחר תקנון קבוע של פעולה-עצם.

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

  • Get-MemoryInfo
  • Get-StorageInfo
  • Get-ProcessorInfo

כל שם של פונקציה מתחיל בפועל "Get" (מציין שהיא מחזירה מידע) ואחריו שם שמתאר איזה מידע היא מחזירה (זיכרון, אחסון או עיבוד).

הצטיינות בשמות זו חשובה ב-PowerShell מכיוון שהיא עושה את הפונקציות צפויות ונוחות יותר להבנה – המשתמשים יכולים להבין מה עושה פונקציה רק בעזרת הסתכלות על שמה.

וודא את קיומן על ידי הרצת הפקודה הבאה:

Get-Command -Module ComputerInventory

כאשר אתה מריץ את הפקודה Get-Command -Module ComputerInventory, תראה פלט דומה לזה:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-MemoryInfo                                     1.0.0      ComputerInventory
Function        Get-ProcessorInfo                                  1.0.0      ComputerInventory
Function        Get-StorageInfo                                    1.0.0      ComputerInventory

הפקודה מפרטת את כל הפונקציות הזמינות במודול ComputerInventory, שכוללות את שלוש הפונקציות שיצרנו: Get-MemoryInfo, Get-StorageInfo ו-Get-ProcessorInfo.

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

פלט מותאם תקני עם אובייקטים מותאמים

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

תקינת פלט עם אובייקטים מותאמים עוזרת לשמור על עקביות בין הפונקציות.

בסקריפט הבא:

  • האובייקטים המותאמים כוללים את המאפיינים ComputerName, HardwareCategory ו-Info.
  • המאפיין HardwareCategory מקבץ סוגי החומרות הדומים, ו-ComputerName מיועד לקיומיות רבת מחשבים.
function Get-MemoryInfo {
    [CmdletBinding()]
    param()

    $outObject = @{
        'ComputerName'      = ''
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $outObject
}

function Get-StorageInfo {
    [CmdletBinding()]
    param()

    $outObject = @{
        'ComputerName'      = ''
        'HardwareCategory'  = 'Storage'
        'Info'              = $null
    }

    $outObject
}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param()

    $outObject = @{
        'ComputerName'      = ''
        'HardwareCategory'  = 'Processor'
        'Info'              = $null
    }

    $outObject
}

ראשית, בוא ניבא את המודול שנוודא שיש לנו את הגרסה האחרונה:

Import-Module ComputerInventory -Force

עכשיו תוכל להפעיל את הפונקציות כדי לראות את הפלט שלהן:

PS> Get-MemoryInfo
Name                           Value
----                           -----
Info                           
HardwareCategory              Memory
ComputerName                  

PS> Get-StorageInfo
Name                           Value
----                           -----
Info                           
HardwareCategory              Storage
ComputerName                  

PS> Get-ProcessorInfo
Name                           Value
----                           -----
Info                           
HardwareCategory              Processor
ComputerName

כל פונקציה מחזירה טבלת גיבוי עם ComputerName ריק ומאפייני Info, אך עם קטגוריות החומרה הרלוונטיות.

הוספת פרמטר להפעלה מרחוק לתמיכה רחוקה

תדמיינו את עצמכם זקוקים להריץ את התסריטים שלכם על עשרות או אפילו מאות מחשבים. אם כל פונקציה דורשת ציון ידני של שם מחשב, זה יהיה מסורבל ונוטה לשגיאות. מבוא PowerShell Remoting מספק פתרון.

במקום פרמטר ComputerName, השתמש בפרמטר Session כדי לנצל את PowerShell Remoting:

function Get-MemoryInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $outObject
}

function Get-StorageInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Storage'
        'Info'              = $null
    }

    $outObject
}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Processor'
        'Info'              = $null
    }

    $outObject
}

פרמטר זה מבטיח גמישות בקניין למערכות מרובות.

הפרמטר Session עוצב לשימוש ב- PowerShell Remoting לביצוע פקודות על מחשבים מרוחקים. הנה מה שהופך אותו לכוחי:

  • הוא מוגדר כפרמטר חובה שמקבל אובייקט PSSession (במיוחד מסוג System.Management.Automation.Runspaces.PSSession)
  • הפרמטר Session מספק באופן אוטומטי את שם המחשב דרך $Session.ComputerName, שמתמלא באובייקט הפלט

הגישה הזו מציעה מספר יתרונות:

  • זה מאפשר קניין יעיל בעבודה עם מערכות מרובות
  • במקום ליצור חיבורים חדשים לכל פקודה, ניתן להשתמש שוב באותה הפעלה לפעולות מרובות, שהוא יעיל יותר מהקמת חיבורים יחידים לכל קריאת פונקציה
  • ניתן לבדוק את הפונקציות על ידי יצירת PSSession יחידה ושימוש בה בכל הפונקציות במלאי, כפי שמוצג בדוגמה בה אשר נוצרה סשן בדיקה עם: $testSession = New-PSSession -ComputerName SRV2

שמור וטען מחדש את המודול:

ipmo ComputerInventory -Force

בדיקת הפונקציות

כיצד אפשר לוודא שמודול עובד לאחר בנייתו? בדיקה היא חיונית כדי לאשר שהפונקציות של המודול ביצעו כצפוי והחזירו נתונים מדויקים. דילוג על שלב זה עשוי להוביל להפתעות בסביבות הייצור.

הקמת סשן מרחוק ובדיקת המודול:

$testSession = New-PSSession -ComputerName SRV2

Get-MemoryInfo -Session $testSession
Get-StorageInfo -Session $testSession
Get-ProcessorInfo -Session $testSession

כל פונקציה צריכה להחזיר אובייקט עם המאפיינים הצפויים ושם המחשב הנכון. אלו הפונקציות מהוות את בסיס כלי מלאי חזק.

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

PS> $testSession = New-PSSession -ComputerName SRV2
PS> Get-MemoryInfo -Session $testSession
Name                           Value
----                           -----
Info                           
HardwareCategory              Memory
ComputerName                  SRV2

PS> Get-StorageInfo -Session $testSession
Name                           Value
----                           -----
Info                           
HardwareCategory              Storage
ComputerName                  SRV2

PS> Get-ProcessorInfo -Session $testSession
Name                           Value
----                           -----
Info                           
HardwareCategory              Processor
ComputerName                  SRV2

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

מסקנה

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

זוהי רק תחילת המסע שלנו עם מודול ComputerInventory. בפוסטים הבאים בבלוג, נרחיב את הבסיס הזה על ידי הוספת יכולות לאיסוף מידע על חומרה אמיתית, טיפול בשגיאות ותכונות ניהול מרחוק מתקדמות.

הישארו איתנו כשנמיר את המסגרת הבסיסית הזו לכלי עוצמתי למנהלי מערכת!

Source:
https://adamtheautomator.com/powershell-module-functions/