3.Azure -- VM 4

在 Azure 中备份和还原 Linux 虚拟机的文件

备份概述

当 Azure 备份服务启动备份时,将触发备份扩展来创建时间点快照。 Azure 备份服务在 Linux 中使用 VMSnapshotLinux 扩展。 该扩展是在首次 VM 备份(如果 VM 正在运行)期间安装的。 如果 VM 未运行,备份服务会创建基础存储的快照(因为在 VM 停止时不会发生任何应用程序写入)。

默认情况下,Azure 备份为 Linux VM 创建文件系统一致备份,但可以使用前脚本和后脚本框架将其配置为创建应用程序一致备份。 Azure 备份服务创建快照后,数据将传输到保管库。 为最大限度地提高效率,服务仅标识和传输自上次备份以后已更改的数据块。

数据传输完成后,会删除快照并创建恢复点。

创建备份

在恢复服务保管库中创建计划每日备份:

  1. 登录到 Azure 门户

  2. 在左侧菜单中选择“虚拟机”。

  3. 从列表中选择要备份的 VM。

  4. 在 VM 边栏选项卡上的“设置”部分中,单击“备份”。 此时会打开“启用备份”边栏选项卡。

  5. 在“恢复服务保管库”中,单击“新建”并为新保管库提供名称。 将在与虚拟机相同的资源组和位置中创建新保管库。

  6. 单击“备份策略”。 对于本示例,请保留默认值,并单击“确定”。

  7. 在“启用备份”边栏选项卡中,单击“启用备份”。 这会根据默认的计划创建每日备份。

  8. 若要创建初始恢复点,请在“备份”边栏选项卡中单击“立即备份”。

  9. 在“立即备份”边栏选项卡中单击日历图标,使用日历控件选择保留此恢复点的最后一天,并单击“备份”。

  10. 在 VM 的“备份”边栏选项卡中,可以看到已完成的恢复点数。

    恢复点

还原文件

如果意外删除或更改了某个文件,可以使用文件恢复从备份保管库恢复该文件。 文件恢复使用一个在 VM 上运行的脚本将恢复点装载为本地驱动器。 这些驱动器会保持装载 12 小时,以便可以从恢复点复制文件并将其还原到 VM。

本示例演示如何恢复默认 nginx 网页 /var/www/html/index.nginx-debian.html。 本示例中的 VM 的公共 IP 地址为 13.69.75.209。 可使用以下命令找到 VM 的 IP 地址:

  1. 在本地计算机上打开浏览器,并键入 VM 的公共 IP 地址查看默认的 nginx 网页。

  2. 通过 SSH 连接到 VM。

  3. 删除 /var/www/html/index.nginx-debian.html。

  4. 在本地计算机上按 CTRL + F5 刷新浏览器,检查默认的 nginx 页面是否已消失。

  5. 在本地计算机上登录到 Azure 门户

  6. 在左侧菜单中选择“虚拟机”。

  7. 从列表中选择 VM。

  8. 在 VM 边栏选项卡上的“设置”部分中,单击“备份”。 此时会打开“备份”边栏选项卡。

  9. 在边栏选项卡顶部的菜单中,选择“文件恢复”。 此时会打开“文件恢复”边栏选项卡。

  10. 在“步骤 1: 选择恢复点”中,从下拉列表中选择一个恢复点。

  11. 在“步骤 2: 下载脚本以浏览并恢复文件”中,单击“下载可执行文件”按钮 。 将下载的文件保存到本地计算机。

  12. 单击“下载脚本”在本地下载脚本文件。

  13. 打开 Bash 提示符并键入以下命令。请将 Linux_myVM_05 05 2017.sh 替换为下载的脚本的正确路径和文件名,将 azureuser 替换为 VM 的用户名,将 13.69.75.209 替换为 VM 的公共 IP 地址。

bash

scp Linux_myVM_05-05-2017.sh azureuser@13.69.75.209:

在本地计算机上打开 VM 的 SSH 连接。

bash

ssh 13.69.75.209

在 VM 上,添加对脚本文件的执行权限。

bash

chmod +x Linux_myVM_05-05-2017.sh

在 VM 上,运行该脚本将恢复点装载为文件系统。

bash复制

./Linux_myVM_05-05-2017.sh

脚本的输出将提供装入点的路径。 输出与下面类似:

bash

Azure VM Backup - File Recovery

在 VM 上,将 nginx 默认网页从装入点复制回到删除该文件的位置。

bash

