실제 세계 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, HardwareCategoryInfo 속성이 포함됩니다.
  • 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 속성을 가진 hashtable을 반환하지만 해당 하드웨어 카테고리가 정의되어 있습니다.

원격 지원을 위한 세션 매개변수 추가

스크립트를 수십 대 또는 수백 대의 컴퓨터에 실행해야 하는 경우를 상상해보십시오. 각 함수가 수동으로 컴퓨터 이름을 지정해야 한다면 번거로우며 오류가 발생할 수 있습니다. 다행히 PowerShell Remoting은 해결책을 제공합니다.

ComputerName 매개변수 대신 PowerShell Remoting을 활용하기 위해 Session 매개변수를 사용하십시오:

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
}

이 매개변수는 여러 시스템으로 확장할 때 유연성을 보장합니다.

세션 매개변수는 원격 컴퓨터에서 명령을 실행하기 위해 PowerShell Remoting을 사용하도록 설계되었습니다. 다음은 이를 강력하게 만드는 요소입니다:

  • 이는 PSSession 개체(특히 System.Management.Automation.Runspaces.PSSession 유형)를 수락하는 필수 매개변수로 정의됩니다.
  • 세션 매개변수는 $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

각 함수는 세션에서 컴퓨터 이름, 특정 하드웨어 범주 및 정보 필드(현재는 null이지만 실제 하드웨어 정보를 보유할 수 있도록 설계됨)를 포함하는 해시 테이블을 반환합니다.

결론

이 기사에서는 고유한 도전 과제를 해결하는 데 필수적인 PowerShell 모듈을 만드는 방법에 대해 배웠습니다. 사용 가능한 모듈로 해결할 수 없는 독특한 설정 또는 프로세스에 대해 사용자 지정 모듈이 환경 내에서 게임 체인저가 될 수 있는 방법을 탐구했습니다.

이것은 ComputerInventory 모듈과의 여정의 시작에 불과합니다. 다가오는 블로그 게시물에서는 실제 하드웨어 정보 수집 기능, 오류 처리 및 고급 원격 관리 기능을 추가하여 이 기반을 확장할 것입니다.

시스템 관리자를 위한 강력한 도구로 이 기본 프레임워크를 변환하는 과정을 지켜봐 주세요!

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