เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเชพเชตเชฐเชถเซ‡เชฒ เช“เช•เซเชธเชฟเชฎเซ‹เชฐเซ‹เชจ เชจเชฅเซ€, เชนเซเช‚ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช†เชชเซเช‚ เช›เซเช‚

เชนเซ‡ เชนเชฌเชฐ! เชนเซเช‚ เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชชเชฐ เชฒเซ‡เช–เชจเซ‹ เช…เชจเซเชตเชพเชฆ เชฐเชœเซ‚ เช•เชฐเซเช‚ เช›เซเช‚ "เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเชพเชตเชฐเชถเซ‡เชฒ.
เชนเซเช‚ เชตเชšเชจ เช†เชชเซเช‚ เช›เซเช‚ เช•เซ‡ เชคเซ‡ เช“เช•เซเชธเชฟเชฎเซ‹เชฐเซ‹เชจ เชจเชฅเซ€"
เช•เซเชฐเชฟเชธเซเชŸเซ‹เชซเชฐ เช•เซเชš เชฆเซเชตเชพเชฐเชพ.

เช‘เชฌเซเชœเซ‡เช•เซเชŸ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เช…เชจเซ‡ เชซเช‚เช•เซเชถเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชชเซ‡เชฐเชพเชกเชฟเชฎเซเชธ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชตเชฟเชฐเซ‹เชงเชพเชญเชพเชธเซ€ เชฒเชพเช—เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชชเชพเชตเชฐเชถเซ‡เชฒเชฎเชพเช‚ เชฌเช‚เชจเซ‡ เชธเชฎเชพเชจ เชฐเซ€เชคเซ‡ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เช›เซ‡. เชฒเช—เชญเช— เชคเชฎเชพเชฎ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“, เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชนเซ‹เชฏ เช•เซ‡ เชจ เชนเซ‹เชฏ, เชตเชฟเชธเซเชคเซƒเชค เชจเชพเชฎ-เชฎเซ‚เชฒเซเชฏ เชฌเช‚เชงเชจ เชฎเชพเชŸเซ‡ เชธเซเชตเชฟเชงเชพเช“ เชงเชฐเชพเชตเซ‡ เช›เซ‡; เชตเชฐเซเช—เซ‹, เชœเซ‡เชฎ เช•เซ‡ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เช…เชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ, เชฎเชพเชคเซเชฐ เชเช• เช…เชญเชฟเช—เชฎ เช›เซ‡. เชœเซ‹ เช†เชชเชฃเซ‡ เชตเชฐเซเช—เซ‹เชจเชพ เช…เชฎเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชจเซ‡ เชจเชพเชฎเซ‹ เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹เชจเชพ เชฌเช‚เชงเชจ เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเชพเช–เซ€เช, เช…เชจเซ‡ เชนเซ‡เชตเซ€ เช‘เชฌเซเชœเซ‡เช•เซเชŸ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช–เซเชฏเชพเชฒเซ‹ เชœเซ‡เชฎ เช•เซ‡ เชตเชพเชฐเชธเชพ, เชชเซ‹เชฒเซ€เชฎเซ‹เชฐเซเชซเชฟเชเชฎ เช…เชฅเชตเชพ เชชเชฐเชฟเชตเชฐเซเชคเชจเชถเซ€เชฒเชคเชพ เชŸเชพเชณเซ€เช, เชคเซ‹ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เช•เซ‹เชกเชจเซ‡ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเซเชฏเชพ เชตเชฟเชจเชพ เชคเซ‡เชฎเชจเชพ เชฒเชพเชญเซ‹เชจเซ‹ เชฒเชพเชญ เชฒเชˆ เชถเช•เซ€เช เช›เซ€เช. เช†เช—เชณ, เช…เชชเชฐเชฟเชตเชฐเซเชคเชจเชถเซ€เชฒ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ เชชเชฆเซเชงเชคเชฟเช“ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡, เช…เชฎเซ‡ เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡ เช…เชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เช•เซ‹เชกเชจเซ‡ เชธเชฎเซƒเชฆเซเชง เชฌเชจเชพเชตเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชœเชพเชคเชฟเช“เชจเซ‹ เชœเชพเชฆเซ

