通过 Terraformed 规模集的 Azure DevOps Pipelines 代理池

Azure DevOps Pipelines Agent Pool via Terraformed Scale Set

我的任务是创建一个基于 Linux 的规模集,以便在 Terraform 中与 Azure DevOps Pipelines 一起使用。

我已经为基础设置了一切;但是,当我单击 DevOps 项目 Agent pools 区域中的 Agents 选项卡时,我收到消息:

No agents are connected Azure virtual machine scale set agents will appear here when they are created.

我假设我需要使用 these instructions.

安装代理

到目前为止我做了什么:

  1. 使用 azurerm_linux_virtual_machine_scale_set 对我的 Azure 规模集进行 Terraform - 我正在使用 UbuntuServer 18.04-LTS
  2. 添加CustomScript extension via azurerm_virtual_machine_scale_set_extension
  3. 传入从 Terraform
  4. 中的文件读取的自定义 commandToExecute 参数
  5. 在我的 DevOps 项目中,添加一个新的代理池,它使用创建的规模集

在我的自定义脚本中,我有 Linux 代理的基本下载和解包:

mkdir azure-agent
curl -sSL https://vstsagentpackage.azureedge.net/agent/2.187.2/vsts-agent-linux-x64-2.187.2.tar.gz --output vsts-agent.tar.gz
tar -zxf vsts-agent.tar.gz -C azure-agent

根据说明,我需要 运行 config.sh 交互式脚本。

我的问题是:

  1. 有没有比运行使用自定义脚本安装代理更好的方法?
  2. 如果没有更好的方法来执行此操作,我如何在不 运行 宁 config.sh 脚本的情况下将代理所需的数据获取到 VM 中?

我查看了 az vm extension image list --output table 的输出,除了 Microsoft.Azure.Monitor 扩展集外没有看到任何东西,这似乎不是我想要使用的,我没有'看不到任何标有“vsts”的东西。使用 az vm image list --all 也没有发现任何我注意到的东西。

更新 1

经过一番尝试,我找到了 Microsoft.VisualStudio.Services.TeamServicesAgentLinux v1.21,其中包含一些基本设置:

  settings = jsonencode({
    "isPipelinesAgent"        = true
    "agentFolder"             = "/agent"
    "agentDownloadUrl"        = "https://vstsagentpackage.azureedge.net/agent/2.187.2/vsts-agent-linux-x64-2.187.2.tar.gz"
    "enableScriptDownloadUrl" = "https://vstsagenttools.blob.core.windows.net/tools/ElasticPools/Linux/6/enableagent.sh"
  })

这仍然没有为 config.sh 脚本在 运行.

时要求的选项提供选项

更新 2

我听从了@Joy 的建议,并能够验证我创建的脚本 运行 是否成功。如果我通过 SSH 连接到 VM 并执行它,它看起来像这样并且功能正常:

set -e

sudo apt-get update
sudo apt install -y jq apt-transport-https ca-certificates curl gnupg lsb-release python3 python3-pip

sudo apt install -y liblttng-ust0 libkrb5-3 zlib1g

sudo apt install -y libssl1.1 || \
  sudo apt install -y libssl1.0.2 || \
  sudo apt install -y libssl1.0.0

sudo apt install -y libicu67 || \
  sudo apt install -y libicu66 || \
  sudo apt install -y libicu63 || \
  sudo apt install -y libicu60 || \
  sudo apt install -y libicu57 || \
  sudo apt install -y libicu55 || \
  sudo apt install -y libicu52

# download the Azure script & run the setup
if [[ -d vsts-install ]]; then
  rm -Rf vsts-install
fi

mkdir vsts-install
cd vsts-install

curl -sSL https://vstsagentpackage.azureedge.net/agent/2.187.2/vsts-agent-linux-x64-2.187.2.tar.gz --output vsts.tgz
tar -zxf vsts.tgz

./config.sh --unattended \
            --url https://dev.azure.com/MyOrganization \
            --auth pat \
            --token "MY_TOKEN" \
            --pool TerraformedDevOpsPool \
            --replace

sudo ./svc.sh install || true
sudo ./svc.sh stop || true
sudo ./svc.sh start

问题是当我在我的节点池中设置它时,它没有执行。我正在通过这个 Terraform 配置来做到这一点:

resource "azurerm_virtual_machine_scale_set_extension" "pipeliens_vms_custom_script" {
  name                         = "TestingExtension"
  virtual_machine_scale_set_id = azurerm_linux_virtual_machine_scale_set.pipelines_vms.id
  publisher                    = "Microsoft.Azure.Extensions"
  type                         = "CustomScript"
  type_handler_version         = "2.0"

  settings = jsonencode({
    "commandToExecute" = file(abspath("./scripts/pipelinesVmStartupScript.sh"))
  })
}

我只需要弄清楚如何从脚本中查看失败或弄清楚为什么它没有按我期望的方式启动。

更新 3

切换到这个 运行s:

resource "azurerm_linux_virtual_machine_scale_set" "pipelines_vms" {
  ...
  custom_data                     = base64encode(file(abspath("./scripts/pipelinesVmStartupScript.sh")))

只需要找出 config.sh 运行 失败的原因。

更新 4

脚本失败:

Must not run with sudo

我将在脚本中创建一个用户并将其 运行 作为该用户。这应该可以解决问题。

所以没有其他人需要经历这种痛苦。

custom_data 部分非常有效。 这是我需要的脚本 运行:

#!/bin/sh
set -e

sudo apt-get update
sudo apt install -y jq apt-transport-https ca-certificates curl gnupg lsb-release

sudo apt install -y liblttng-ust0 libkrb5-3 zlib1g

sudo apt install -y libssl1.1 || \
  sudo apt install -y libssl1.0.2 || \
  sudo apt install -y libssl1.0.0

sudo apt install -y libicu67 || \
  sudo apt install -y libicu66 || \
  sudo apt install -y libicu63 || \
  sudo apt install -y libicu60 || \
  sudo apt install -y libicu57 || \
  sudo apt install -y libicu55 || \
  sudo apt install -y libicu52

sudo addgroup vsts
sudo useradd -s /bin/bash -d /home/vsts -m -g vsts vsts
sudo usermod -aG sudo vsts

sudo mkdir /vsts-install
cd /vsts-install

sudo curl -sSL https://vstsagentpackage.azureedge.net/agent/2.187.2/vsts-agent-linux-x64-2.187.2.tar.gz --output vsts.tgz
sudo tar -zxf vsts.tgz
sudo chown -R vsts:vsts /vsts-install

sudo su -c "./config.sh --unattended --url https://dev.azure.com/${MY_ORGANIZATION} --auth pat --token ${MY_INJECTED_TOKEN} --pool ${MY_POOL_NAME} --replace 2>&1 | tee /tmp/CONFIG_LOG" vsts

sudo ./svc.sh install || true
sudo ./svc.sh stop || true
sudo ./svc.sh start

cd ..