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

自动化对于 DevOps 至关重要,但一切都可以自动化吗?
125 位读者喜欢这篇文章。
CICD with gears

opensource.com

自动化控制手动、费力且容易出错的流程,并用运行自动化脚本的计算机取代执行手动任务的工程师。 每个人都认为手动流程是健康的 DevOps 理念的敌人。 有些人认为自动化不是一件好事,因为它取代了努力工作的工程师,而另一些人则意识到它可以提高一致性、可靠性和效率,节省时间,并且(最重要的是)使工程师能够聪明地工作。

DevOps 不仅仅是自动化或基础设施即代码”——Donovan Brown

自 80 年代初以来,我一直在使用自动化流程和工具链,每当我听到或读到“自动化一切”的建议时,我总是会感到不安。 虽然从技术上讲可以自动化一切,但自动化很复杂,并且在开发、调试和维护方面会带来代价。 如果您曾经掸掉过无法使用的 Azure 资源管理器 (ARM) 模板或您很久以前编写的宝贵维护脚本,并期望它在几个月或几年后完美地执行,您就会明白自动化就像任何其他代码一样,是脆弱的,需要持续的维护和培育。

那么,应该自动化什么以及何时自动化?

  • 自动化您手动执行超过一次或两次的流程。
  • 自动化您将定期和持续执行的流程。
  • 自动化一切可以自动化的东西。

更重要的是,您应该自动化什么?

  • 不要自动化一次性的流程——不值得投资,除非您将其用作参考文档并定期验证以确保它仍然有效。
  • 不要自动化高度不稳定的流程——它太复杂且成本太高。
  • 不要自动化损坏的流程——在自动化之前修复它们。

例如,我的团队不断检查我们通用协作和工程系统上的数百个用户活动,寻找浪费宝贵资金的非活动状态。 如果用户已不活动三个月或更长时间,并且已被分配了昂贵的许可证,我们会将用户恢复为功能较差的免费许可证。

如图 1 所示,这在技术上不是一个具有挑战性的过程。 这是一个令人麻木且容易出错的过程,尤其是在与其他开发和运营任务进行上下文切换时执行时。

Manual process to switch user license

顺便说一句,这是一个通过三个简单步骤创建的价值流程图的示例

  1. 可视化所有活动:列出用户、过滤用户和重置许可证。
  2. 识别利益相关者,即运营和许可团队。
  3. 测量
    • 总提前期 (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

 

PowerShell 是一种基于任务的开源脚本语言。 它在 GitHub 上,构建于 .NET 之上,使您可以自动化 Linux、macOS 和 Windows 进程。 具有开发背景的用户,尤其是 C#,将享受 PowerShell 的全部好处。

下面的 PowerShell 脚本示例通过其服务 REST APIAzure 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%。

Fully automated PowerShell-based process to switch user license

基于 PowerShell 的全自动流程来切换用户许可证

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

这是一个可视化进度的图表

Graph to visualize progress

测量,测量,测量

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

接下来阅读
标签
User profile image.
自 80 年代中期以来,我一直致力于软件工程的简单性和可维护性。 作为一名软件工程师,我分析、设计、开发、测试和支持软件解决方案。

4 条评论

Linux/MacOS 上 PowerShell 的最大问题在于它将用损坏的命令替换有效的命令,并且它没有出现在大多数发行版中,因此保持它的最新状态将是保持系统最新状态之外的额外任务,这确实增加了 DevOps 的工作量。 有一些工具,例如 ELK,可以用于监控活动,并且拥有集中式日志在您必须弄清楚为什么出现问题时会带来其他好处。

好的文章

最好的!

我正在学习 Windows PowerShell。 你能给我一些真正好的参考资料,告诉我从哪里开始吗?

谢谢
Rony

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.