เชœเชพเชคเชฟ เช เชชเชพเชตเชฐเชถเซ‡เชฒเชจเซ€ เชธเซŒเชฅเซ€ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชฎเชพเช‚เชจเซ€ เชเช• เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชฎเซ‚เชฒเซเชฏ เช•เชพเชธเซเชŸ เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เช—เชฐเซเชญเชฟเชค เช†เชฐเช‚เชญ เช…เชจเซ‡ เชฎเชพเชจเซเชฏเชคเชพ เช•เซเชทเชฎเชคเชพเช“ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‹ เช›เซ‹ เชœเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชซเช•เซเชค [xml] เชฎเชพเช‚ เชธเซเชŸเซเชฐเชฟเช‚เช— เช•เชพเชธเซเชŸ เช•เชฐเชตเชพเชฅเซ€ เชคเซ‡ เชชเชพเชฐเซเชธเชฐ เช•เซ‹เชก เชฆเซเชตเชพเชฐเชพ เชšเชพเชฒเชถเซ‡ เช…เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ xml เชŸเซเชฐเซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชถเซ‡. เช…เชฎเซ‡ เชธเชฎเชพเชจ เชนเซ‡เชคเซ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเชพ เช•เซ‹เชกเชฎเชพเช‚ เชตเชฐเซเช—เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชนเซ‡เชถเชŸเซ‡เชฌเชฒ เช•เชพเชธเซเชŸ เช•เชฐเซ‹

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐ เชจ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชตเชฐเซเช— เชชเซเชฐเช•เชพเชฐ เชชเชฐ เชนเซ‡เชถเชŸเซ‡เชฌเชฒ เช•เชพเชธเซเชŸ เช•เชฐเซ€เชจเซ‡ เชเช• เชตเชฟเชจเชพ เชšเชพเชฒเซ เชฐเชพเช–เซ€ เชถเช•เซ‹ เช›เซ‹. เช† เชชเซ‡เชŸเชฐเซเชจเชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฒเชพเชญ เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชฎเชพเชจเซเชฏเชคเชพ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เช…เชฎเซ‡ เชตเชงเซ เชŠเช‚เชกเชพ เชชเซเชฐเชพเชฐเช‚เชญ เช…เชจเซ‡ เชฎเชพเชจเซเชฏเชคเชพ เชคเชฐเซเช•เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฐเซเช—เชจเซ€ เชŸเชพเช‡เชช เช•เชฐเซ‡เชฒ เช—เซเชฃเชงเชฐเซเชฎเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

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
}

เชตเชงเซเชฎเชพเช‚, เช•เชพเชธเซเชŸเชฟเช‚เช— เชธเซเชตเชšเซเช› เช†เช‰เชŸเชชเซเชŸ เชฎเซ‡เชณเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช† เชนเซ‡เชถเชŸเซ‡เชฌเชฒเซเชธเชจเซ‡ เชชเซเชฐเชฅเชฎ เชตเชฐเซเช—เชฎเชพเช‚ เช•เชพเชธเซเชŸ เช•เชฐเซ‹ เช›เซ‹ เชคเซ‹ เชคเชฎเชจเซ‡ เชถเซเช‚ เชฎเชณเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชซเซ‹เชฐเซเชฎเซ‡เชŸ-เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เชชเชธเชพเชฐ เช•เชฐเชพเชฏเซ‡เชฒ เช•เซเชฒเชธเซเชŸเชฐ เชนเซ‡เชถเชŸเซ‡เชฌเชฒ เชเชฐเซ‡เชจเชพ เช†เช‰เชŸเชชเซเชŸเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‹. เชตเชฐเซเช—เชจเชพ เช—เซเชฃเชงเชฐเซเชฎเซ‹ เชนเช‚เชฎเซ‡เชถเชพ เชคเซ‡ เช•เซเชฐเชฎเชฎเชพเช‚ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชคเซ‡ เชคเซเชฏเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡ เชคเชฎเชพเชฎ เชชเซเชฐเซ‹เชชเชฐเซเชŸเซ€เช เชชเชนเซ‡เชฒเชพ เช›เซเชชเชพเชฏเซ‡เชฒเชพ เช•เซ€เชตเชฐเซเชก เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚ เช•เซ‡ เชœเซ‡ เชคเชฎเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชฎเชพเช‚ เชœเซ‹เชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€.

เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเชพเชตเชฐเชถเซ‡เชฒ เช“เช•เซเชธเชฟเชฎเซ‹เชฐเซ‹เชจ เชจเชฅเซ€, เชนเซเช‚ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช†เชชเซเช‚ เช›เซเช‚

เช…เชฐเซเชฅเซ‹เชจเซ€ เช•เชพเชธเซเชŸ

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• เชฆเชฒเซ€เชฒ เชธเชพเชฅเซ‡ เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเชพเชฐเชพ เชตเชฐเซเช—เชจเชพ เชชเซเชฐเช•เชพเชฐ เชชเชฐ เชฎเซ‚เชฒเซเชฏ เช•เชพเชธเซเชŸ เช•เชฐเชตเชพเชฅเซ€ เชคเซ‡ เชฎเซ‚เชฒเซเชฏ เชคเชฎเชพเชฐเชพ เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐเชจเซ‡ เชชเชธเชพเชฐ เชฅเชถเซ‡, เชœเซเชฏเชพเช‚ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชตเชฐเซเช—เชจเซ‹ เชฆเชพเช–เชฒเซ‹ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

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"

เชฒเชพเช‡เชจ เชชเชฐ เช•เชพเชธเซเชŸ เช•เชฐเซ‹

เชคเชฎเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ€ เชธเซเชŸเซเชฐเชฟเช‚เช— เชฐเชœเซ‚เช†เชค เชชเชพเช›เชณเชจเชพ เชคเชฐเซเช•เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ [string] ToString() เชตเชฐเซเช— เชชเชฆเซเชงเชคเชฟเชจเซ‡ เชชเชฃ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชฎ เช•เซ‡ เชธเซเชŸเซเชฐเชฟเช‚เช— เช‡เชจเซเชŸเชฐเชชเซ‹เชฒเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช—.

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

เชถเซเชฐเซ‡เชฃเซ€เชฌเชฆเซเชง เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช•เชพเชธเซเชŸ เช•เชฐเซ‹

เช•เชพเชธเซเชŸ เชธเซเชฐเช•เซเชทเชฟเชค เชกเซ€เชธเซ€เชฐเชฟเชฏเชฒเชพเชˆเชเซ‡เชถเชจเชจเซ‡ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชœเซ‹ เชกเซ‡เชŸเชพ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เช…เชฎเชพเชฐเชพ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃเชจเซ‡ เชชเซ‚เชฐเซเชฃ เชจ เช•เชฐเซ‡ เชคเซ‹ เชจเซ€เชšเซ‡เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชจเชฟเชทเซเชซเชณ เชœเชถเซ‡

# ะ’ะฐะปะธะดะฐั†ะธั ัะตั€ะธะฐะปะธะทะพะฒะฐะฝะฝั‹ั… ะดะฐะฝะฝั‹ั…

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

เชคเชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เช•เซ‹เชกเชฎเชพเช‚ เชœเชพเชคเชฟเช“

