使用 Powershell 來自動化 Linux、macOS 以及 Windows 流程
自動化控制了那些手工的、費力的和容易出錯的過程,用運行自動化腳本的計算機代替了執行手工任務的工程師。每個人都認同手工流程是健康的 DevOps 模式的敵人。一些人認為自動化不是一件好事,因為它取代了辛勤工作的工程師,而另一些人則意識到它提高了一致性、可靠性和效率,節省了時間,(最重要的是)使工程師能夠聰明地工作。
「DevOps 並不只是自動化或者基礎架構即代碼。」 — Donovan Brown
自從上個世紀 80 年代早期開始使用自動化流程和工具鏈以來,每當我聽到或讀到「自動化一切」的建議時,我總是會激動不已。雖然在技術上可以實現一切自動化,但自動化是複雜的,並且需要付出開發、調試和維護方面的代價。如果你曾經重新啟用一個許久不用的 Azure 資源管理器(ARM)模板或很久以前編寫的寶貴維護腳本,並期望它在幾個月或幾年之後仍然能夠完美地執行,那麼你就會明白,自動化就像任何其他代碼一樣,是脆弱的,需要持續的維護和培養。
所以,你應該對什麼進行自動化並在何時進行自動化?
- 當你手動執行自動化流程超過一兩次
- 當你需要經常地持續地執行自動化流程
- 自動化任何可被自動化的
更重要的是,什麼是你不應該自動化的?
- 不要自動化一次性的流程,因為不值得投入,除非你會重新使用它作為參考文檔,並定期驗證它的可用性
- 不要自動化高度不穩定的流程,因為太複雜且昂貴
- 不要自動化有問題的流程,在自動化前先修復它們
舉例來說,我的團隊使用我們通用的協作和工程系統來不斷的監控數百個用戶活動。如果一個用戶在三個月或者更長時間處於非活動狀態,並且這個用戶被分配了一個昂貴的許可證,我們就會重分配這個用戶一個功能少一些但是免費的許可證。
如圖 1 所示,這是一個沒有技術挑戰性的流程。這是一個令人費解且容易出錯的過程,尤其是在執行上下文時與其他開發和運維任務切換時。
![Manual process to switch user license](/data/attachment/album/202111/23/123009p8u8ouddseevsugr.png "Manual process to switch user license")
圖 1 手工流程切換用戶許可證
順帶的,這裡有一個用簡單三步創建的價值流圖的例子:
- 可視化所有活動: 列出用戶、過濾用戶、重置許可證。
- 確定利益相關者,即運營和授權團隊。
- 措施:
* 總交貨時間(TLT)= 13 小時
* 總周期時間(TCT) = 1.5 小時
* 總效率百分比 = TLT/TCT*100 = 11.5%
如果你在人群流量大和容易看到的區域掛一個這些可視化的副本,比如在你的團隊的討論區、餐廳,或在去洗手間的路上,你將引發大量的討論和主動反饋。例如,從視覺上看,很明顯,手工任務是一種浪費,主要是由於漫長的流程等待時間造成的。
讓我們研究一個簡單的 PowerShell 腳本,它可以自動化該流程,如圖 2 所示,將總交付時間從 13 小時減少到 4 小時加 60 秒,並將總體效率從 11.5 提高到 12.75%。
![Semi-automated PowerShell-based process to switch user license](/data/attachment/album/202111/23/123010owwfcklwsk4ywse4.png "Semi-automated PowerShell-based process to switch user license")
圖 2 半自動化的 PowerShell 腳本切換用戶許可
PowerShell 是一種開源的基於任務的腳本語言。它可以在 GitHub 上找到。它構建在 .NET 上,允許你自動化 Linux、macOS 和 Windows 流程。具有開發背景的用戶,特別是 C# 用戶,將享受到 PowerShell 的全部好處。
下面的 PowerShell 腳本示例通過它的服務 REST API 與 Azure DevOps 進行通信。腳本結合了在圖 1 中的手動列表用戶和過濾用戶任務,識別了 Demo 組織中的所有兩個月沒有活動的、使用基本許可證或更昂貴的基本+測試許可證的用戶,並將用戶的詳細信息輸出到控制台。很簡單!
首先,設置認證標頭和其他變數,這些變數將在稍後的初始化腳本中使用:
param(
[string] $orgName = "DEMO",
[int] $months = "-2",
[string] $patToken = "<PAT>"
)
# Basic authentication header using the personal access token (PAT)
$basicAuth = ("{0}:{1}" -f "",$patToken)
$basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth = [System.Convert]::ToBase64String($basicAuth)
$headers = @{Authorization=("Basic {0}" -f $basicAuth)}
# REST API Request to get all entitlements
$request_GetEntitlements = "https://vsaex.dev.azure.com/" + $orgName + "/_apis/userentitlements?top=10000&api-version=5.1-preview.2";
# Initialize data variables
$members = New-Object System.Collections.ArrayList
[int] $count = 0;
[string] $basic = "Basic";
[string] $basicTest = "Basic + Test Plans";
接下來,使用此腳本查詢所有授權,以識別不活動用戶:
# Send the REST API request and initialize the members array list.
$response = Invoke-RestMethod -Uri $request_GetEntitlements -headers $headers -Method Get
$response.items | ForEach-Object { $members.add($_.id) | out-null }
# Iterate through all user entitlements
$response.items | ForEach-Object {
$name = [string]$_.user.displayName;
$date = [DateTime]$_.lastAccessedDate;
$expired = Get-Date;
$expired = $expired.AddMonths($months);
$license = [string]$_.accessLevel.AccountLicenseType;
$licenseName = [string]$_.accessLevel.LicenseDisplayName;
$count++;
if ( $expired -gt $date ) {
# Ignore users who have NEVER or NOT YET ACTIVATED their license
if ( $date.Year -eq 1 ) {
Write-Host " **INACTIVE** " " Name: " $name " Last Access: " $date "License: " $licenseName
}
# Look for BASIC license
elseif ( $licenseName -eq $basic ) {
Write-Host " **INACTIVE** " " Name: " $name " Last Access: " $date "License: " $licenseName
}
# Look for BASIC + TEST license
elseif ( $licenseName -eq $basicTest ) {
Write-Host " **INACTIVE** " " Name: " $name " Last Access: " $date "License: " $licenseName
}
}
}
當你運行腳本時,你將得到以下輸出,你可以將其轉發給授權團隊,以重置用戶許可證:
**INACTIVE** Name: Demo1 Last Access: 2019/09/06 11:01:26 AM License: Basic
**INACTIVE** Name: Demo2 Last Access: 2019/06/04 08:53:15 AM License: Basic
**INACTIVE** Name: Demo3 Last Access: 2019/09/26 12:54:57 PM License: Basic
**INACTIVE** Name: Demo4 Last Access: 2019/06/07 12:03:18 PM License: Basic
**INACTIVE** Name: Demo5 Last Access: 2019/07/18 10:35:11 AM License: Basic
**INACTIVE** Name: Demo6 Last Access: 2019/10/03 09:21:20 AM License: Basic
**INACTIVE** Name: Demo7 Last Access: 2019/10/02 11:45:55 AM License: Basic
**INACTIVE** Name: Demo8 Last Access: 2019/09/20 01:36:29 PM License: Basic + Test Plans
**INACTIVE** Name: Demo9 Last Access: 2019/08/28 10:58:22 AM License: Basic
如果你將最後一步自動化,自動將用戶許可設置為一個自由的利益相關方許可,如圖3所示,你可以進一步將總體交付時間減少到65秒,並將總體效率提高到77%。
![Fully automated PowerShell-based process to switch user license](/data/attachment/album/202111/23/123010rujao3maq8aonx3j.png "Fully automated PowerShell-based process to switch user license")
圖 3 完全自動化的基於 Powershell 的流程來切換用戶許可證。
這個 PowerShell 腳本的核心價值不僅在於能夠實現 自動化,還在於能夠 定期、持續 和 快速地 執行這個流程。進一步的改進是使用 Azure 管道等調度器每周或每天觸髮腳本,但我將把程序化的許可證重置和腳本調度保留在未來的文章中。
這裡有一個圖表,可以直觀地看到進展情況:
![Graph to visualize progress](/data/attachment/album/202111/23/123010rqt8zwttdvevtnmv.png "Graph to visualize progress")
圖 4,措施,措施,措施
我希望你能喜歡這個簡短的關於自動化、PowerShell、REST API 和價值流圖的介紹。請在評論中分享你的想法和反饋。
via: https://opensource.com/article/20/2/devops-automation
作者:Willy-Peter Schaub 選題:lujun9972 譯者:FigaroCao 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive