Criando um Módulo do PowerShell no Mundo Real: Funções de Escoramento

Está com dificuldades para encontrar o módulo PowerShell perfeito para o seu cenário único? Com milhares de módulos disponíveis, pode parecer que você deve apenas se contentar com o que está disponível. Bem, isso pode deixar sua solução incompleta ou ineficiente. Por que não começar a criar módulos em vez disso?

Este guia irá guiá-lo na criação de módulos para construir soluções robustas e reutilizáveis, adaptadas às suas necessidades.

Transforme seus scripts em blocos de construção poderosos que você pode reutilizar em diferentes projetos!

Criando um Módulo de Inventário de Computadores

Neste guia, criaremos um módulo PowerShell para coletar informações de hardware de computadores. Este módulo ajudará os administradores de sistema a coletar e relatar informações sobre memória, armazenamento e detalhes do processador em vários sistemas.

Nosso módulo incluirá:

  • Funções para coletar informações específicas de hardware
  • Suporte a sistemas remotos usando sessões do PowerShell
  • Formato de saída padronizado para relatórios consistentes

Este exemplo prático demonstra conceitos essenciais de desenvolvimento de módulos ao criar uma ferramenta útil para administração de sistemas.

Configurando o Módulo PowerShell

Gerenciar seus scripts em vários sistemas pode rapidamente se tornar caótico. Mas quando seus fluxos de trabalho se tornam uma batalha difícil, os módulos PowerShell são úteis. Um módulo é uma maneira estruturada de agrupar e reutilizar scripts para economizar tempo e reduzir erros.

Vamos combinar conceitos-chave para construir um módulo PowerShell.

Comece criando o diretório do módulo e definindo o próprio módulo para organizar seu trabalho.

## 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 ''

O comando Set-Content cria um módulo chamado ComputerInventory no caminho de todos os usuários. Este local é escolhido porque torna o módulo acessível a qualquer pessoa que faça login na máquina, o que é crucial em ambientes corporativos onde vários usuários precisam de acesso à mesma funcionalidade do PowerShell. Ao contrário de locais específicos do usuário, esse caminho centralizado garante disponibilidade consistente do módulo e gerenciamento mais fácil em todo o sistema.

Verifique a disponibilidade do módulo:

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

Embora atualmente seja um shell, isso confirma que ele será carregado adequadamente mais tarde.

Funções de Estruturação

Um módulo bem estruturado é crítico, mas o que está dentro o torna realmente útil. Evite perder tempo descobrindo o que cada parte faz em vez de ser produtivo criando uma estrutura para as funções do seu módulo.

Abra o módulo em um editor de texto como o VS Code e, em seguida, estruture as funções.

Comece criando funções de espaço reservado com nomes descritivos.

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

}

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

}

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

}

Os nomes das funções seguem uma convenção de nomenclatura consistente de verbo-substantivo.

Os nomes das funções no PowerShell seguem uma convenção de nomenclatura de verbo-substantivo, que é um padrão de nomenclatura padronizado. Neste caso, as funções são nomeadas:

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

Cada nome de função começa com o verbo “Get” (indicando que recupera informações) seguido por um substantivo que descreve quais informações ele recupera (Memória, Armazenamento ou Processador).

Essa convenção de nomenclatura é importante no PowerShell porque torna as funções previsíveis e mais fáceis de entender – os usuários podem rapidamente entender o que uma função faz apenas olhando para seu nome.

Verifique sua existência executando o seguinte:

Get-Command -Module ComputerInventory

Quando você executa o comando Get-Command -Module ComputerInventory, você verá uma saída semelhante a esta:

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

Este comando lista todas as funções disponíveis no módulo ComputerInventory, que inclui as três funções que criamos: Get-MemoryInfo, Get-StorageInfo e Get-ProcessorInfo.

Neste estágio, o módulo inclui estruturas de função. Vamos aprimorar essas funções definindo uma saída consistente usando objetos personalizados.