เชซเช‚เช•เซเชถเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชชเชนเซ‡เชฒเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชชเช›เซ€ เช…เชชเชฐเชฟเชตเชฐเซเชคเชจเชถเซ€เชฒ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เชชเชฐ เชชเชฐเชฟเชตเชฐเซเชคเชจเชจเชพ เช•เซเชฐเชฎ เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ‡ เช›เซ‡. เชตเชฟเชฐเซ‹เชงเชพเชญเชพเชธเซ€ เช›เชพเชช เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชตเชฐเซเช—เซ‹ เช–เชฐเซ‡เช–เชฐ เชคเชฎเชจเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เช•เซ‹เชก เชฒเช–เชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ เชชเชฆเซเชงเชคเชฟเช“ เชŸเชพเช‡เชช เช•เชฐเซ‡ เช›เซ‡.

เชถเซเช‚ เชนเซเช‚ เชฒเช–เซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เชคเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒ เช•เชพเชฐเซเชฏเชฐเชค เช›เซ‡?

C# เช…เชฅเชตเชพ เชธเชฎเชพเชจ เชชเซƒเชทเซเช เชญเซ‚เชฎเชฟเชฎเชพเช‚เชฅเซ€ เช†เชตเชคเชพ เช˜เชฃเชพ เชฒเซ‹เช•เซ‹ เชชเชพเชตเชฐเชถเซ‡เชฒ เชฒเช–เซ€ เชฐเชนเซเชฏเชพ เช›เซ‡, เชœเซ‡ C# เชœเซ‡เชตเซเช‚ เชœ เช›เซ‡. เช†เชฎ เช•เชฐเชตเชพเชฅเซ€, เชคเชฎเซ‡ เชซเช‚เช•เซเชถเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช•เซ‹เชจเซเชธเซ‡เชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เชฆเซ‚เชฐ เชœเชˆ เชฐเชนเซเชฏเชพ เช›เซ‹ เช…เชจเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒเชฎเชพเช‚ เช‘เชฌเซเชœเซ‡เช•เซเชŸ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เชญเชพเชฐเซ‡ เชกเชพเช‡เชตเชฟเช‚เช— เช•เชฐเชตเชพเชฅเซ€ เช…เชฅเชตเชพ เชซเช‚เช•เซเชถเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชตเชฟเชถเซ‡ เชตเชงเซ เชถเซ€เช–เชตเชพเชฅเซ€ เชคเชฎเชจเซ‡ เชซเชพเชฏเชฆเซ‹ เชฅเชถเซ‡.

เชœเซ‹ เชคเชฎเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ (|), เช•เซเชฏเชพเช‚-เช‘เชฌเซเชœเซ‡เช•เซเชŸ, เชซเซ‹เชฐเชเชš-เช‘เชฌเซเชœเซ‡เช•เซเชŸ, เชธเชฟเชฒเซ‡เช•เซเชŸ-เช‘เชฌเซเชœเซ‡เช•เซเชŸ, เช—เซเชฐเซเชช-เช‘เชฌเซเชœเซ‡เช•เซเชŸ, เชธเซ‰เชฐเซเชŸ-เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชตเช—เซ‡เชฐเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชชเชฐเชฟเชตเชฐเซเชคเชจเชถเซ€เชฒ เชกเซ‡เชŸเชพเชจเซ‡ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เชชเชฐ เช–เซ‚เชฌ เช†เชงเชพเชฐ เชฐเชพเช–เชคเชพ เชนเซ‹เชต เชคเซ‹ - เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชตเชงเซ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชถเซˆเชฒเซ€ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชจเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เชซเชพเชฏเชฆเซ‹ เชฅเชถเซ‡. เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชถเซˆเชฒเซ€เชฎเชพเช‚ เชตเชฐเซเช—เซ‹.

เชตเชฐเซเช—เซ‹เชจเซ‹ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เช‰เชชเชฏเซ‹เช—

