自动化控制手动、费力且容易出错的流程,并用运行自动化脚本的计算机取代执行手动任务的工程师。 每个人都认为手动流程是健康的 DevOps 理念的敌人。 有些人认为自动化不是一件好事,因为它取代了努力工作的工程师,而另一些人则意识到它可以提高一致性、可靠性和效率,节省时间,并且(最重要的是)使工程师能够聪明地工作。
“DevOps 不仅仅是自动化或基础设施即代码”——Donovan Brown。
自 80 年代初以来,我一直在使用自动化流程和工具链,每当我听到或读到“自动化一切”的建议时,我总是会感到不安。 虽然从技术上讲可以自动化一切,但自动化很复杂,并且在开发、调试和维护方面会带来代价。 如果您曾经掸掉过无法使用的 Azure 资源管理器 (ARM) 模板或您很久以前编写的宝贵维护脚本,并期望它在几个月或几年后完美地执行,您就会明白自动化就像任何其他代码一样,是脆弱的,需要持续的维护和培育。
那么,应该自动化什么以及何时自动化?
- 自动化您手动执行超过一次或两次的流程。
- 自动化您将定期和持续执行的流程。
- 自动化一切可以自动化的东西。
更重要的是,您应该不自动化什么?
- 不要自动化一次性的流程——不值得投资,除非您将其用作参考文档并定期验证以确保它仍然有效。
- 不要自动化高度不稳定的流程——它太复杂且成本太高。
- 不要自动化损坏的流程——在自动化之前修复它们。
例如,我的团队不断检查我们通用协作和工程系统上的数百个用户活动,寻找浪费宝贵资金的非活动状态。 如果用户已不活动三个月或更长时间,并且已被分配了昂贵的许可证,我们会将用户恢复为功能较差的免费许可证。
如图 1 所示,这在技术上不是一个具有挑战性的过程。 这是一个令人麻木且容易出错的过程,尤其是在与其他开发和运营任务进行上下文切换时执行时。

顺便说一句,这是一个通过三个简单步骤创建的价值流程图的示例
- 可视化所有活动:列出用户、过滤用户和重置许可证。
- 识别利益相关者,即运营和许可团队。
- 测量
- 总提前期 (TLT) = 13 小时
- 总周期时间 (TCT) = 1.5 小时
- 总效率百分比 = TLT/TCT*100 = 11.5%
如果您在高流量和高可见度区域(例如您团队的休息区、自助餐厅或通往洗手间的路上)张贴这些可视化的副本,您将引发大量的讨论和主动提供的反馈。 例如,通过查看视觉效果,很明显手动任务是一种浪费,主要由较长的流程等待时间引起。
让我们探索一个简单的 PowerShell 脚本来自动化该流程,如图 2 所示,将总提前期从 13 小时减少到 4 小时 60 秒,并将整体效率从 11.5% 提高到 12.75%。

PowerShell 是一种基于任务的开源脚本语言。 它在 GitHub 上,构建于 .NET 之上,使您可以自动化 Linux、macOS 和 Windows 进程。 具有开发背景的用户,尤其是 C#,将享受 PowerShell 的全部好处。
下面的 PowerShell 脚本示例通过其服务 REST API 与 Azure DevOps 通信。 该脚本结合了图 1 中的手动列表用户和过滤用户任务,识别 DEMO 组织中所有两个月未活动且使用 Basic 或更昂贵的 Basic + Test 许可证的用户,并将用户的详细信息输出到控制台。 简单!
首先,设置身份验证标头和将在稍后用于此初始化脚本的其他变量
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%。

基于 PowerShell 的全自动流程来切换用户许可证
此 PowerShell 脚本的核心价值不仅在于自动化的能力,还在于定期、一致且快速地执行该流程。 进一步的改进将使用 Azure 管道等调度程序每周或每天触发脚本,但我会将程序化许可证重置和脚本调度保留在以后的文章中。
这是一个可视化进度的图表

测量,测量,测量
我希望您喜欢这次关于自动化、PowerShell、REST API 和价值流程图的简短旅程。 请在评论中分享您的想法和反馈。
4 条评论