เด•เตเดฒเดพเดธเตเด•เดณเตเดณเตเดณ เดซเด‚เด—เตเดทเดฃเตฝ เดชเดตเตผเดทเต†เตฝ เด’เดฐเต เด“เด•เตเดธเดฟเดฎเต‹เดฑเต‹เตบ เด…เดฒเตเดฒ, เดžเดพเตป เด…เดคเต เด‰เดฑเดชเตเดชเตเดจเตฝเด•เตเดจเตเดจเต

เดนเต‡ เดนเดฌเตผ! เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดžเดพเตป เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเดฟเตฝเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต "เด•เตเดฒเดพเดธเตเด•เดณเตเดณเตเดณ เดซเด‚เด—เตเดทเดฃเตฝ เดชเดตเตผเดทเต†เตฝ."
เด‡เดคเต เด’เดฐเต เด“เด•เตเดธเดฟเดฎเต‹เดฑเต‹เตบ เด…เดฒเตเดฒเต†เดจเตเดจเต เดžเดพเตป เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต"
เด•เตเดฐเดฟเดธเตเดฑเตเดฑเดซเตผ เด•เตเดšเตเดšเต เดŽเดดเตเดคเดฟเดฏเดคเต.

เด’เดฌเตเดœเด•เตเดฑเตเดฑเต-เด“เดฑเดฟเดฏเดจเตเดฑเดกเต, เดซเด™เตเดทเดฃเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดฎเดพเดคเตƒเด•เด•เตพ เดชเดฐเดธเตเดชเดฐเด‚ เดตเดฟเดฐเตเดฆเตเดงเดฎเดพเดฏเดฟ เดคเต‹เดจเตเดจเดพเดฎเต†เด™เตเด•เดฟเดฒเตเด‚, เดชเดตเตผเดทเต†เดฒเตเดฒเดฟเตฝ เดฐเดฃเตเดŸเตเด‚ เด’เดฐเตเดชเต‹เดฒเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต. เดซเด™เตเดทเดฃเตฝ เด†เดฏเดพเดฒเตเด‚ เด…เดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฏ เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเด•เดณเตเด‚ เดตเดฟเดชเตเดฒเดฎเดพเดฏ เดจเต†เดฏเดฟเด‚-เดตเดพเดฒเตเดฏเต‚ เดฌเตˆเตปเดกเดฟเด‚เด—เต เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต; เด˜เดŸเดจเด•เดณเตเด‚ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเตเด‚ เดชเต‹เดฒเตเดณเตเดณ เด•เตเดฒเดพเดธเตเด•เตพ เด’เดฐเต เดธเดฎเต€เดชเดจเด‚ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. เดจเต†เดฏเดฟเด‚-เดตเดพเดฒเตเดฏเต‚ เดฌเตˆเตปเดกเดฟเด‚เด—เดฟเดฒเต‡เด•เตเด•เต เด•เตเดฒเดพเดธเตเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เด‚ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเตเด‚ เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเด‚, เดชเต‹เดณเดฟเดฎเต‹เตผเดซเดฟเดธเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตเดฏเต‚เดŸเตเดŸเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟ เดชเต‹เดฒเตเดณเตเดณ เดนเต†เดตเดฟเดตเต†เดฏเตเดฑเตเดฑเต เด’เดฌเตเดœเด•เตเดฑเตเดฑเต-เด“เดฑเดฟเดฏเดจเตเดฑเดกเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เด†เดถเดฏเด™เตเด™เตพ เด’เดดเดฟเดตเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเตเด‚, เดจเดฎเตเดฎเตเดŸเต† เด•เต‹เดกเดฟเดจเต† เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เดพเดคเต† เด…เดตเดฏเตเดŸเต† เดจเต‡เดŸเตเดŸเด™เตเด™เตพ เดจเดฎเตเด•เตเด•เต เดชเตเดฐเดฏเต‹เดœเดจเดชเตเดชเต†เดŸเตเดคเตเดคเดพเด‚. เด•เต‚เดŸเดพเดคเต†, เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เดคเดฐเด‚ เดชเดฐเดฟเดตเตผเดคเตเดคเดจ เดฐเต€เดคเดฟเด•เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เด•เตเดฒเดพเดธเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเดฎเตเดŸเต† เดซเด™เตเดทเดฃเตฝ เด•เต‹เดกเดฟเดจเต† เดธเดฎเตเดชเตเดทเตเดŸเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดœเดพเดคเดฟ เดฎเดพเดจเตเดคเตเดฐเดฟเด•เดค

