使用 Powershell 来自动化 Linux、macOS 以及 Windows 流程
创始人
2024-03-02 09:03:53
0

自动化是 DevOps 的关键,但是,是否任何事都可以自动化?

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

“DevOps 并不只是自动化或者基础架构即代码。” — Donovan Brown

自从上个世纪 80 年代早期开始使用自动化流程和工具链以来,每当我听到或读到“自动化一切”的建议时,我总是会激动不已。虽然在技术上可以实现一切自动化,但自动化是复杂的,并且需要付出开发、调试和维护方面的代价。如果你曾经重新启用一个许久不用的 Azure 资源管理器(ARM)模板或很久以前编写的宝贵维护脚本,并期望它在几个月或几年之后仍然能够完美地执行,那么你就会明白,自动化就像任何其他代码一样,是脆弱的,需要持续的维护和培养。

所以,你应该对什么进行自动化并在何时进行自动化?

  • 当你手动执行自动化流程超过一两次
  • 当你需要经常地持续地执行自动化流程
  • 自动化任何可被自动化的

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

  • 不要自动化一次性的流程,因为不值得投入,除非你会重新使用它作为参考文档,并定期验证它的可用性
  • 不要自动化高度不稳定的流程,因为太复杂且昂贵
  • 不要自动化有问题的流程,在自动化前先修复它们

举例来说,我的团队使用我们通用的协作和工程系统来不断的监控数百个用户活动。如果一个用户在三个月或者更长时间处于非活动状态,并且这个用户被分配了一个昂贵的许可证,我们就会重分配这个用户一个功能少一些但是免费的许可证。

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

Manual process to switch user license

图 1 手工流程切换用户许可证

顺带的,这里有一个用简单三步创建的价值流图的例子:

  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

图 2 半自动化的 PowerShell 脚本切换用户许可

PowerShell 是一种开源的基于任务的脚本语言。它可以在 GitHub 上找到。它构建在 .NET 上,允许你自动化 Linux、macOS 和 Windows 流程。具有开发背景的用户,特别是 C# 用户,将享受到 PowerShell 的全部好处。

下面的 PowerShell 脚本示例通过它的服务 REST APIAzure DevOps 进行通信。脚本结合了在图 1 中的手动列表用户和过滤用户任务,识别了 Demo 组织中的所有两个月没有活动的、使用基本许可证或更昂贵的基本+测试许可证的用户,并将用户的详细信息输出到控制台。很简单!

首先,设置认证标头和其他变量,这些变量将在稍后的初始化脚本中使用:

param(
  [string]   $orgName       = "DEMO",
  [int]      $months        = "-2",
  [string]   $patToken      = ""
)

# 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

图 3 完全自动化的基于 Powershell 的流程来切换用户许可证。

这个 PowerShell 脚本的核心价值不仅在于能够实现 自动化,还在于能够 定期持续快速地 执行这个流程。进一步的改进是使用 Azure 管道等调度器每周或每天触发脚本,但我将把程序化的许可证重置和脚本调度保留在未来的文章中。

这里有一个图表,可以直观地看到进展情况:

图 4,措施,措施,措施

我希望你能喜欢这个简短的关于自动化、PowerShell、REST API 和价值流图的介绍。请在评论中分享你的想法和反馈。


via: https://opensource.com/article/20/2/devops-automation

作者:Willy-Peter Schaub 选题:lujun9972 译者:FigaroCao 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

2026年度中国AI原生C...
随着人工智能技术的深入发展,传统CRM系统已无法满足企业对智能化、...
2026-01-21 16:17:15
丹之辰AI超级员工:以智能...
在2023年全球经济充满不确定性的背景下,成本控制已成为企业生存与...
2026-01-21 10:48:38
HR的日常工作,应如何用A...
DeepSeek、Kimi、豆包、文心一言等各种AI工具的出现,让...
2026-01-20 18:46:53
2025年AI智能体手册
今天分享的是:2025年AI智能体手册 报告共计:46页 AI智能...
2026-01-20 18:24:29
分板机设备厂家推荐马丁特尼...
推进PCBA产线自动化以来,分板机的“适配性”和“运维难”一直是我...
2026-01-20 18:24:27
服役约23年:微软退役Wi...
IT之家 1 月 13 日消息,科技媒体 NeoWin 昨日(1 ...
2026-01-19 19:29:11

热门资讯

如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Textual:为 Pytho... 快速入门使用 TextualPython 在 Linux 上有像 TkInter 这样的优秀 GUI...
硬核观察 #1245 Open... #1 OpenAI 悄然删除禁止将 ChatGPT 用于 “军事和战争” 的禁令在 1 月 10 日...
使用时间序列数据,用开源工具助... InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。收集到...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
硬核观察 #1249 LG 洗... #1 LG 洗衣机每天上传近 4GB 的数据?一个名为 Johnie 的 LG 洗衣机用户发现,他的...
2024 年 Linux 和开... 让我们尝试预测未来吧!新的一年快乐,朋友们 ✨2024 年的钟声已经敲过,我们有必要去预见一下将塑造...