当前位置: 首页 > 科技观察

使用Powershell自动化Linux、macOS和Windows进程

时间:2023-03-22 11:00:29 科技观察

自动化是DevOps的关键,但任何东西都可以自动化吗?自动化控制了那些手动、费力且容易出错的流程,用运行自动化脚本的计算机取代了执行手动任务的工程师。每个人都同意手动流程是健康DevOps模型的敌人。一些人认为自动化是一件坏事,因为它取代了辛勤工作的工程师,而另一些人则意识到它提高了一致性、可靠性和效率,节省了时间,并且(最重要的是)使工程师能够聪明地工作。“DevOps不仅仅是自动化或基础架构即代码。”—DonovanBrown自从我在80年代初期开始使用自动化流程和工具链以来,每当我听到或读到“使一切自动化”的建议时,我总是会感到兴奋。虽然在技术上可以实现一切自动化,但自动化很复杂,并且需要付出开发、调试和维护的代价。如果您曾重新启用久违的Azure资源管理器(ARM)模板或很久以前编写的有价值的维护脚本,并希望它在数月或数年后仍能完美运行,那么您就会明白自动化与任何其他代码一样,它是脆弱,需要不断的维护和培育。那么,您应该自动化什么以及何时自动化?当您多次手动执行自动化过程时当您需要频繁且持续地执行自动化过程时自动化任何可以自动化的东西,更重要的是,您不应该自动化什么?不要自动化一次性流程,因为它不值得投资,除非您将其重新用作参考文档并定期验证其可用性不要自动化高度易变的流程,因为它太复杂和昂贵修复他们首先例如,我的团队使用我们共同的协作和工程系统来持续监控数百个用户活动。如果用户已闲置三个月或更长时间,并且为该用户分配了昂贵的许可证,我们会将该用户重新分配给功能较少但免费的许可证。如图1所示,这是一个没有技术挑战性的过程。这是一个复杂且容易出错的过程,尤其是在与其他开发和运营任务切换执行上下文时。图1手动切换用户许可证的过程顺便说一下,这是一个通过三个简单步骤创建的价值流图示例:可视化所有活动:列出用户、过滤用户、重置许可证。确定利益相关者,即运营和授权团队。措施:*总提前期(TLT)=13小时*总周期时间(TCT)=1.5小时*总效率%=TLT/TCT*100=11.5%如果您将其中一个挂在人流量大且容易看到的区域视觉副本,例如在您团队的讨论区、餐厅或去洗手间的路上,您将引发大量讨论和主动反馈。例如,从视觉上看,人工任务很明显是一种浪费,主要是流程等待时间长。让我们检查一个自动执行此过程的简单PowerShell脚本,如图2所示,将总交付时间从13小时减少到4小时加60秒,并将整体效率从11.5%提高到12.75%。图2.半自动PowerShell脚本Switch用户许可PowerShell是一种开源的基于任务的脚本语言。它在GitHub上可用。它基于.NET构建,允许您自动化Linux、macOS和Windows进程。具有开发背景的用户,尤其是C#用户,将享受PowerShell的全部好处。以下示例PowerShell脚本通过其服务RESTAPI与AzureDevOps通信。该脚本结合了图1中的手动ListUsers和FilterUsers任务,以识别Demo组织中两个月没有活动并使用Basic许可证或更昂贵的Basic+Test许可证的所有用户,并添加用户的详细信息输出到控制台。这很容易!首先,设置身份验证标头和其他变量,稍后将在初始化脚本中使用:param([string]$orgName="DEMO",[int]$months="-2",[string]$patToken="")#使用个人访问令牌(PAT)的基本身份验证标头$basicAuth=("{0}:{1}"-f"",$patToken)$basicAuth=[System.Text.Encoding]::UTF8.GetBytes($basicAuth)$basicAuth=[System.Convert]::ToBase64String($basicAuth)$headers=@{Authorization=("Basic{0}"-f$basicAuth)}#RESTAPI请求获取所有权利$request_GetEntitlements="https://vsaex.dev.azure.com/"+$orgName+"/_apis/userentitlements?top=10000&api-version=5.1-preview.2";#初始化数据变量$members=New-ObjectSystem.Collections.ArrayList[int]$count=0;[string]$basic="Basic";[string]$basicTest="Basic+测试计划";接下来,使用此脚本查询所有授权以识别非活动用户:#SendtheRESTAP我请求并初始化成员数组列表。$response=Invoke-RestMethod-Uri$request_GetEntitlements-headers$headers-MethodGet$response.items|ForEach对象{$members.add($_.id)|out-null}#遍历所有用户权利$response.items|ForEach-Object{$name=[string]$_.user.displayName;$date=[日期时间]$_.lastAccessedDate;$expired=获取日期;$expired=$expired.AddMonths($months);$license=[string]$_.accessLevel.AccountLicenseType;$licenseName=[string]$_.accessLevel.LicenseDisplayName;$计数++;if($expired-gt$date){#忽略从未或尚未激活他们的许可证的用户if($date.Year-eq1){Write-Host"**INACTIVE**""Name:"$name"LastAccess:"$date"License:"$licenseName}#LookforBASIClicenseelseif($licenseName-eq$basic){写主机"**INACTIVE**""Name:"$name"LastAccess:"$date"License:"$licenseName}#LookforBASIC+TESTlicenseelseif($licenseName-eq$basicTest){Write-Host"**INACTIVE**""Name:"$name"最后访问:"$date"License:"$licenseName}}}运行脚本时,您将获得以下输出,您可以将其转发给许可团队以重置用户许可:**INACTIVE**名称:Demo1最后访问时间:2019/09/0611:01:26AM许可证:Basic**INACTIVE**名称:Demo2最后访问时间:2019/06/0408:53:15AM许可证:Basic**INACTIVE**名称:Demo3最后访问时间:2019/09/2612:54:57PM许可证:Basic**INACTIVE**名称:Demo4最后访问时间:2019/06/0712:03:18PM许可证:Basic**INACTIVE**名称:Demo5最后访问时间:2019/07/1810:35:11AM许可证:Basic**INACTIVE**名称:Demo6最后访问时间:2019/10/0309:21:20AM许可证:Basic**INACTIVE**名称:Demo7最后访问时间:2019/10/0211:45:55AM许可证:Basic**INACTIVE**名称:Demo8最后访问时间:2019/09/2001:36:29PM许可证:Basic+测试计划**INACTIVE**名称:Demo9LastAccess:2019/08/2810:58:22AMLicense:Basic如果将最后一步自动化,自动将用户许可设置为freestakeholderlicense,如图3所示,可以进一步减少整体交付时间缩短至65秒,整体效率提高至77%图3基于Powershell的全自动流程来切换用户许可证。这个PowerShell脚本的核心价值不仅在于能够自动化,还在于能够定期、连续和快速地执行该过程。进一步的改进是使用AzurePipelines等调度程序每周或每天触发脚本,但我会在以后的帖子中保留编程许可证重置和脚本调度。下面是可视化进度的图表:图4,度量,度量,度量我希望您喜欢这个对自动化、PowerShell、RESTAPI和价值流映射的简短介绍。