sudo cp ~/myVM-20170505191055/Volume1/var/www/html/index.nginx-debian.html /var/www/html/

在本地计算机上,打开已从中连接到 VM 的 IP 地址、显示 nginx 默认页面的浏览器标签页。 按 CTRL + F5 刷新浏览器页面。 现在,应会看到默认页面再次正常运行。

使用 Azure CLI 管理 Linux 虚拟机

了解范围

在创建任何项之前,让我们复习一下作用域的概念。 Azure 提供四个级别的管理:管理组、订阅、资源组和资源。 下图显示了这些层的一个示例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GchNVkr-1587369292818)(https://docs.azure.cn/zh-cn/includes/media/resource-manager-governance-scope/scope-levels.png)]

将在上述任何级别的作用域中应用管理设置。 所选的级别确定应用设置的广泛程度。 较低级别继承较高级别的设置。 将设置应用到订阅时,该设置将应用于订阅中的所有资源组和资源。 将设置应用到资源组时,该设置将应用到资源组及其所有资源。 但是,其他资源组不具有该设置。

通常情况下,最好在较高级别应用关键设置,在较低级别应用特定于项目的要求。 例如,可能想要确保组织的所有资源均已部署到特定区域。 若要完成此要求,请将策略应用到指定允许位置的订阅。 当组织中的其他用户添加新资源组和资源时,会自动强制实施允许的位置。

在本教程中,你将所有管理设置应用于一个资源组,以便在完成后可以轻松地删除这些设置。

让我们创建该资源组。

Azure CLI复制

az group create --name myResourceGroup --location "China East"

目前,资源组为空。

基于角色的访问控制

你希望确保你的组织中的用户对这些资源具有合适级别的访问权限。 你不希望向用户授予不受限的访问权限,但还需要确保他们可以执行其工作。 使用基于角色的访问控制,你可以管理哪些用户有权在某个范围内完成特定操作。


什么是 Azure 资源的基于角色的访问控制 (RBAC)?
RBAC 的作用是什么?

下面是 RBAC 的作用的一些示例:

  • 让一个用户管理订阅中的虚拟机,另一个用户管理虚拟网络
  • 让 DBA 组管理订阅中的 SQL 数据库
  • 让某个用户管理资源组中的所有资源,例如虚拟机、网站和子网
  • 让某个应用程序访问资源组中的所有资源
使用 RBAC 的最佳做法

使用 RBAC,可以在团队中对职责进行分配,仅向用户授予执行作业所需的访问权限。 请勿向每个人授予 Azure 订阅或资源的无限制权限,只能允许他们在特定的范围执行某些操作。

规划访问控制策略时,最佳做法是授予用户完成工作所需的最低权限。 下图显示了与 RBAC 使用有关的建议模式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEU5Ow7K-1587369292821)(https://docs.azure.cn/zh-cn/role-based-access-control/media/overview/rbac-least-privilege.png)]

RBAC 的工作原理

使用 RBAC 控制资源访问权限的方式是创建角色分配。 这是一个需要理解的重要概念 - 它涉及到如何强制实施权限。 角色分配包含三个要素:安全主体、角色订阅和范围。

安全主体

安全主体是一个对象,表示请求访问 Azure 资源的用户、组、服务主体或托管标识。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JewI8or0-1587369292824)(https://docs.azure.cn/zh-cn/role-based-access-control/media/overview/rbac-security-principal.png)]

  • 用户 - 在 Azure Active Directory 中具有配置文件的人员。
  • 组 - 在 Azure Active Directory 中创建的一组用户。 将某个角色分配到某个组时,该组中的所有用户都拥有该角色。
  • 服务主体 - 应用程序或服务用来访问特定 Azure 资源的安全标识。 可将服务主体视为应用程序的用户标识(用户名和密码或证书)。
  • 托管标识 - Azure Active Directory 中由 Azure 自动托管的标识。 在开发云应用程序时,通常使用托管标识来管理用于向 Azure 服务进行身份验证的凭据。

角色定义

角色定义是权限的集合。 它通常直接称为“角色”。 角色定义列出可以执行的操作,例如读取、写入和删除。 角色可以是高级别的(例如所有者),也可以是特定的(例如虚拟机读取者)。

角色分配的角色定义

Azure 包含多个可用的内置角色。 下面列出了四个基本的内置角色。 前三个角色适用于所有资源类型。

  • 所有者 - 拥有对所有资源的完全访问权限,包括将访问权限委派给其他用户的权限。
  • 参与者 - 可以创建和管理所有类型的 Azure 资源,但无法将访问权限授予其他用户。
  • 读取者 - 可以查看现有的 Azure 资源。
  • 用户访问管理员 - 可以管理用户对 Azure 资源的访问。

剩余的内置角色允许管理特定的 Azure 资源。 例如,虚拟机参与者角色允许用户创建和管理虚拟机。 如果内置角色不能满足组织的特定需求,则可以为 Azure 资源创建你自己的自定义角色

Azure 具有数据操作,通过这些操作可以授予对对象内数据的访问权限。 例如,如果某个用户对某个存储帐户拥有读取数据的访问权限,则该用户可以读取该存储帐户中的 Blob 或消息。 有关详细信息,请参阅了解 Azure 资源的角色定义

作用域

范围是访问权限适用于的资源集。 分配角色时,可以通过定义范围来进一步限制允许的操作。 若要将某人分配为网站参与者,但只针对一个资源组执行此分配,则可使用范围。

在 Azure 中,可在多个级别指定范围:管理组、订阅、资源组或资源。 范围采用父子关系结构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANwqwoD3-1587369292828)(https://docs.azure.cn/zh-cn/role-based-access-control/media/overview/rbac-scope.png)]

在父范围授予访问权限时,这些权限会继承到子范围。 例如:

  • 如果将所有者角色分配给管理组范围的用户,则该用户可以在管理组中管理所有订阅中的一切内容。
  • 如果在订阅范围向某个组分配了读取者角色,则该组的成员可以查看订阅中的每个资源组和资源。
  • 如果在资源组范围向某个应用程序分配了参与者角色,则该应用程序可以管理该资源组中所有类型的资源,但不能管理订阅中其他资源组的资源。

角色分配

角色分配是出于授予访问权限的目的,将角色定义附加到特定范围内的用户、组、服务主体或托管标识的过程。 通过创建角色分配来授予访问权限,通过删除角色分配来撤销访问权限。

下图显示了角色分配的示例。 在此示例中,为“营销”组分配了医药销售资源组的参与者角色。 这意味着,“营销”组中的用户可以在医药销售资源组中创建或管理任何 Azure 资源。 “营销”用户无权访问医药销售资源组外部的资源,除非他们属于另一个角色分配。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K669bLxv-1587369292829)(https://docs.azure.cn/zh-cn/role-based-access-control/media/overview/rbac-overview.png)]

可以使用 Azure 门户、Azure CLI、Azure PowerShell、Azure SDK 或 REST API 创建角色分配。 每个订阅中最多可以有 2000 个角色分配,每个管理组中最多可以有 500 个角色分配。 若要创建和删除角色分配,必须拥有 Microsoft.Authorization/roleAssignments/* 权限。 此权限是通过所有者用户访问管理员角色授予的。

多角色分配

如果有多个重叠的角色分配,将会发生什么情况? RBAC 是一个加法模型,因此有效权限是角色分配的总和。

拒绝分配

以前,RBAC 是一种仅允许模型,没有拒绝功能,但 RBAC 现在以有限方式支持拒绝分配。 拒绝分配类似于角色分配,可将一组拒绝操作附加到特定范围内的用户、组、服务主体或托管标识,以便拒绝访问。 角色分配定义了一组允许 的操作,而拒绝分配定义了一组不允许 的操作。 换而言之,即使角色分配授予用户访问权限,拒绝分配也会阻止用户执行指定的操作。 拒绝分配优先于角色分配。

若要管理虚拟机解决方案,可以使用三种特定于资源的角色来进行通常所需的访问:

通常情况下,与其向单个用户分配角色,不如使用其用户需要执行类似操作的 Azure Active Directory 组, 然后向该组分配相应的角色。 就本文来说,请使用现有的组来管理虚拟机,或者使用门户来创建 Azure Active Directory 组

监视 Azure 中的 Linux 虚拟机

创建 VM

若要查看诊断和指标的状态,需要创建一个 VM。

此案例我直接使用之前创建的一个VM,myVM2(Ubuntu系统)来代替。

启用启动诊断

Linux VM 启动时,启动诊断扩展将捕获启动输出并将其存储在 Azure 存储中。 此数据可以用于排查 VM 启动问题。 使用 Azure CLI 创建 Linux VM 时,不会自动启用启动诊断。

在启用启动诊断之前,需要创建一个存储帐户来存储启动日志。 存储帐户的名称必须全局唯一,介于 3 和 24 个字符之间,并且只能包含数字和小写字母。 使用 az storage account create 命令创建存储帐户。

Azure CLI复制

set storageacct=mydiagdata

az storage account create --resource-group myResourceGroup --name %storageacct% --sku Standard_LRS --location chinaeast

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8mzi8O8v-1587369292831)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420114343062.png)]

启用引导诊断时,需要 Blob 存储容器的 URI。 以下命令查询存储帐户以返回此 URI。 URI 值存储在名为 bloburi 的变量中

set bloburi=(az storage account show --resource-group myResourceGroup --name $storageacct --query 'primaryEndpoints.blob' -o tsv)

现在,请使用 az vm boot-diagnostics enable 启用启动诊断。 --storage 值是在上一步骤中收集的 Blob URI。

Azure CLI

az vm boot-diagnostics enable --resource-group myResourceGroup --name myVM --storage %bloburi%

查看主机指标

Linux VM 在 Azure 中有一个与它交互的专用主机。 系统会自动收集该主机的指标,可以在 Azure 门户中查看这些指标,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEV4BaE6-1587369292832)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420115316049.png)]

创建警报

可以根据特定的性能指标创建警报。 例如,当平均 CPU 使用率超过特定的阈值或者可用磁盘空间低于特定的空间量时,警报可用于发出通知。 警报显示在 Azure 门户中,也可以通过电子邮件发送。 还可以触发 Azure 自动化 Runbook 或 Azure 逻辑应用来响应生成的警报。

以下示例针对平均 CPU 使用率创建警报。

  1. 在 Azure 门户中单击“资源组”,选择“myResourceGroupMonitor”,并在资源列表中选择“myVM”。
  2. 在 VM 边栏选项卡上单击“警报规则”,然后单击警报边栏选项卡顶部的“添加指标警报”。
  3. 为警报提供名称,例如 myAlertRule
  4. 若要在 CPU 百分比持续 5 分钟超过 1.0 时触发警报,请选中其他所有默认值。
  5. (可选)选中“电子邮件所有者、参与者和读者”对应的框,以便向他们发送电子邮件通知。 默认操作是在门户中显示通知。
  6. 单击“确定” 按钮。

使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构

  • 创建 Jenkins VM
  • 安装并配置 Jenkins
  • 创建 GitHub 与 Jenkins 之间的 Webhook 集成
  • 通过 GitHub 提交创建并触发 Jenkins 生成作业
  • 创建应用的 Docker 映像
  • 验证 GitHub 提交是否生成新的 Docker 映像并更新正在运行的应用

创建 Jenkins 实例

在有关如何在首次启动时自定义 Linux 虚拟机的上一个教程中,你已了解如何使用 cloud-init 自动执行 VM 自定义。 本教程使用 cloud-init 文件在 VM 上安装 Jenkins 和 Docker。 Jenkins 是一种常用的开放源代码自动化服务器,它与 Azure 无缝集成以支持持续集成 (CI) 和持续交付 (CD)。

在当前 shell 中,创建名为 cloud-init.txt 的文件并粘贴下面的配置 。 例如,在本地计算机中创建文件。 输入 sensible-editor cloud-init-jenkins.txt 以创建文件并查看可用编辑器的列表。 请确保已正确复制整个 cloud-init 文件,尤其是第一行:

YAML

#cloud-config
package_upgrade: true
write_files:
  - path: /etc/systemd/system/docker.service.d/docker.conf
    content: |
      [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd
  - path: /etc/docker/daemon.json
    content: |
      {
        "hosts": ["fd://","tcp://127.0.0.1:2375"]
      }
runcmd:
  - apt install openjdk-8-jre-headless -y
  - wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
  - sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
  - apt-get update && apt-get install jenkins -y
  - curl -sSL https://get.docker.com/ | sh
  - usermod -aG docker azureuser
  - usermod -aG docker jenkins
  - service jenkins restart

chinaeast 位置创建名为 myResourceGroupJenkins 的资源组:

Azure CLI

az group create --name myResourceGroupJenkins --location chinaeast

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umovb90D-1587369292832)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420125402434.png)]

现在,请使用 az vm create 创建 VM。 使用 --custom-data 参数传递到 cloud-init 配置文件中。 如果已将 cloud-init-jenkins.txt 文件保存在现有工作目录的外部,请提供该文件的完整路径。

Azure CLI

az vm create --resource-group myResourceGroupJenkins --name myVM --image UbuntuLTS --admin-username azureuser --generate-ssh-keys --custom-data cloud-init-jenkins.txt

也可以使用Azure门户页面的配置功能进行设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHF5EhDO-1587369292833)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420130509998.png)]

若要允许 Web 流量抵达 VM,请使用 az vm open-port 为 Jenkins 流量打开端口 8080,并为用于运行示例应用的 Node.js 应用打开端口 1337

Azure CLI

az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002

配置 Jenkins

若要访问 Jenkins 实例,请获取 VM 的公共 IP 地址:

Azure CLI

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] 

这是我新建的虚拟机IP地址:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jAMR47sI-1587369292834)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420130734966.png)]

出于安全考虑,需要输入 VM 上某个文本文件中存储的初始管理员密码来启动 Jenkins 安装。 使用上一步骤中获取的公共 IP 地址通过 SSH 连接到 VM:

bash

ssh azureuser@<publicIps>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ygRrzsHb-1587369292835)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420131417605.png)]

使用 service 命令验证 Jenkins 是否正在运行。

bash

$ service jenkins status

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FaSnCflP-1587369292836)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420132017642.png)]

查看并复制 Jenkins 安装程序的 initialAdminPassword

bash

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKeE9VQD-1587369292838)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420132237396.png)]

如果文件尚不可用,请再等待几分钟,以便 cloud-init 完成 Jenkins 和 Docker 安装。

现在,请打开 Web 浏览器并转到 http://:8080。 按如下所示完成初始 Jenkins 安装:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QjVhzarW-1587369292839)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420132331677.png)]

将刚才得到的一串字符密码复制进来:

成功登录!

接下来按照步骤进行:

  • 选择“选择要安装的插件”
  • 在顶部的文本框中搜索 GitHub。 选中“GitHub”对应的框,然后选择“安装”
  • 创建第一个管理用户。 输入用户名(例如 admin),然后提供自己的安全密码。 最后,键入全名和电子邮件地址。
  • 选择“保存并完成”
  • 准备好 Jenkins 后,选择“开始使用 Jenkins”
    • 如果开始使用 Jenkins 时 Web 浏览器显示空白页,请重启 Jenkins 服务。 在 SSH 会话中键入 sudo service jenkins restart,然后刷新 Web 浏览器。
  • 根据需要使用创建的用户名和密码登录到 Jenkins。

创建 GitHub Webhook

若要配置与 GitHub 的集成,请从 Azure 示例存储库中打开 Node.js Hello World 示例应用。 若要将存储库分叉到自己的 GitHub 帐户,请选择右上角的“分叉”按钮 。

在创建的分叉中创建 Webhook:

  • 选择“设置” ,然后在左侧选择“Webhook” 。
  • 选择“添加 Webhook” ,并在筛选框中输入 Jenkins 。
  • 对于“有效负载 URL” ,输入 http://:8080/github-webhook/。 请确保包含尾部的 /
  • 选择 application/x-www-form-urlencoded 作为“内容类型”。
  • 对于“希望通过哪些事件来触发此 webhook?”选项,请选择“仅推送事件”。
  • 将“活动”设置为已勾选。
  • 单击“添加 Webhook” 。

创建 Jenkins 作业

若要让 Jenkins 对 GitHub 中的事件(例如提交代码)做出响应,请创建 Jenkins 作业。 为自己的 GitHub 分叉使用 URL。

在 Jenkins 网站中的主页上,选择“创建新作业” :

  • 输入 HelloWorld 作为作业名称。 选择“自由风格项目” ,然后选择“确定” 。
  • 在“常规”部分下面,选择“GitHub”项目并输入分叉的存储库的 URL,例如 https://github.com/cynthn/nodejs-docs-hello-world
  • 在“源代码管理”部分下,选择“Git”并输入分支存储库 .git 的 URL,例如 https://github.com/cynthn/nodejs-docs-hello-world.git
  • 在“生成触发器”部分下面,选择“用于 GITscm 轮询的 GitHub 挂钩触发器”。
  • 在“生成” 部分下面,选择“添加生成步骤” 。 选择“执行 shell”,并在命令窗口中输入 echo "Test"
  • 选择作业窗口底部的“保存” 。

测试 GitHub 集成

若要测试 GitHub 与 Jenkins 的集成,请提交分叉中的更改。

返回到 GitHub Web UI,选择分叉的存储库,然后选择“index.js”文件 。 选择铅笔图标编辑该文件,使第 6 行的内容如下:

JavaScript

response.end("Hello World!");

若要提交更改,请选择底部的“提交更改”按钮 。

在 Jenkins 中,作业页左下角的“生成历史记录”部分下面启动了一个新的生成。 选择生成号链接,并选择左侧的“控制台输出” 。 从 GitHub 提取代码以及生成操作将消息 Test 输出到控制台时,可以查看 Jenkins 执行的步骤。 每次在 GitHub 中提交内容时,Webhook 都以此方式访问 Jenkins 并触发新的生成。

定义 Docker 生成映像

为了查看基于 GitHub 提交内容运行的 Node.js 应用,让我们生成一个 Docker 映像用于运行该应用。 该映像是从定义如何配置运行应用的容器的 Dockerfile 生成的。

通过 SSH 连接到 VM 后,请切换到根据上一步骤创建的作业命名的 Jenkins 工作区目录。 在本示例中,该目录名为 HelloWorld 。

bash

cd /var/lib/jenkins/workspace/HelloWorld

在此工作区目录中创建包含 sudo sensible-editor Dockerfile 的文件并粘贴以下内容。 请确保已正确复制整个 Dockerfile,尤其是第一行:

YAML

FROM node:alpine

EXPOSE 1337

WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/

此 Dockerfile 使用基本 Node.js 映像(该映像使用 Alpine Linux),公开运行 Hello World 应用的端口 1337,然后复制应用文件并初始化应用。

创建 Jenkins 生成规则

在上一步骤中,已创建一个可将消息输出到控制台的基本 Jenkins 生成规则。 让我们创建生成步骤以使用 Dockerfile 并运行应用。

返回到 Jenkins 实例,选择上一步骤创建的作业。 选择左侧的“配置” ,并向下滚动到“生成”部分 :

  • 删除现有的 echo "Test" 生成步骤。 选择现有生成步骤框右上角的红叉。

  • 选择“添加生成步骤” ,然后选择“执行 shell”

  • 在“命令” 框中输入以下 Docker 命令,然后选择“保存” :

    bash

    docker build --tag helloworld:$BUILD_NUMBER .
    docker stop helloworld && docker rm helloworld
    docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
    

Docker 生成步骤将创建一个映像,并使用 Jenkins 生成编号对其进行标记,以便可以维护映像的历史记录。 运行应用的任何现有容器将会停止,随后被删除。 然后,将使用该映像启动新的容器,并基于 GitHub 中的最新提交内容运行 Node.js 应用。

测试管道

若要查看整个管道的工作状况,请再次在分叉的 GitHub 存储库中编辑 index.js 文件,并选择“提交更改” 。 将会基于 GitHub 的 Webhook 在 Jenkins 中启动新作业。 创建 Docker 映像并在新容器中启动应用需要几秒钟时间。

如果需要,请再次获取 VM 的公共 IP 地址:

Azure CLI

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

使用 Jenkins 和 Azure DevOps Services 将应用部署到 Azure 中的 Linux 虚拟机

  • 获取示例应用。
  • 配置 Jenkins 插件。
  • 为 Node.js 配置 Jenkins 自由风格项目。
  • 为 Azure DevOps Services 集成配置 Jenkins。
  • 创建 Jenkins 服务终结点。
  • 为 Azure 虚拟机创建部署组。
  • 创建 Azure Pipelines 发布管道。
  • 执行手动和 CI 触发的部署。

准备阶段

获取示例应用

你需要一个待部署的应用,并存储在 Git 存储库中。 对于本教程,我们建议你使用从 GitHub 获得的此示例应用

创建此应用的一个分支并记下位置 (URL) 以便在本教程的后续步骤中使用。 有关详细信息,请参阅分支存储库

配置 Jenkins 插件

首先,必须配置两个 Jenkins 插件:NodeJSVS Team Services 持续部署

  1. 打开你的 Jenkins 帐户,并选择“管理 Jenkins” 。
  2. 在“管理 Jenkins” 页面上,选择“管理插件” 。
  3. 筛选列表以查找“NodeJS” 插件,然后选择“安装而不重启” 选项。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ObenEaxI-1587369292841)(https://docs.azure.cn/zh-cn/virtual-machines/linux/media/tutorial-build-deploy-jenkins/jenkins-nodejs-plugin.png)]
  4. 筛选列表以查找“VS Team Services 持续部署” 插件,然后选择“安装而不重启” 选项。
  5. 返回 Jenkins 仪表板,然后选择“管理 Jenkins” 。
  6. 选择“全局工具配置” 。 查找“NodeJS” ,然后选择“NodeJS 安装” 。
  7. 选择“自动安装” 选项,然后输入“名称” 值。
  8. 选择“保存” 。

为 Node.js 配置 Jenkins 自由风格项目

  1. 选择“新建项” 。 输入项目值。
  2. 选择“自由风格项目” 。 选择“确定” 。
  3. 在“源代码管理” 选项卡上,选择“Git” 并输入包含应用代码的存储库和分支的详细信息。
    将存储库添加到生成
  4. 在“生成触发器” 选项卡上,选择“轮询 SCM” 并输入计划 H/03 * * * *,以便每三分钟轮询一次 Git 存储库中的更改。
  5. 在“生成环境” 选项卡上,选择“提供节点 & npm bin/ folder PATH” ,然后选择“NodeJS 安装” 值。 使“npmrc 文件” 设置为“用户系统默认值” 。
  6. 在“生成” 选项卡上,选择“执行 shell” ,然后输入命令 npm install,以确保更新所有依赖项。

为 Azure DevOps Services 集成配置 Jenkins

  1. 如果没有 PAT,请在 Azure DevOps Services 组织中创建一个 PAT。 Jenkins 需要使用此信息来访问你的 Azure DevOps Services 组织。 确保存储令牌信息以用于本部分后面的步骤。

    若要了解如何生成令牌,请阅读如何为 Azure DevOps Services 创建个人访问令牌?

  2. 在“生成后操作” 选项卡中,选择“添加生成后操作” 。 选择“存档项目” 。

  3. 对于“要存档的文件”,输入 **/* 以包括所有文件 。

  4. 若要创建其他操作,请选择“添加生成后操作” 。

  5. 选择“在 TFS/Team Services 中触发发布” 。 输入 Azure DevOps Services 组织的 URI,例如 https://{your-organization-name}.visualstudio.com

  6. 输入项目名称。

  7. 为发布管道选择名称。 (稍后将在 Azure DevOps Services 中创建此发布管道。)

  8. 选择用于连接到 Azure DevOps Services 或 Team Foundation Server 环境的凭据:

    • 如果使用的是 Azure DevOps Services,请将“用户名” 留空。
    • 如果你正在使用 Team Foundation Server 的本地版本,请输入用户名和密码。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ge13UtDj-1587369292844)(https://docs.azure.cn/zh-cn/virtual-machines/linux/media/tutorial-build-deploy-jenkins/trigger-release-from-jenkins.png)]
  9. 保存 Jenkins 项目。

创建 Jenkins 服务终结点

服务终结点允许 Azure DevOps Services 连接到 Jenkins。

  1. 在 Azure DevOps Services 中打开“服务” 页面,打开“新服务终结点” 列表,然后选择“Jenkins” 。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfVgerQi-1587369292845)(https://docs.azure.cn/zh-cn/virtual-machines/linux/media/tutorial-build-deploy-jenkins/add-jenkins-endpoint.png)]
  2. 输入连接的名称。
  3. 输入 Jenkins 服务器的 URL,然后选择“接受不受信任的 SSL 证书” 选项。 示例 URL 是 http://{YourJenkinsURL}.chinaeast.cloudapp.chinacloudapi.cn
  4. 输入 Jenkins 帐户的用户名和密码。
  5. 选择“验证连接” 确认信息是否正确。
  6. 选择“确定” ,创建服务终结点。

为 Azure 虚拟机创建部署组。

需要使用部署组来注册 Azure DevOps Services 代理,以便可将发布管道部署到虚拟机。 通过部署组,可以方便地定义目标计算机的逻辑组,以进行部署,并在每台计算机上安装所需的代理。

备注

在以下过程中,确保安装先决条件,且不使用 sudo 权限运行脚本 。

  1. 打开“生成 & 发布”中心的“发布” 选项卡 ,打开“部署组” ,然后选择“+ 新建” 。
  2. 为部署组输入名称和可选说明。 然后选择“创建” 。
  3. 为部署目标虚拟机选择操作系统。 例如,选择“Ubuntu 16.04+” 。
  4. 选择“使用脚本中的个人访问令牌进行身份验证” 。
  5. 选择“系统必备组件”链接 。 为操作系统安装必备组件。
  6. 选择“将脚本复制到剪贴板” 以复制脚本。
  7. 登录到部署目标虚拟机并运行脚本。 不要使用 sudo 权限运行脚本。
  8. 完成安装后,系统将提示你部署组标记。 接受默认值。
  9. 在 Azure DevOps Services 中,在“部署组” 下面的“目标” 中检查新注册的虚拟机。

创建 Azure Pipelines 发布管道

发布管道指定 Azure Pipelines 在部署应用时所用的过程。 在此示例中,你将执行一个 shell 脚本。

在 Azure Pipelines 中创建发布管道:

  1. 打开“生成和发布”中心的“发布”选项卡,然后选择“创建发布管道”。
  2. 通过选择以“空进程” 开始,选择“空” 模板。
  3. 在“项目” 部分,选择“+ 添加项目” ,然后在“源类型”中选择“Jenkins” 。 选择自己的 Jenkins 服务终结点连接。 然后选择 Jenkins 源作业,并选择“添加” 。
  4. 选择“环境 1”旁边的省略号 。 选择“添加部署组阶段” 。
  5. 选择部署组。
  6. 选择“+” ,向“部署组阶段”中添加任务 。
  7. 选择“Shell 脚本” 任务,并选择“添加” 。 “Shell 脚本” 任务为要在每个服务器上运行的脚本提供配置,以安装 Node.js 并启动应用。
  8. 对于“脚本路径” ,请输入“$(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh” 。
  9. 选择“高级” ,然后启用“指定工作目录” 。
  10. 对于“工作目录” ,请输入“$(System.DefaultWorkingDirectory)/Fabrikam-Node” 。
  11. 将发布管道的名称编辑为你在 Jenkins 内部版本的“生成后操作” 选项卡上指定的名称。 Jenkins 要求此名称能够在源项目更新时触发新的发布。
  12. 选择“保存” ,然后选择“确定” 以保存发布管道。

执行手动和 CI 触发的部署

  1. 选择“+ 发布” ,然后选择“创建发布” 。
  2. 选择在突出显示的下拉列表中完成的内部版本,然后选择“队列” 。
  3. 在弹出消息中选择发布链接。 例如:“发布 Release-1 已创建。”
  4. 打开“日志”选项卡以查看发布控制台输出。
  5. 在浏览器中,打开已添加到部署组的其中一个服务器的 URL。 例如,输入 http://{your-server-ip-address} 。
  6. 转到源 Git 存储库,使用某些已更改的文本来修改文件 app/views/index.jade 中 h1 标题的内容 。
  7. 提交更改。
  8. 几分钟后,可在 Azure DevOps 的“发布”页中看到新建的发布管道 。 打开此发布可以看到部署正在进行。 祝贺!

排查 Jenkins 插件问题

入“ ( S y s t e m . D e f a u l t W o r k i n g D i r e c t o r y ) / F a b r i k a m − N o d e / d e p l o y s c r i p t . s h ” 。 9. 选 择 “ 高 级 ” , 然 后 启 用 “ 指 定 工 作 目 录 ” 。 10. 对 于 “ 工 作 目 录 ” , 请 输 入 “ (System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh” 。 9. 选择“高级” ,然后启用“指定工作目录” 。 10. 对于“工作目录” ,请输入“ (System.DefaultWorkingDirectory)/FabrikamNode/deployscript.sh9.10.(System.DefaultWorkingDirectory)/Fabrikam-Node” 。
11. 将发布管道的名称编辑为你在 Jenkins 内部版本的“生成后操作” 选项卡上指定的名称。 Jenkins 要求此名称能够在源项目更新时触发新的发布。
12. 选择“保存” ,然后选择“确定” 以保存发布管道。

执行手动和 CI 触发的部署

  1. 选择“+ 发布” ,然后选择“创建发布” 。
  2. 选择在突出显示的下拉列表中完成的内部版本,然后选择“队列” 。
  3. 在弹出消息中选择发布链接。 例如:“发布 Release-1 已创建。”
  4. 打开“日志”选项卡以查看发布控制台输出。
  5. 在浏览器中,打开已添加到部署组的其中一个服务器的 URL。 例如,输入 http://{your-server-ip-address} 。
  6. 转到源 Git 存储库,使用某些已更改的文本来修改文件 app/views/index.jade 中 h1 标题的内容 。
  7. 提交更改。
  8. 几分钟后,可在 Azure DevOps 的“发布”页中看到新建的发布管道 。 打开此发布可以看到部署正在进行。 祝贺!

排查 Jenkins 插件问题

如果 Jenkins 插件出现任何 bug,请在 Jenkins JIRA 中提出特定组件的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值