เจ•เจฒเจพเจธเจพเจ‚ เจตเจพเจฒเจพ เจซเฉฐเจ•เจธเจผเจจเจฒ เจชเจพเจตเจฐเจธเจผเฉˆเจฒ เจ‡เฉฑเจ• เจ†เจ•เจธเฉ€เจฎเฉ‹เจฐเฉ‹เจจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฎเฉˆเจ‚ เจ‡เจธเจฆเฉ€ เจ—เจฐเฉฐเจŸเฉ€ เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚

เจนเฉ‡ เจนเจฌเจฐ! เจฎเฉˆเจ‚ เจฒเฉ‡เจ– เจฆเจพ เจ…เจจเฉเจตเจพเจฆ เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚ "เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ PowerShellเฅค
เจฎเฉˆเจ‚ เจตเจพเจ…เจฆเจพ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ‡เจน เจ†เจ•เจธเฉ€เจฎเฉ‹เจฐเฉ‹เจจ เจจเจนเฉ€เจ‚ เจนเฉˆ"
เจ•เฉเจฐเจฟเจธเจŸเฉ‹เจซเจฐ เจ•เฉเจš เจฆเฉเจ†เจฐเจพ.

เจ†เจฌเจœเฉˆเจ•เจŸ-เจ“เจฐเฉ€เจเจ‚เจŸเจฟเจก เจ…เจคเฉ‡ เจซเฉฐเจ•เจธเจผเจจเจฒ เจชเฉเจฐเฉ‹เจ—เฉเจฐเจพเจฎเจฟเฉฐเจ— เจชเฉˆเจฐเจพเจกเจพเจˆเจฎเจœเจผ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจฎเจคเจญเฉ‡เจฆ เจœเจพเจชเจฆเฉ‡ เจนเจจ, เจชเจฐ เจชเจพเจตเจฐเจธเจผเฉ‡เจฒ เจตเจฟเฉฑเจš เจฆเฉ‹เจตเฉ‡เจ‚ เจฌเจฐเจพเจฌเจฐ เจธเจฎเจฐเจฅเจฟเจค เจนเจจเฅค เจฒเจ—เจญเจ— เจธเจพเจฐเฉ€เจ†เจ‚ เจชเฉเจฐเฉ‹เจ—เฉเจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚, เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจœเจพเจ‚ เจจเจนเฉ€เจ‚, เจตเจฟเจธเจคเฉเจฐเจฟเจค เจจเจพเจฎ-เจฎเฉเฉฑเจฒ เจฌเจพเจˆเจกเจฟเฉฐเจ— เจฒเจˆ เจธเฉเจตเจฟเจงเจพเจตเจพเจ‚ เจนเจจ; เจ•เจฒเจพเจธเจพเจ‚, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจขเจพเจ‚เจšเฉ‡ เจ…เจคเฉ‡ เจฐเจฟเจ•เจพเจฐเจก, เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจชเจนเฉเฉฐเจš เจนเจจเฅค เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ€ เจธเจพเจกเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเฉ‚เฉฐ เจจเจพเจฎเจพเจ‚ เจ…เจคเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจฆเฉ‡ เจฌเฉฐเจงเจจ เจคเฉฑเจ• เจธเฉ€เจฎเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจญเจพเจฐเฉ€ เจตเจธเจคเฉ‚-เจ…เจงเจพเจฐเจฟเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจงเจพเจฐเจจเจพเจตเจพเจ‚ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจตเจฟเจฐเจพเจธเจค, เจฌเจนเฉเจฐเฉ‚เจชเจคเจพ, เจœเจพเจ‚ เจชเจฐเจฟเจตเจฐเจคเจจเจธเจผเฉ€เจฒเจคเจพ เจคเฉ‹เจ‚ เจฌเจšเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฌเจฃเจพเจ เจฌเจฟเจจเจพเจ‚ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจฒเจพเจญเจพเจ‚ เจฆเจพ เจฒเจพเจญ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ…เจŸเฉฑเจฒ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจชเจฐเจฟเจตเจฐเจคเจจ เจตเจฟเจงเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจ•เฉ‡, เจ…เจธเฉ€เจ‚ เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจธเจพเจกเฉ‡ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ…เจฎเฉ€เจฐ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

เจœเจพเจคเจพเจ‚ เจฆเจพ เจœเจพเจฆเฉ‚

เจชเจพเจตเจฐเจธเจผเฉ‡เจฒ เจตเจฟเฉฑเจš เจœเจพเจคเจพเจ‚ เจธเจญ เจคเฉ‹เจ‚ เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเจจเฅค เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจฎเฉเฉฑเจฒ เจชเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจ…เจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ 'เจคเฉ‡ เจญเจฐเฉ‹เจธเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจตเจพเจคเจพเจตเจฐเจฃ เจคเฉเจนเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฆเจพ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจฟเจฐเจซเจผ [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"

