数据保护背景下,安全团队引入了哪些新技术进行防控升级?点击学习案例 了解详情
写点什么

如何使用 GitHub Actions 部署虚拟机

  • 2020 年 3 月 30 日
  • 本文字数:3446 字

    阅读完需:约 11 分钟

如何使用GitHub Actions部署虚拟机

在部署服务器时,人们要么将其从安装包中解压,要么使用 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 $servicePrincipalTenantIdWrite-Output "Done"Write-Output ""#endregion
复制代码


下一段代码将选择正确的订阅,确保我的资源分配至正确的位置:


#region Subscription#This sets the subscription the resources will be created inWrite-Output "Setting default azure subscription..."az account set `    --subscription $azureSubscriptionNameWrite-Output "Done"Write-Output ""#endregion
复制代码


第三段代码将为虚拟机构建赖以生存的资源组:


#region Create Resource Group# This creates the resource group used to house the VMWrite-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 groupWrite-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
复制代码


环境变量

Env:
OUTPUT_PATH: $
复制代码


触发器

然后,我们指示如何触发该动作 ; 我已将我的操作设置为在将任何内容推送到仓库时开始:


on: [push]
复制代码


任务

现在,我们开始声明工作流将要执行的任务,我们首先必须声明工作流将在哪个平台上运行(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


2020 年 3 月 30 日 19:14579

评论

发布
暂无评论
发现更多内容

亿级月活全民K歌Feed业务在腾讯云MongoDB中的应用及优化实践

杨亚洲(专注MongoDB及高性能中间件)

MySQL 数据库 mongodb 分布式数据库mongodb NoSQL 数据库

linux之git高级命令

入门小站

Linux

通过Rust语言计算加速技术突破图片识别性能瓶颈​​

宇宙之一粟

rust 6月月更

TDengine 邀请函:做用技术改变世界的超级英雄,成为 TD Hero

TDengine

数据库 tdengine

聊聊我的远程工作体验 | 社区征文

Nick

远程办公 初夏征文 高效办公 WLB 在线会议

Maven的安装使用

zarmnosaj

6月月更

模块五作业

Elvis FAN

【题解】剑指 Offer 15. 二进制中1的个数(C语言)

未见花闻

6月月更

疫情期间居家办公的总结体会 |社区征文

三掌柜

初夏征文

IIS 部署静态网站和 FTP 服务

乌龟哥哥

6月月更

我大抵是卷上瘾了,横竖睡不着!竟让一个Bug,搞我两次!

小傅哥

小傅哥 异常 bug 连接池 面试问题

对象的访问机制及其他

Jason199

js 原型链 6月月更

TopoLVM: 基于LVM的Kubernetes本地持久化方案,容量感知,动态创建PV,轻松使用本地磁盘

大卡尔

Kubernetes 云原生 6月月更

flutter系列之:flutter中的flow

程序那些事

flutter 程序那些事 6月月更

Flutter TextField详解

yechaoa

flutter 6月月更 TextField

leetcode 1143. Longest Commom Subsequence 最长公共子序列(中等)

okokabcd

LeetCode 动态规划 算法与数据结构

K8S学习笔记--一起来看容器的本质

IT蜗壳-Tango

IT蜗壳教学 6月月更

简析攻防演练中蓝队的自查内容

穿过生命散发芬芳

6月月更 攻防演练

前端食堂技术周刊第 42 期:Vue 2.7 Beta、TS 4.8 Beta、React 开源奖、ECMAScript 2022

童欧巴

JavaScript typescript Vue 前端 React

2022年,中轻度游戏出海路在何方?

Geek_2d6073

HotSpot JVM 「02」Java Object Layout

Samson

学习笔记 hotspot 6月月更

数据治理啥都干

奔向架构师

数据治理 数据资产 6月月更

LabVIEW Arduino TCP/IP远程智能家居系统(项目篇—5)

不脱发的程序猿

物联网 传感器 LabVIEW Arduino 远程智能家居系统

微博评论高性能高可用架构

intelamd

在线文本数字识别列表求和工具

入门小站

工具

架构实战营模块五作业

融冰

maven编译遇到"编码GBK的不可映射字符"警告的处理

程序员欣宸

Java maven 6月月更

4k/8k超高清时代,如何利用媒体处理技术加速数字化升级

4k/8k超高清时代,如何利用媒体处理技术加速数字化升级

如何使用GitHub Actions部署虚拟机_文化 & 方法_Azure 中文精选_InfoQ精选文章