Saída Padronizada com Objetos Personalizados

Saídas inconsistentes entre scripts podem transformar uma tarefa simples em um pesadelo de análise de dados e solução de problemas. No desenvolvimento profissional de PowerShell, garantir saídas consistentes é uma pedra angular da scriptagem eficaz.

Padronizar a saída com objetos personalizados ajuda a manter a consistência entre as funções.

No script a seguir:

  • Os objetos personalizados incluem as propriedades ComputerName, HardwareCategory e Info.
  • A propriedade HardwareCategory agrupa tipos de hardware semelhantes, e ComputerName é projetada para escalabilidade em múltiplos computadores.
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
}

Primeiro, vamos reimportar o módulo para garantir que temos a versão mais recente:

Import-Module ComputerInventory -Force

Agora você pode executar as funções para ver sua saída:

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

Cada função retorna um hashtable com ComputerName vazio e propriedades de Informações, mas com suas respectivas categorias de hardware definidas.

Adicionando um Parâmetro de Sessão para Suporte Remoto

Imagine precisar executar seus scripts em dezenas ou até centenas de computadores. Se cada função exigisse a especificação manual de um nome de computador, seria trabalhoso e propenso a erros. Felizmente, o PowerShell Remoting fornece uma solução.

Em vez de um parâmetro ComputerName, use um parâmetro Sessão para aproveitar o 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
}

Esse parâmetro garante flexibilidade ao escalar para vários sistemas.

O parâmetro de Sessão é projetado para usar o PowerShell Remoting para executar comandos em computadores remotos. Aqui está o que o torna poderoso:

  • É definido como um parâmetro obrigatório que aceita um objeto PSSession (especificamente do tipo System.Management.Automation.Runspaces.PSSession)
  • O parâmetro de Sessão fornece automaticamente o nome do computador por meio de $Session.ComputerName, que é preenchido no objeto de saída

Essa abordagem oferece várias vantagens:

  • Permite uma escalabilidade eficiente ao trabalhar com vários sistemas
  • Em vez de criar novas conexões para cada comando, você pode reutilizar a mesma sessão para múltiplas operações, o que é mais eficiente do que estabelecer conexões individuais para cada chamada de função
  • Você pode testar as funções criando uma única PSSession e utilizando-a em todas as funções de inventário, conforme mostrado no exemplo em que uma sessão de teste é criada com: $testSession = New-PSSession -ComputerName SRV2

Salve e reimporte o módulo:

ipmo ComputerInventory -Force

Testando as Funções

Como garantir que um módulo funcione após construí-lo? Testar é essencial para confirmar que as funções do seu módulo se comportam conforme o esperado e retornam dados precisos. Pular esta etapa poderia resultar em surpresas em ambientes de produção.

Estabeleça uma sessão remota e teste o módulo:

$testSession = New-PSSession -ComputerName SRV2

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

Cada função deve retornar um objeto com as propriedades esperadas e o nome do computador correto. Essas funções formam a base de uma ferramenta de inventário robusta.

Com base no código mostrado, ao testar essas funções com uma sessão remota, a saída seria algo assim:

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

Cada função retorna um hashtable contendo o nome do computador (da sessão), a categoria de hardware específica e um campo Info (atualmente nulo, mas projetado para conter as informações reais de hardware).

Conclusão

Neste artigo, você aprendeu por que criar seus próprios módulos do PowerShell é essencial para lidar com desafios únicos que nenhum módulo pronto pode resolver. Exploramos como os módulos personalizados podem ser um diferencial para configurações ou processos especializados dentro do seu ambiente.

Este é apenas o início da nossa jornada com o módulo ComputerInventory. Nos próximos posts do blog, vamos expandir essa base adicionando capacidades reais de coleta de informações de hardware, tratamento de erros e recursos avançados de gerenciamento remoto.

Fique ligado enquanto transformamos este framework básico em uma ferramenta poderosa para administradores de sistemas!

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