DevSecOps

18 mai, 2017

Introdução ao Powershell

Publicidade
<#
.Synopsis
   Short description
.DESCRIPTION
   Long description
.EXAMPLE
   Example of how to use this cmdlet
.EXAMPLE
   Another example of how to use this cmdlet
#>
function Verb-Noun{
[CmdletBinding()]
[Alias()]
[OutputType([int])]
Param(
    # Param1 help description
    [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)]$Param1,
 
    # Param2 help description
    [int]$Param2
)
    Begin{
            #Make parameters Valid
    }
    Process{
            #Forge Knives and stuff
    }
    End{
            #Go home and have a beer
    }
}

Esse aí é o Powershell, para quem nunca viu! =)

Esse é o artigo que dá início a uma pequena série que aborda o Powershell e seu ecossistema. Mais à frente, vou aprofundar seus módulos, funcionalidades e dar alguns exemplos reais. Por hora, somente um overview. Esse artigo tem diversos links! Recomendo que os acesse ao longo da leitura para melhor entendimento. Inclusive, acho que você já deixou passar um que está ali em cima… A série será dividida em quatro módulos.

Este artigo compreende o primeiro “módulo”; uma introdução à ferramenta numa forma mais “leve” e com um pouco de história embutida. Os outros três módulos descrevem mais profundamente como escrever o código em Powershell. A ordem segue uma metodologia que normalmente uso ao codificar soluções/ferramenta, seja em Powershell ou em qualquer outra linguagem. A leitura é densa, mas procurei deixar tudo bem demonstrado e explicado para que você possa aproveitar ao máximo o passeio.

Para aqueles que já têm alguma (mesmo que breve) experiência em Powershell ou na plataforma .NET, ler separadamente os módulos é uma opção palpável. Cada um deles abrange o seu “nicho”, e somente ele! Ainda assim, recomendo que leia todo este módulo acessando os links ao decorrer de sua leitura, dessa forma o entendimento será mais claro para quem nunca teve contato e deixarão mais fortes as bases de quem já conhece o Framework.

Também gosto de distribuir alguns “easter eggs” pelo caminho, assim a experiência de leitura fica mais divertida.

Primeiro, um pequeno trecho de história… O que seria de um Ferreiro lvl 13 (Str 12; Sta 6; Int 10; Res 9; Cha 12; Wis 10; Wil 5; Ft 7), se ele não contasse as histórias de suas Quests e experiências, além das magias que aprendeu a realizar com Powershell desde muitas luas atrás?

Por “um pouco de história”, gostaria de mostrar brevemente o que senti ao ter contato com Powershell, o porquê este desempenhou uma função importante em minha carreira e o que ele pode fazer por você.

Sem dúvida, Powershell é hoje minha escolha clara para resolver quaisquer problemas que eu encontro pelo caminho (ando tendo um affair com Python, mas é recente). Mas por quê? Bom, o Powershell é uma linguagem extremamente flexível, inteligível e modular, sem deixar de ser simples e rápida/leve. Sem dúvida, é uma das ferramentas mais fortes que a filha do titio Gates (Binomial Microsoft CORP ou Master Race {o choro é livre}) criou até hoje e uma das que mais cresceu desde seu lançamento.

Agora que você já conhece o Powershell, vamos chamá-lo carinhosamente pelo seu nick “Posh“ ou pela sigla “PS“, que na definição do Wikipedia pode ser “o script que você escreve depois” {Post scriptum}, “PostScript”, “o código TLD (ccTLD) na Internet para a Palestina” ou o objeto favorito do Yudi.

Voltada para a montagem de scripts poderosos e com os recursos da plataforma .NET, ainda permite que o desenvolvedor entregue rapidamente soluções complexas com poucas linhas de código, inclusive aquelas que necessitem resolver paradigmas de orientação. Abaixo, um exemplo CtrlJ de “classe simples”.

class TypeName{
   # Property with validate set
   [ValidateSet("val1", "Val2")][string] $P1
 
   # Static property
   static [hashtable] $P2
 
   # Hidden property does not show as result of Get-Member
   hidden [int] $P3
 
   # Constructor
   TypeName ([string] $s){
       $this.P1 = $s       
   }
 
   # Static method
   static [void] MemberMethod1([hashtable] $h){
       [TypeName]::P2 = $h
   }
 
   # Instance method
   [int] MemberMethod2([int] $i){
       $this.P3 = $i
       return $this.P3
   }
}

Todo e qualquer procedimento, função e aproach feito em Powershell segue padrões de nomenclatura (titio Gates e seus padrões…) e parametrização descritos aqui. Funciona basicamente assim: você precisa de uma função que copia um item? O nome dela é simples: Copy-Item. Quer uma que apague um item? Remove-Item. Quer uma que importe um arquivo CSV? Import-CSV. E assim vai… Essa estrutura “Verb-Noun” faz com que qualquer pessoa, até mesmo as com conhecimento muito breve em programação, esteja prontamente apta a interpretar um código/script escrito em Posh e compreenda facilmente o que ele faz.

A comunidade segue fortemente esses conceitos, então, temos um crescimento muito sólido e controlado.