เดชเดตเตผเดทเต†เดฒเตเดฒเดฟเดฒเต† เดเดฑเตเดฑเดตเตเด‚ เดถเด•เตเดคเดฎเดพเดฏ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเดฟเตฝ เด’เดจเตเดจเดพเดฃเต เด•เดพเดธเตเดฑเตเดฑเตเด•เตพ. เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดฎเต‚เดฒเตเดฏเด‚ เด•เดพเดธเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจ เด‡เด‚เดชเตเดฒเดฟเดธเดฟเดฑเตเดฑเต เด‡เดจเต€เดทเตเดฏเดฒเตˆเดธเต‡เดทเดจเต†เดฏเตเด‚ เดตเดพเดฒเดฟเดกเต‡เดทเตป เด•เดดเดฟเดตเตเด•เดณเต†เดฏเตเด‚ เดจเดฟเด™เตเด™เตพ เด†เดถเตเดฐเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, [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"

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดซเด™เตเดทเดฃเตฝ เด•เต‹เดกเดฟเตฝ เด•เดพเดธเตเดฑเตเดฑเตเด•เตพ

เดซเด™เตเดทเดฃเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด†เดฆเตเดฏเด‚ เดกเดพเดฑเตเดฑเดพ เด˜เดŸเดจเด•เดณเต† เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต, เดคเตเดŸเตผเดจเตเดจเต เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เดกเดพเดฑเตเดฑเดพ เด˜เดŸเดจเด•เดณเดฟเดฒเต† เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดถเตเดฐเต‡เดฃเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เดตเดฟเดชเดฐเต€เดคเดฎเดพเดฏ เด’เดฐเต เดฎเดคเดฟเดชเตเดชเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดŸเตเดŸเตเด‚, เด•เตเดฒเดพเดธเตเด•เตพ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด…เดตเดฏเตเดŸเต† เดคเดฐเด‚ เดชเดฐเดฟเดตเตผเดคเตเดคเดจ เดฐเต€เดคเดฟเด•เตพ เด•เดพเดฐเดฃเด‚ เดซเด™เตเดทเดฃเตฝ เด•เต‹เดกเต เดŽเดดเตเดคเดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต.

เดžเดพเตป เดซเด™เตเดทเดฃเตฝ เดชเดตเตผเดทเต†เตฝ เด†เดฃเต‹ เดŽเดดเตเดคเตเดจเตเดจเดคเต?

เดธเดฟ# เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเดฎเดพเดจเดฎเดพเดฏ เดชเดถเตเดšเดพเดคเตเดคเดฒเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดชเดฒเดฐเตเด‚ เดชเดตเตผเดทเต†เตฝ เดŽเดดเตเดคเตเดจเตเดจเต, เด‡เดคเต เดธเดฟ#-เดจเต เดธเดฎเดพเดจเดฎเดพเดฃเต. เด…เด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เดจเดฟเด™เตเด™เตพ เดซเด™เตเดทเดฃเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เด†เดถเดฏเด™เตเด™เตพ เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเดตเตผเดทเต†เดฒเดฟเตฝ เด’เดฌเตเดœเด•เตเดฑเตเดฑเต-เด“เดฑเดฟเดฏเดจเตเดฑเดกเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เดฟเดฒเต‡เด•เตเด•เต เด†เดดเดคเตเดคเดฟเตฝ เด‡เดฑเด™เตเด™เตเด•เดฏเต‹ เดซเด™เตเดทเดฃเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเดฒเดฑเดฟเดฏเตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดฏเต‹เดœเดจเด•เดฐเดฎเดพเด•เตเด‚.

เดชเตˆเดชเตเดชเตเด•เตพ (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object เดฎเตเดคเดฒเดพเดฏเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เดกเดพเดฑเตเดฑ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต† เดจเดฟเด™เตเด™เตพ เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เด†เดถเตเดฐเดฏเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดซเด™เตเดทเดฃเตฝ เดถเตˆเดฒเดฟเดฏเตเดฃเตเดŸเต, เด•เต‚เดŸเดพเดคเต† เดซเด™เตเดทเดฃเตฝ-เดธเตเดฑเตเดฑเตˆเตฝ เดชเดตเตผเดทเต†เตฝ เด•เตเดฒเดพเดธเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดฏเต‹เดœเดจเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚.

เด•เตเดฒเดพเดธเตเด•เดณเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดชเดฐเดฎเดพเดฏ เด‰เดชเดฏเต‹เด—เด‚

เด•เดพเดธเตเดฑเตเดฑเตเด•เตพ, เด’เดฐเต เดฌเดฆเตฝ เดตเดพเด•เตเดฏเด˜เดŸเดจ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เดฐเดฃเตเดŸเต เดกเตŠเดฎเต†เดฏเตโ€Œเดจเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ เด’เดฐเต เดฎเดพเดชเตเดชเดฟเด‚เด—เต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. เด’เดฐเต เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเตฝ, ForEach-Object เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐ เดฎเดพเดชเตเดชเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดคเดพเดดเต†เดฏเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, เด’เดฐเต เดกเดพเดฑเตเดฑเด‚ เด•เดพเดธเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เดดเต†เดฒเตเดฒเดพเด‚ เดจเต‹เดกเต เด•เตบเดธเตเดŸเตเดฐเด•เตเดฑเตเดฑเตผ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด‡เดคเต เด—เดฃเตเดฏเดฎเดพเดฏ เด…เดณเดตเดฟเดฒเตเดณเตเดณ เด•เต‹เดกเดฟเดจเต† เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดžเด™เตเด™เดณเตเดŸเต† เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเตป เดกเดฟเด•เตเดฒเดฑเต‡เดฑเตเดฑเต€เดตเต เดกเดพเดฑเตเดฑ เด•เตเดตเดฑเดฟเด‚เด—เดฟเดฒเตเด‚ เด…เด—เตเดฐเด—เต‡เดทเดจเดฟเดฒเตเด‚ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต‡เดธเดฎเดฏเด‚ เดžเด™เตเด™เดณเตเดŸเต† เด•เตเดฒเดพเดธเตเด•เตพ เดกเดพเดฑเตเดฑ เดชเดพเดดเตโ€Œเดธเดฟเด‚เด—เตเด‚ เดตเดพเดฒเดฟเดกเต‡เดทเดจเตเด‚ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

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

เดตเต‡เดฑเต† เดŽเดจเตเดคเต เดตเดพเดฏเดฟเด•เตเด•เดพเตป

เด•เตเดฒเดพเดธเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต
เดชเตเดฐเดคเดฟเดฐเต‹เดง เดชเดตเตผเดทเต†เตฝ
เดชเดตเตผเดทเต†เดฒเตเดฒเดฟเดฒเต† เดซเด™เตเดทเดฃเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•