เชœเชพเชคเชฟเช“, เชœเซ‹ เช•เซ‡ เชคเซ‡เช“ เชตเซˆเช•เชฒเซเชชเชฟเช• เชตเชพเช•เซเชฏเชฐเชšเชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡ เชฎเชพเชคเซเชฐ เชฌเซ‡ เชกเซ‹เชฎเซ‡เชจเซเชธ เชตเชšเซเชšเซ‡เชจเซเช‚ เชฎเซ‡เชชเชฟเช‚เช— เช›เซ‡. เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚, เชคเชฎเซ‡ เชซเซ‹เชฐเชเชš-เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€เชจเซ‡ เชฎเซ‡เชช เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชจเซ€เชšเซ‡เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชกเซ‡เชŸเชฎ เช•เชพเชธเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชจเซ‹เชก เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐเชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เช† เช…เชฎเชจเซ‡ เช•เซ‹เชกเชจเซ€ เชตเชพเชœเชฌเซ€ เชฐเช•เชฎ เชจ เชฒเช–เชตเชพเชจเซ€ เชคเช• เช†เชชเซ‡ เช›เซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เช˜เซ‹เชทเชฃเชพเชคเซเชฎเช• เชกเซ‡เชŸเชพ เช•เซเชตเซ‡เชฐเซ€ เช…เชจเซ‡ เชเช•เชคเซเชฐเซ€เช•เชฐเชฃ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เช…เชฎเชพเชฐเชพ เชตเชฐเซเช—เซ‹ เชกเซ‡เชŸเชพ เชชเชพเชฐเซเชธเชฟเช‚เช— เช…เชจเซ‡ เชฎเชพเชจเซเชฏเชคเชพเชจเซ€ เช•เชพเชณเชœเซ€ เชฒเซ‡ เช›เซ‡.

# ะŸั€ะธะผะตั€ ะบะพะผะฑะธะฝะธั€ะพะฒะฐะฝะธั ะบะปะฐััะพะฒ ั ะบะพะฝะฒะตะนะตั€ะฐะผะธ ะดะปั 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

เชชเซเชจเชƒเช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เชชเซ‡เช•เซ‡เชœเชฟเช‚เช— เชตเชฐเซเช—

เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เชเชŸเชฒเซเช‚ เชธเชพเชฐเซเช‚ เช•เช‚เชˆ เชจเชฅเซ€

เช•เชฎเชจเชธเซ€เชฌเซ‡, เชตเชฐเซเช—เซ‹ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชฆเซเชตเชพเชฐเชพ เชซเช‚เช•เซเชถเชจ เช…เชฅเชตเชพ เชšเชฒเซ‹เชจเซ€ เชœเซ‡เชฎ เชจเชฟเช•เชพเชธ เช•เชฐเซ€ เชถเช•เชพเชคเชพ เชจเชฅเซ€; เชชเชฐเช‚เชคเซ เช•เซ‡เชŸเชฒเซ€เช• เชฏเซเช•เซเชคเชฟเช“ เช›เซ‡. เชงเชพเชฐเซ‹ เช•เซ‡ เชคเชฎเชพเชฐเชพ เชตเชฐเซเช—เซ‹ ./my-classes.ps1 เชซเชพเช‡เชฒเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช›เซ‡

  • เชคเชฎเซ‡ เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡ เชซเชพเช‡เชฒเชจเซ‡ เชกเซ‹เชŸเชธเซ‹เชฐเซเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:. ./my-classes.ps1. เช† เชคเชฎเชพเชฐเชพ เชตเชฐเซเชคเชฎเชพเชจ เช•เชพเชฐเซเชฏเช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚ my-classes.ps1 เชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชคเซเชฏเชพเช‚เชจเซ€ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชคเชฎเชพเชฎ เชตเชฐเซเช—เซ‹เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชถเซ‡.

  • เชคเชฎเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ เชคเชฎเชพเชฐเชพ เชฌเชงเชพ เช•เชธเซเชŸเชฎ API (cmdlets) เชจเซ‡ เชจเชฟเช•เชพเชธ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เชฎเซ‹เชกเซเชฏเซเชฒ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชฎเชพเช‚ ScriptsToProcess = "./my-classes.ps1" เชตเซ‡เชฐเซ€เชเชฌเชฒ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชธเชฎเชพเชจ เชชเชฐเชฟเชฃเชพเชฎ เชธเชพเชฅเซ‡: ./my-classes.ps1 เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชถเซ‡ เชคเชฎเชพเชฐเซเช‚ เชตเชพเชคเชพเชตเชฐเชฃ.

