在部署服务器时,人们要么将其从安装包中解压,要么使用 GUI 进行操作,你也是其中的一员吗?我在事业起步时就是这么操作的。但是,在过去的几年当中,我逐渐适应了通过代码来部署服务器及其相关资源。通过使用 PowerShell 或者 Azure CLI,或者两者结合。
我自学了一系列工具,如 Visual Studio Code, Git, GitHub 甚至是 Azure DevOps 来完成任务。一路走来并不容易,但却有趣而充满挑战。
2019 年末,GitHub 发布了GitHub Actions,GitHub Actions 可以自动从 GitHub 代码库中部署代码。当我的同事和朋友们开始深入了解并演示这项服务时,我就一直饶有兴趣,并决定自己上手,看看能给 IT 专家社区带来些什么,我始终坚定地相信,这些工具可以给 IT 专家们带来很好的机遇。
GitHub Actions 术语
在我详细讲解之前,需要提一提 GitHub Actions 的相关术语。
Action – 定义我们能做何种操作,我们可以从市场中免费获得,或自己创建。
Workflow – 工作流,事件发生时所完成的一系列环境变量、任务以及步骤。
Jobs – 任务,工作流所要执行的任务。
Steps - 步骤,任务使用一项 Action 所接收的步骤。
Event – 事件,发生时可以触发工作流的事件,例如向一个代码库提交代码时,会触发一个 Issue 或 PR。
你想构建什么?
简单点说,我想用 GitHub Action 在 Azure 中创建虚拟机(VM)。再明确一点说,我想让它在同一资源群组下,构建虚拟机及其相关的支持性技术(存储磁盘,网络接口,虚拟网络,存储账户等)。这不是最佳的实践范式,但却是一个对新手十分友好的例子,且有详细的文档记录。
只需要使用四段 Azure CLI 代码,就能在 Azure 中创建 VM。第一段代码使用 Azure Service Principal 登录我的 Azure 订阅并执行创建 VM 的必需步骤。
#region Login
# This logs into Azure with a Service Principal Account
#
Write-Output "Logging in to Azure with a service principal..."
az login `
--service-principal `
--username $servicePrincipal `
--password $servicePrincipalSecret `
--tenant $servicePrincipalTenantId
Write-Output "Done"
Write-Output ""
#endregion
复制代码
下一段代码将选择正确的订阅,确保我的资源分配至正确的位置:
#region Subscription
#This sets the subscription the resources will be created in
Write-Output "Setting default azure subscription..."
az account set `
--subscription $azureSubscriptionName
Write-Output "Done"
Write-Output ""
#endregion
复制代码
第三段代码将为虚拟机构建赖以生存的资源组:
#region Create Resource Group
# This creates the resource group used to house the VM
Write-Output "Creating resource group $resourceGroupName in region $resourceGroupNameRegion..."
az group create `
--name $resourceGroupName `
--location $resourceGroupNameRegion
Write-Output "Done creating resource group"
Write-Output ""
#endregion
复制代码
第四段代码将在资源组里创建 VM:
#region Create VM
# Create a VM in the resource group
Write-Output "Creating VM..."
try {
az vm create `
--resource-group $resourceGroupName `
--name $serverName `
--image win2016datacenter `
--admin-username $adminLogin `
--admin-password $adminPassword
}
catch {
Write-Output "VM already exists"
}
Write-Output "Done creating VM"
Write-Output ""
#endregion
复制代码
这些代码并不复杂, 在很多文档和教程里你都会看到这个著名的示例。在我的脚本中,我使用了多种参数,从而确保信息能被安全的存储或者导入至我的工作流文件中。完整的 PowerShell 脚本 请点击此处。
我该如何创建 Action?
为了启动 VM 构建,我们创建一个 YAML 格式的工作流文件。工作流文件的名字可以是任意合法命名,它以.yml
或.yaml
结尾作为扩展名。还需要存储在 GitHub 库的特定目录中,即.github/workflows
。
您的工作流文件分为几个部分,让我们分别查看每个部分:
元数据
我们从命名工作流开始:
name: GitHub for IT Pro CI/CD Pipeline
复制代码
环境变量
触发器
然后,我们指示如何触发该动作 ; 我已将我的操作设置为在将任何内容推送到仓库时开始:
任务
现在,我们开始声明工作流将要执行的任务,我们首先必须声明工作流将在哪个平台上运行(Linux,MacOS 或 Windows)。
jobs:
# Deploy VM in Azure
DeployVM:
runs-on: windows-latest
复制代码
步骤
现在,我们可以从工作流中的步骤开始。 我已指示我的工作流第一步是签出。 这将从我的仓库中获取文件/代码,并将其放入 $ github.workspace
以便我的工作流访问它。
steps:
# checkout code from repo
- name: checkout repo
uses: actions/checkout
复制代码
下一步是告诉工作流查找有助于构建 VM 的 PowerShell 脚本:
- name: look for ps1 file
run: |
ls '$\IaC\AzCLI'
复制代码
我们工作流的最后一步是部署和配置 VM:
- name: provision virtual machine in azure
env:
RESOURCE_GROUP: rg-githubitpro
RESOURCE_GROUP_REGION: southcentralus
SERVER_NAME: gihtubactions
ADMIN_LOGIN: sarah
run: >
powershell -command "& '$\IaC\AzCLI\vmcreation.ps1'"
-servicePrincipal $
-servicePrincipalSecret $
-servicePrincipalTenantId $
-azureSubscriptionName $
-resourceGroupName %RESOURCE_GROUP%
-resourceGroupNameRegion %RESOURCE_GROUP_REGION%
-serverName %SERVER_NAME%
-adminLogin %ADMIN_LOGIN%
-adminPassword $
复制代码
该步骤有很多内容,所以现在让我们进一步分解一下我们正在做的事情:
- name: provision virtual machine in azure
env:
RESOURCE_GROUP: rg-githubitpro
RESOURCE_GROUP_REGION: southcentralus
SERVER_NAME: gihtubactions
ADMIN_LOGIN: sarah
复制代码
第一部分声明了一些环境变量,在这里我设置了 Azure 资源组名称,我要部署资源组的区域,虚拟机(服务器)的名称以及将要使用的管理员登录帐户名称。
该步骤的第二步是告诉工作流调用我的 PowerShell 脚本,并从工作流和GitHub 密钥存储传入下面的变量。为了允许 GitHub Actions 在我的 Azure 订阅中部署资源,我创建了一个 Azure 服务主体。 如果您从未接触过,那么我之前在另一篇文章中介绍了如何创建和使用它们。
run: >
powershell -command "& '$\IaC\AzCLI\vmcreation.ps1'"
-servicePrincipal $
-servicePrincipalSecret $
-servicePrincipalTenantId $
-azureSubscriptionName $
-resourceGroupName %RESOURCE_GROUP%
-resourceGroupNameRegion %RESOURCE_GROUP_REGION%
-serverName %SERVER_NAME%
-adminLogin %ADMIN_LOGIN%
-adminPassword $
复制代码
此工作流的完整文件可以在这里找到。
监控 GitHub Action 的运行状态
Action 在运行时,你可以监视其进度。当你导航到 GitHub 仓库时,你将看到一个名为 Actions 的选项卡,单击该选项卡将带你进入 Workflow 部分。 你可以创建新的工作流,编辑工作流并监控工作流的运行进度。
GitHub Actions 标签页
监控 GitHub Actions
工作流完成后,你可以检查 Azure 订阅,就能看到创建的资源了:
Azure 资源
注意事项
这里的示例是一个非常基本的工作流,而正在部署的资源也是一个非常基本的资源,但是对我来说,这是学习 GitHub Actions 的一个很好的起点。我已经看到我的同事将其用于更复杂的部署和工作流,例如 Aaron Powell 正在使用它来部署他的博客。
我为测试此部署而创建的代码库是公开的,工作流的输出可供已登录或未登录到 GitHub 的任何人查看,它包含某些可能被视为敏感的信息,比如我的 Azure 订阅 ID,更重要的是虚拟机的 IP 地址,给了恶意的人一个容易攻击的机会。因此,如果你正在测试 GitHub Action,请注意这一点,并警惕你在 Azure 中部署的内容以及它的安全性。
我录制了一段视频,记录了代码的过程和每一步,可以在此处找到此视频:https://youtu.be/0kDr9OlAzlM。
我很想听听其他 IT 专业人士是如何使用 GitHub Action 来部署基础设施的,所以请联系并分享您的故事!
原文链接:https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-use-github-actions-to-deploy-an-azure-virtual-machine/ba-p/1092015
评论