Lembra daquela pesquisa no ss64 sobre qual o significado/função do comando Lorem_ipsum? Lembra aquela dúvida na sequência dos atributos? Se é com hífen simples ou duplo, se é maiúsculo ou minúsculo, se está na ordem ou combinação correta?

Ou chamadas de funções escritas desta forma: :(){:|:&};:

Lembra aquela vez que você executou um comando e ele fez uma coisa que você não queria, erro justamente causado por uma ou a combinação das dúvidas listadas acima?

Aqui não! Leia o comando e saberá o que ele faz!

Isso faz com que a curva de aprendizado em Posh seja muito acelerada! Rapidamente, o jovem guerreiro viking está apto a desfrutar as batalhas acompanhado de seu fiel machado. Digo, rapidamente o desenvolvedor consegue aproveitar amplamente as funcionalidades e facilidades que o Powershell pode entregar.

Com uma base sólida nas libs .NET, o Posh vem ao ecossistema MS para ser a ferramenta base para automação e gestão de configuração da plataforma Microsoft.

Notou algum ressalte ao nosso mundo de DevOps no texto acima?

Pois é, o Posh é um framework para automação de tarefas e gerenciamento de configuração, que fornece total controle aos COM, WMI e CIMs para os Linux Peasants.

Uma diferença legal entre o Posh e as demais “command-line interfaces” é que ele foi feito para manusear objetos. Toda informação é um encapsulamento de propriedades/métodos/etc que você pode usar. Praticamente nunca é somente texto sendo exibido na tela.

Temos também o recente DSC para realizar o “Desired State Configuration”, com forte base nas estruturas Script Module, Binary Module e Module Manifest. Ainda temos notórias contribuições da comunidade Posh-Ssh e um amplo material disponível numa linguagem fácil de entender e escrita de forma muito amigável techNet pelo meu querido Ed.

Como o Powershell é uma linguagem extremamente bem descrita, fica muito fácil encontrar ajuda em sites especializados Copy-Item, com exemplos de todos os casos de uso, e em uma comunidade forte Developer Network. Esses meios nunca deixaram de sanar qualquer dúvida que tive até hoje, e olha que já foram muitas.

Pouco tempo atrás, o Posh se tornou multiplataforma e Open Source (ago/2016) e junto a isso, parcerias entre a Microsoft e a RedHat.

Para trabalhar com Powershell, basicamente o que você precisa ter é seu Windows atualizado (ou Linux), pois todas suas dependências já estão nativas no SO. Você vai se deparar com a ISE ou com a Console. Caso tenha curiosidade, esses são os system-requirements.

Eventualmente, também gosto de usar o Visual Studio Code para meus scripts, porém sempre prefiro trabalhar com ferramentas nativas e sem dependências (não gosto de depender/baixar/configurar alguma coisa para poder trabalhar; e isso tem muito a ver com agilidade), por isso me mantenho só na ISE e Console. Até porque, elas sinceramente funcionam muito bem. A Intellisense é rápida, clara e não há inconsistências de funcionamento. Importar (e criar) módulos é bem fácil (te dou 5 segundos para pensar qual será o conjunto de “Verb-Noun” que IMPORTA um MÓDULO no Powershell – e aposto o último pedaço da pizza que você acerta).

Por fim, após editar um script na ISE, sua execução e depuração é bem rápida e facilitada.

Aqui termina o “um pouco de história”. Vamos sujar um pouco as mãos!

Vamos seguir agora a metodologia que citei lá em cima. Existem “dois grandes mundos” em que o Posh ajuda muito: o primeiro é como uma ferramenta para a gestão de seu sistema e o segundo é como uma ferramenta de automação. Vamos falar um pouco aqui sobre esse segundo ponto.

Pense numa POC de automação. Digamos que, após um deployment, eu precise atestar uma funcionalidade básica da aplicação que acabou de ser instalada. Então, vamos supor que eu precise somente abrir uma página web e logar na aplicação.

Vamos lá!

A primeira coisa a se pensar é o caminho “straightforward” ou “direto” dessa execução. Então, digamos que um script que crie um COM do Explorer, navegue até a página “X”, identifique os objetos de login e senha, complete-os e aperte o botão “login”. Esse script é descrito no Módulo 1 – Script. Nele, vamos descrever brevemente a sintaxe do Powershell, seu set-up e realizar a POC que citei acima.

A segunda coisa é fazer com que esse código seja mais reutilizável, então, deixaremos de ter um script “travado” que só executa aquilo para ter um conjunto de funções que eu possa chamar a meu bel sabor. Isso será abordado no Módulo 2 – Funções.

A terceira ação é modularizar nosso código, transformando-o em um “powershell module”, para atingirmos uma maior escalabilidade, controle, abstração e aumentar ainda mais o reúso de nosso código: Módulo 3 – Módulos. Até aqui tem alguma dúvida ou alguma observação? Aproveite os campos abaixo!

 Write-Host "po-po-po-po-power!"

***

Artigo publicado originalmente em: https://www.concretesolutions.com.br/2017/05/08/introducao-ao-powershell/