เจคเฉเจนเจพเจกเฉ‡ เจ•เจพเจฐเจœเจพเจคเจฎเจ• เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจœเจพเจคเจพเจ‚

เจซเฉฐเจ•เจธเจผเจจเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจชเจนเจฟเจฒเจพเจ‚ เจกเฉ‡เจŸเจพ เจธเจŸเจฐเจ•เจšเจฐ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจจ, เจซเจฟเจฐ เจชเจฐเจฟเจตเจฐเจคเจจเจธเจผเฉ€เจฒ เจกเฉ‡เจŸเจพ เจธเจŸเฉเจฐเจ•เจšเจฐ เจ‰เฉฑเจคเฉ‡ เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจตเจœเฉ‹เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจตเจฟเจฐเฉ‹เจงเจพเจญเจพเจธเฉ€ เจชเฉเจฐเจญเจพเจต เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, เจ•เจฒเจพเจธเจพเจ‚ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจจเฉ‚เฉฐ เจซเฉฐเจ•เจธเจผเจจเจฒ เจ•เฉ‹เจก เจฒเจฟเจ–เจฃ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจŸเจพเจˆเจช เจชเจฐเจฟเจตเจฐเจคเจจ เจตเจฟเจงเฉ€เจ†เจ‚ เจฆเจพ เจงเฉฐเจจเจตเจพเจฆเฅค

เจ•เฉ€ Powershell เจœเฉ‹ เจฎเฉˆเจ‚ เจฒเจฟเจ– เจฐเจฟเจนเจพ เจนเจพเจ‚ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจนเฉˆ?

C# เจœเจพเจ‚ เจธเจฎเจพเจจ เจชเจฟเจ›เฉ‹เจ•เฉœ เจตเจพเจฒเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเฉ‹เจ• Powershell เจฒเจฟเจ– เจฐเจนเฉ‡ เจนเจจ, เจœเฉ‹ เจ•เจฟ C# เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ เจซเฉฐเจ•เจธเจผเจจเจฒ เจชเฉเจฐเฉ‹เจ—เฉเจฐเจพเจฎเจฟเฉฐเจ— เจธเฉฐเจ•เจฒเจชเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฆเฉ‚เจฐ เจœเจพ เจฐเจนเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจชเจพเจตเจฐเจธเจผเฉ‡เจฒ เจตเจฟเฉฑเจš เจ†เจฌเจœเฉˆเจ•เจŸ-เจ“เจฐเฉ€เจเจ‚เจŸเจก เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจ—เฉ‹เจคเจพเจ–เฉ‹เจฐเฉ€ เจ•เจฐเจจ เจœเจพเจ‚ เจซเฉฐเจ•เจธเจผเจจเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจธเจฟเฉฑเจ–เจฃ เจคเฉ‹เจ‚ เจธเฉฐเจญเจพเจตเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจฒเจพเจญ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹เจ—เฉ‡เฅค

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, เจ†เจฆเจฟ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ…เจŸเฉฑเจฒ เจกเจพเจŸเจพ เจฌเจฆเจฒเจฃ 'เจคเฉ‡ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจญเจฐเฉ‹เจธเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ - เจคเจพเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจตเจงเฉ‡เจฐเฉ‡ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจธเจผเฉˆเจฒเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ Powershell เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเจพ เจซเจพเจ‡เจฆเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เฉฑเจ• เจ•เจพเจฐเจœเจพเจคเจฎเจ• เจธเจผเฉˆเจฒเฉ€ เจตเจฟเฉฑเจš เจ•เจฒเจพเจธเจพเจ‚.

เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ€ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจตเจฐเจคเฉ‹เจ‚

เจœเจพเจคเฉ€เจ†เจ‚, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‰เจน เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจชเจฟเจ• เจธเฉฐเจŸเฉˆเจ•เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจฆเฉ‹ เจกเฉ‹เจฎเฉ‡เจจเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจฎเฉˆเจชเจฟเฉฐเจ— เจนเจจเฅค เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ 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 เจจเฉ‚เฉฐ เจšเจฒเจพเจเจ—เจพ เจ…เจคเฉ‡ เจ‰เฉฑเจฅเฉ‡ เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฒเจพเจธเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเฉ‡เจ—เจพเฅค

  • เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• Powershell เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจคเฉเจนเจพเจกเฉ‡ เจธเจพเจฐเฉ‡ เจ•เจธเจŸเจฎ 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
PowerShell เจตเจฟเฉฑเจš เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