Fa'atino Powershell ma vasega e le o se oxymoron, ou te fa'amautinoa

Ei Habr! Ou te faailoa atu ia te outou le faaliliuga o le tusiga "PowerShell fa'atino ma Vasega.
Ou te folafola atu e le o se oxymoron"
saunia e Christopher Kuech.

O faʻataʻitaʻiga faʻatulagaina ma faʻatinoga e foliga mai e feteʻenaʻi le tasi ma le isi, ae e tutusa uma le lagolagoina i le Powershell. Toeitiiti lava o gagana fa'apolokalame uma, fa'atino pe leai, o lo'o i ai nofoaga mo le fa'alauteleina o igoa-taua fa'amauina; Vasega, pei o faʻatonuga ma faʻamaumauga, ua naʻo le tasi le auala. Afai tatou te faʻatapulaʻaina lo tatou faʻaogaina o Vasega i le fusia o igoa ma faʻatauga, ma aloese mai manatu mamafa faʻatulagaina polokalame e pei o le tofi, polymorphism, poʻo le fesuiaiga, e mafai ona tatou faʻaogaina o latou aoga e aunoa ma le faʻalavelaveina o la tatou tulafono. E le gata i lea, e ala i le faʻaopoopoina o metotia faʻaliliuina ituaiga e le mafai ona suia, e mafai ona faʻatamaoaigaina a tatou tulafono faʻatino ma Vasega.

O le togafiti faataulaitu

Castes o se tasi o vaega sili ona mamana i Powershell. A e tu'uina atu se tau, o lo'o e fa'alagolago i le fa'amatagofieina ma le fa'amaonia gafatia e fa'aopoopo e le si'osi'omaga i lau talosaga. Mo se faʻataʻitaʻiga, naʻo le lafoina o se manoa i le [xml] o le a faʻaogaina i le parser code ma faʻatupuina se xml laau atoatoa. E mafai ona matou faʻaogaina Vasega i la matou code mo le faʻamoemoe lava e tasi.

Fa'asolo atu laulau fa'amau

Afai e leai sau faufale, e mafai ona e fa'aauau e aunoa ma se tasi e ala i le tu'uina atu o se laulau i lau vasega. Aua nei galo e faʻaaoga uiga faʻamaonia e faʻaoga atoatoa ai lenei mamanu. I le taimi lava e tasi, e mafai ona tatou faʻaogaina meatotino faʻapipiʻi a le vasega e faʻatautaia atili ai le faʻauluuluga ma le faʻamaoniga faʻamaonia.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

[Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

E le gata i lea, o le lafo e fesoasoani e maua ai se mea mama. Fa'atusatusa le gaioiga o le Cluster hashtable array na pasi atu i le Format-Table ma mea e te maua pe afai e te lafoina muamua nei hashtables i totonu o se vasega. O meatotino a se vasega e lisi i taimi uma i le fa'asologa o lo'o fa'amatalaina ai iina. 'Aua ne'i galo e fa'aopoopo le 'upu natia a'o le'i o'o i na meatotino uma e te le mana'o e va'aia i fa'ai'uga.

Fa'atino Powershell ma vasega e le o se oxymoron, ou te fa'amautinoa

Tu'u o uiga

Afai ei ai sau faufale ma se finauga e tasi, o le tuʻuina atu o se tau i lau vasega vasega o le a pasi atu le tau i lau faufale, lea e mafai ai ona e amataina se faʻataʻitaʻiga o lau vasega.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    Cluster([string] $id) {
        $this.Service, $this.FlightingRing, $this.Region, $this.Index = $id -split "-"
    }
}

[Cluster]"MyService-PROD-EastUS-2"

lafo i le laina

E mafai fo'i ona e fa'asili le [manoa] ToString() auala vasega e fa'amatala ai le fa'atatau i tua o le fa'atusaina o le manoa, e pei o le fa'aogaina o le fa'aogaina o le manoa.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    [string] ToString() {
        return $this.Service, $this.FlightingRing, $this.Region, $this.Index -join "-"
    }
}

