Π₯Π΅ΠΉ Π₯Π°Π±Ρ! ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ Π½Π° Π²Π°ΡΠ΅ΡΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠ΅Π²ΠΎΠ΄Π° Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°
ΠΠ±Π΅ΡΠ°Π²Π°ΠΌ, ΡΠ΅ Π½Π΅ Π΅ ΠΎΠΊΡΠΈΠΌΠΎΡΠΎΠ½"
ΠΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠΈΡΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ΠΎΡΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ΅ Π΅Π΄Π½Π° Ρ Π΄ΡΡΠ³Π°, Π½ΠΎ ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π² Powershell. ΠΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΈ Π΅Π·ΠΈΡΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΈΠ»ΠΈ Π½Π΅, ΠΈΠΌΠ°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΈΠΌΠ΅-ΡΡΠΎΠΉΠ½ΠΎΡΡ; ΠΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅, ΠΊΠ°ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΠΈΡΠ΅, ΡΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄. ΠΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠΌ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π΄ΠΎ ΠΎΠ±Π²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠΌΠ΅Π½Π° ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΈ ΠΈΠ·Π±ΡΠ³Π²Π°ΠΌΠ΅ ΡΠ΅ΠΆΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π·Π° ΠΎΠ±Π΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΊΠ°ΡΠΎ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅, ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΡΠΌ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΎΡΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ ΡΡΡ , Π±Π΅Π· Π΄Π° ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΊΠΎΠ΄. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΠ±ΠΎΠ³Π°ΡΠΈΠΌ Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄ Ρ ΠΊΠ»Π°ΡΠΎΠ²Π΅.
ΠΠ°Π³ΠΈΡΡΠ° Π½Π° ΠΊΠ°ΡΡΠΈΡΠ΅
ΠΠ°ΡΡΠΈΡΠ΅ ΡΠ° Π΅Π΄Π½Π° ΠΎΡ Π½Π°ΠΉ-ΠΌΠΎΡΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² 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
}
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠ°ΡΡΠΈΠ½Π³ΡΡ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. Π‘ΡΠ°Π²Π½Π΅ΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° Π½Π° ΠΌΠ°ΡΠΈΠ²Π° ΠΎΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠΈ Π½Π° Cluster, ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° Format-Table, Ρ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅, Π°ΠΊΠΎ ΠΏΡΡΠ²ΠΎ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈΡΠ΅ ΡΠ΅Π·ΠΈ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠΈ Π² ΠΊΠ»Π°Ρ. Π‘Π²ΠΎΠΉΡΡΠ²Π°ΡΠ° Π½Π° Π΄Π°Π΄Π΅Π½ ΠΊΠ»Π°Ρ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ° ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π² ΡΠ΅Π΄Π°, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΌ. ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠΊΡΠΈΡΠ°ΡΠ° ΠΊΠ»ΡΡΠΎΠ²Π° Π΄ΡΠΌΠ° ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠΆΠ΄Π°Ρ Π² ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅.
Π‘ΡΡΡΠ°Π² Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡΡΠ°
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Ρ Π΅Π΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΊΡΠΌ Π²Π°ΡΠΈΡ ΡΠΈΠΏ ΠΊΠ»Π°Ρ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΊΡΠΌ Π²Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° Π²Π°ΡΠΈΡ ΠΊΠ»Π°Ρ
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'"
ΠΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ
Cast ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π° Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈ, Π°ΠΊΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π½Π° Π½Π°ΡΠ°ΡΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π² Cluster
# ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"
ΠΠ°ΡΡΠΈ Π²ΡΠ² Π²Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΏΡΡΠ²ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠ°ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π²ΡΡΡ Ρ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΈ ΡΡΡΡΠΊΡΡΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ²ΠΎΡΠΎ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ Π½Π°ΠΈΡΡΠΈΠ½Π° Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Ρ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ Π»ΠΈ Π΅ Powershell, ΠΊΠΎΠΉΡΠΎ ΠΏΠΈΡΠ°?
ΠΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ°, ΠΈΠ΄Π²Π°ΡΠΈ ΠΎΡ C# ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΡΠ΅Π΄ΠΈ, ΠΏΠΈΡΠ°Ρ Powershell, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° C#. ΠΡΠ°Π²Π΅ΠΉΠΊΠΈ ΡΠΎΠ²Π°, Π²ΠΈΠ΅ ΡΠ΅ ΠΎΡΠ΄Π°Π»Π΅ΡΠ°Π²Π°ΡΠ΅ ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π·Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ»Π·Π° ΠΎΡ ΡΠΎΠ²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΠΏΠΈΡΠ΅ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ Π² ΠΎΠ±Π΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π² Powershell ΠΈΠ»ΠΈ Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅.
ΠΠΊΠΎ ΡΠ°Π·ΡΠΈΡΠ°ΡΠ΅ ΡΠΈΠ»Π½ΠΎ Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΈ Π΄Π°Π½Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈ (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object ΠΈ Ρ.Π½. - ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎ-ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΡΡΠΈΠ» ΠΈ ΡΠ΅ ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Powershell ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΡΡΠΈΠ».
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅
ΠΠ°ΡΡΠΈΡΠ΅, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π΅Π½ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½Π°. Π ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°ΡΠ΅ ΠΌΠ°ΡΠΈΠ² ΠΎΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ForEach-Object.
Π ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡΡ Π½Π° Node ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ Data, ΠΈ ΡΠΎΠ²Π° Π½ΠΈ Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° Π½Π°ΡΠΈΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ° Π²ΡΡΡ Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΡΠ΅ Π³ΡΠΈΠΆΠ°Ρ Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ.
# ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ 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
-
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° dotsource ΡΠ°ΠΉΠ» Ρ ΠΊΠ»Π°ΡΠΎΠ²Π΅:. ./my-classes.ps1. Π’ΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ my-classes.ps1 Π² ΡΠ΅ΠΊΡΡΠΈΡ Π²ΠΈ ΠΎΠ±Ρ Π²Π°Ρ ΠΈ ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΠΎΡ ΡΠ°ΠΉΠ»Π° ΡΠ°ΠΌ.
-
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΌΠΎΠ΄ΡΠ» Powershell, ΠΊΠΎΠΉΡΠΎ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈΡΠ΅ Π²ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ API (ΠΊΡΠ°ΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ) ΠΈ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° ScriptsToProcess = "./my-classes.ps1" Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΠΌΠΎΠ΄ΡΠ» ΡΡΡ ΡΡΡΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ: ./my-classes.ps1 ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Π² Π²Π°ΡΠ°ΡΠ° ΡΡΠ΅Π΄Π°.
ΠΠΎΡΡΠΎ ΠΈ ΠΎΠΏΡΠΈΡ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅, ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ Π½Π° Powershell Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Ρ Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΠΈΠΌΠ΅, Π·Π°ΡΠ΅Π΄Π΅Π½ΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ°.
ΠΠΎΡΠΈ Π°ΠΊΠΎ ΡΡΠ΅ Π·Π°ΡΠ΅Π΄ΠΈΠ»ΠΈ Π΄Π²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΠΊΠ»Π°ΡΠ° Ρ Π΅Π΄Π½Π°ΠΊΠ²ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ°, ΡΠΈΡΠΊΡΠ²Π°ΡΠ΅ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π΅ΡΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
ΠΡΡΡΡ Π½Π°ΠΏΡΠ΅Π΄
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ Π΅ Π½ΠΈΠΊΠΎΠ³Π° Π΄Π° Π½Π΅ ΠΈΠ·Π»Π°Π³Π°ΡΠ΅ Π²Π°ΡΠΈΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅. ΠΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΎΡΠ°ΠΊΠ²Π°ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π΄Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ° ΡΠΈΠΏ, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ ΠΎΡ ΠΊΠ»Π°Ρ, Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ Π²Π°ΡΠΈΡ ΠΌΠΎΠ΄ΡΠ», ΠΊΠΎΡΡΠΎ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΊΠ»Π°ΡΠ°. ΠΠ° ΠΊΠ»ΡΡΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡ New-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
ΠΠ°ΠΊΠ²ΠΎ Π΄ΡΡΠ³ΠΎ Π΄Π° ΡΠ΅ΡΠ°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com