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
eInfo
. - A propriedade
HardwareCategory
agrupa tipos de hardware semelhantes, eComputerName
é 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/