$cluster = [Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

Write-Host "We just created a model for '$cluster'"

Fa'asolo fa'asologa fa'asologa

Fa'ali'i fa'ataga saogalemu deserialization. O faʻataʻitaʻiga o loʻo i lalo o le a le manuia pe a le ausia e faʻamaumauga a matou faʻamatalaga i le Cluster

# Валидация сериализованных данных

[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"

Castes i lau code galue

Polokalama faʻaogaina muamua faʻamalamalamaina fausaga faʻamaumauga, ona faʻatinoina lea o le polokalame o se faʻasologa o suiga i luga o fausaga faʻamaumauga e le mafai ona suia. E ui lava i le fete'ena'i lagona, o vasega e fesoasoani tele ia te oe e tusi ai le code galue faʻafetai i le faʻaogaina o metotia liua.

E aoga le Powershell o lo'o ou tusia?

O le to'atele o tagata e sau mai le C# po'o tala fa'atusa o lo'o tusia le Powershell, e tutusa ma le C#. I le faia o lea mea, o lo'o e alu ese mai le fa'aogaina o fa'ata'ita'iga polokalame fa'atino ma e ono fa'amanuiaina mai le ma'ulu malosi i polokalame fa'atatau i mea i Powershell po'o le a'oa'oina atili e uiga i polokalame fa'atino.

Afai e te faʻalagolago tele i le suia o faʻamatalaga e le mafai ona suia e faʻaaoga ai paipa (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, ma isi - e iai sau sitaili sili atu ona aoga ma o le ae manuia mai le faʻaaogaina o le Powershell vasega i se faiga galue.

Fa'aoga aoga o vasega

Castes, e ui lava latou te faʻaogaina se isi faʻasologa, ua na o se faʻafanua i le va o vaega e lua. I le paipa, e mafai ona e faʻafanua se faʻasologa o tau faʻaaoga ForEach-Object.

I le faʻataʻitaʻiga o loʻo i lalo, o le Node constructor e faʻataunuʻuina i taimi uma e lafo ai se Datum, ma o lenei mea e maua ai e i tatou le avanoa e le tusia ai se aofaʻi talafeagai o code. O le i'uga, o la matou paipa e taula'i atu i fa'amatalaga fa'amatalaga fa'amatalaga ma fa'aputuga, a'o va'aia e matou vasega le fa'avasegaina o fa'amaumauga ma le fa'amaonia.

# Пример комбинирования классов с конвейерами для separation of concerns в конвейерах

class Node {
    [ValidateLength(3, 7)]
    [string] $Name
    [ValidateSet("INT", "PPE", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope", "WestEurope")]
    [string] $Region
    Node([string] $Name) {
        $Name -match "([a-z]+)(INT|PPE|PROD)([a-z]+)"
        $_, $this.Service, $this.FlightingRing, $this.Region = $Matches
        $this.Name = $Name
    }
}

class Datum {
    [string] $Name
    [int] $Value
    [Node] $Computer
    [int] Severity() {
        $this.Name -match "[0-9]+$"
        return $Matches[0]
    }
}

Write-Host "Urgent Security Audit Issues:"
Import-Csv "./audit-results.csv" `
    | ForEach-Object {[Datum]$_} `
    | Where-Object Value -gt 0 `
    | Group-Object {$_.Severity()} `
    | Where-Object Name -lt 2 `
    | ForEach-Object Group `
    | ForEach-Object Computer `
    | Where-Object FlightingRing -eq "PROD" `
    | Sort-Object Name, Region -Unique

Vasega afifi mo le toe fa'aoga

E leai se mea e lelei e pei ona foliga mai

Ae paga lea, o vasega e le mafai ona auina atu i fafo e modules i le auala tutusa e pei o galuega poʻo fesuiaiga; ae e iai nisi togafiti. Fa'apea o au vasega o lo'o fa'amalamalamaina i le faila ./my-classes.ps1

  • E mafai ona e dotsource se faila i vasega:. ./my-classes.ps1. O lenei mea o le a faʻatinoina ai laʻu-classes.ps1 i lau lautele o loʻo iai nei ma faʻamalamalamaina vasega uma mai le faila iina.

  • E mafai ona e fatuina se Powershell module e auina atu i fafo au masani APIs (cmdlets) ma seti le ScriptsToProcess = "./my-classes.ps1" fesuiaʻi i lau faʻaaliga module, ma le iʻuga tutusa: ./my-classes.ps1 o le a faʻatinoina i totonu lou siosiomaga .

Po o le a lava le filifiliga e te filifilia, ia manatua e le mafai e le Powershell's type system ona foia ituaiga o igoa tutusa e utaina mai nofoaga eseese.
E tusa lava pe na e utaina ni vasega tutusa se lua ma mea tutusa mai nofoaga eseese, e te ono tulaʻi mai faʻafitauli.

O le ala i luma

O le auala sili e aloese ai mai faʻafitauli faʻafitauli o le faʻaalia o au vasega i tagata faʻaoga. Nai lo le faʻamoemoe o le tagata faʻaoga e faʻaulufaleina mai se ituaiga faʻavasegaina o vasega, auina atu i fafo se galuega mai lau module e faʻaumatia ai le manaʻoga e maua saʻo le vasega. Mo Cluster, e mafai ona matou auina atu i fafo se galuega New-Cluster o le a lagolagoina seti faʻataʻitaʻiga faʻaoga-tagata ma toe faʻafoʻi se Cluster.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

function New-Cluster {
    [OutputType([Cluster])]
    Param(
        [Parameter(Mandatory, ParameterSetName = "Id", Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string] $Id,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Service,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $FlightingRing,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Region,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [int] $Index
    )

    if ($Id) {
        $Service, $FlightingRing, $Region, $Index = $Id -split "-"
    }

    [Cluster]@{
        Service       = $Service
        FlightingRing = $FlightingRing
        Region        = $Region
        Index         = $Index
    }
}

Export-ModuleMember New-Cluster

O le a se isi mea e faitau

E uiga i Vasega
Puipuiga PowerShell
Polokalama Fa'atino ile PowerShell

puna: www.habr.com

Faaopoopo i ai se faamatalaga