เชคเชฎเซ‡ เชœเซ‡ เชชเชฃ เชตเชฟเช•เชฒเซเชช เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช›เซ‹, เชฏเชพเชฆ เชฐเชพเช–เซ‹ เช•เซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒเชจเซ€ เชŸเชพเช‡เชช เชธเชฟเชธเซเชŸเชฎ เชตเชฟเชตเชฟเชง เชธเซเชฅเชณเซ‹เชเชฅเซ€ เชฒเซ‹เชก เชฅเชฏเซ‡เชฒ เชธเชฎเชพเชจ เชจเชพเชฎเชจเชพ เชชเซเชฐเช•เชพเชฐเซ‹เชจเซ‡ เช‰เช•เซ‡เชฒเซ€ เชถเช•เชคเซ€ เชจเชฅเซ€.
เชœเซ‹ เชคเชฎเซ‡ เช…เชฒเช—-เช…เชฒเช— เชœเช—เซเชฏเชพเชเชฅเซ€ เชธเชฎเชพเชจ เชชเซเชฐเซ‹เชชเชฐเซเชŸเซ€เช เชธเชพเชฅเซ‡ เชฌเซ‡ เชธเชฐเช–เชพ เชตเชฐเซเช—เซ‹ เชฒเซ‹เชก เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ เชชเชฃ เชคเชฎเชจเซ‡ เชธเชฎเชธเซเชฏเชพเช“เชฎเชพเช‚ เช†เชตเชตเชพเชจเซเช‚ เชœเซ‹เช–เชฎ เชฐเชนเซ‡ เช›เซ‡.

เช†เช—เชณเชจเซ‹ เชฐเชธเซเชคเซ‹

เชŸเชพเชˆเชช เชฐเชฟเชเซ‹เชฒเซเชฏเซเชถเชจ เชธเชฎเชธเซเชฏเชพเช“ เชŸเชพเชณเชตเชพเชจเซ‹ เชถเซเชฐเซ‡เชทเซเช  เชฎเชพเชฐเซเช— เช เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเชพ เชตเชฐเซเช—เซ‹เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเชฎเช•เซเชท เช•เซเชฏเชพเชฐเซ‡เชฏ เช–เซเชฒเซเชฒเชพ เชจ เชชเชพเชกเซ‹. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฆเซเชตเชพเชฐเชพ เชตเชฐเซเช—-เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชชเซเชฐเช•เชพเชฐ เช†เชฏเชพเชค เช•เชฐเชตเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชคเชฎเชพเชฐเชพ เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚เชฅเซ€ เชเช• เชซเช‚เช•เซเชถเชจ เชจเชฟเช•เชพเชธ เช•เชฐเซ‹ เชœเซ‡ เชตเชฐเซเช—เชจเซ‡ เชธเซ€เชงเชพ เชœ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ‡ เช›เซ‡. เช•เซเชฒเชธเซเชŸเชฐ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชจเชตเชพ-เช•เซเชฒเชธเซเชŸเชฐ เชซเช‚เช•เซเชถเชจเชจเซ€ เชจเชฟเช•เชพเชธ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช เชœเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ-เชฎเซˆเชคเซเชฐเซ€เชชเซ‚เชฐเซเชฃ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชธเซ‡เชŸเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐเชค เช•เชฐเชถเซ‡.

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

เชฌเซ€เชœเซเช‚ เชถเซเช‚ เชตเชพเช‚เชšเชตเซเช‚

เชตเชฐเซเช—เซ‹ เชตเชฟเชถเซ‡
เชฐเช•เซเชทเชฃเชพเชคเซเชฎเช• เชชเชพเชตเชฐเชถเซ‡เชฒ
PowerShell เชฎเชพเช‚ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