【问题标题】:Can I create an Azure DevOps varIable group from azure cli and pass it some value?我可以从 azure cli 创建一个 Azure DevOps 变量组并传递一些值吗?
【发布时间】:2019-11-25 08:32:45
【问题描述】:

我在 Azure DevOps 中声明了以下变量组。

KUBERNETES_CLUSTER = myAksCluster
RESOURCE_GROUP = myResourceGroup

在发布管道过程中,我想创建一个公共静态 IP 地址,以便分配给myAksCluster 中的某个应用程序。

通过 Azure cli 命令,我通过 az cli bash small script 创建了这种方式的静态 IP 地址。我们可以在这里假设我已经创建了 kubernetes 集群

#!/usr/bin/env bash

KUBERNETES_CLUSTER=myAksCluster
RESOURCE_GROUP=myResourceGroup

# Getting the name of the node resource group. -o tsv is to get the value without " "
NODE_RESOURCE_GROUP=$(az aks show --resource-group $RESOURCE_GROUP --name $KUBERNETES_CLUSTER --query nodeResourceGroup -o tsv)
echo "Node Resource Group:" $NODE_RESOURCE_GROUP

# Creating Public Static IP
PUBLIC_IP_NAME=DevelopmentStaticIp
az network public-ip create --resource-group $NODE_RESOURCE_GROUP --name $PUBLIC_IP_NAME --allocation-method static

# Query the ip
PUBLIC_IP_ADDRESS=$(az network public-ip list --resource-group $NODE_RESOURCE_GROUP --query [1].ipAddress --output tsv)
# Output 
# I want to use the value of PUBLIC_IP_ADDRESS variable in Azure DevOps variable  groups of the release pipeline

如果我执行az network public-ip list ... 命令,我将获得我的公共 IP 地址。

⟩ az network public-ip list --resource-group $NODE_RESOURCE_GROUP --query [1].ipAddress -o tsv
10.x.x.x

我想使用 PUBLIC_IP_ADDRESS 值将其分配给我的版本中的新 Azure DevOps 变量组,但是从 CLI 任务或 Azure Cli 任务中执行所有这些过程,就像发布管道过程的一部分一样。

这个想法是当我之前的 az cli bash 小脚本要在发布管道中执行时,我的 ReleaseDev azure 变量组中有一个新变量是这样的:

然后,我可以使用PUBLIC_STATIC_IP_ADDRESS,它将是一个天蓝色的 devops 变量,类似于应用程序的参数,它将在我的 kubernetes 集群中使用该 IP 值。

我一直在检查一些信息,也许我可以在我的发布管道中创建一个 Azure CLI 任务来执行 az cli bash 小脚本,该脚本正在以这种方式创建公共静态 IP 地址:

但是当我得到公共 IP 地址值时,我不知道如何从这个 Azure CLI 任务(我的脚本)创建变量 PUBLIC_STATIC_IP_ADDRESS 及其各自的值,我在这里得到了。

我可以使用发布管道中的 Azure CLI 任务来获取这个小型工作流吗?我一直在检查this recommendation之类的东西 但我不清楚

如何使用从我的发布管道传递的一些值创建一个 Az 变量组? Azure CLI 发布管道任务是正确的任务吗?

更新

我遵循 Lu Mike 提出的方法,因此我创建了一个 Powershell 任务并以内联类型/模式执行以下脚本:

# Connect-AzAccount
Install-Module -Name Az -AllowClobber -Force 

@{KUBERNETES_CLUSTER = "$KUBERNETES_CLUSTER"}
@{RESOURCE_GROUP = "$RESOURCE_GROUP"}

@{NODE_RESOURCE_GROUP="$(az aks show --resource-group $RESOURCE_GROUP --name $KUBERNETES_CLUSTER --query nodeResourceGroup -o tsv)"}
# echo "Node Resource Group:" $NODE_RESOURCE_GROUP

@{PUBLIC_IP_NAME="Zcrm365DevelopmentStaticIpAddress"}
az network public-ip create --resource-group $NODE_RESOURCE_GROUP --name $PUBLIC_IP_NAME --allocation-method static

@{PUBLIC_IP_ADDRESS="$(az network public-ip list --resource-group $NODE_RESOURCE_GROUP --query [1].ipAddress --output tsv)"}
echo "##vso[task.setvaraible variable=ipAddress;]%PUBLIC_IP_ADDRESS%"

$orgUrl="https://dev.azure.com/my-org/"

$projectName = "ZCRM365"

##########################################################################
$personalToken = $PAT # "<your PAT>" 
# I am creating a varaible environment inside the power shell task and reference it here.
##########################################################################

$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header = @{authorization = "Basic $token"}

$projectsUrl = "$($orgUrl)/$($projectName)/_apis/distributedtask/variablegroups/1?api-version=5.0-preview.1"

$requestBody = @{
    "variables" = @{
        "PUBLIC_STATIC_IP_ADDRESS" = @{
            "value" = "$PUBLIC_IP_ADDRESS"
        }
    }
    "@type" = "Vsts"
    "name" = "ReleaseVariablesDev"
    "description" = "Updated variable group"
} | ConvertTo-Json

Invoke-RestMethod -Uri $projectsUrl -Method Put -ContentType "application/json" -Headers $header -Body $requestBody
Invoke-RestMethod -Uri $projectsUrl -Method Put -ContentType "application/json" -Headers $header -Body $requestBody

重要

如您所见,在此过程中,我在此任务中混合了 az cli 命令和 powershell 语言。我不确定它是否好。 顺便说一句,我正在使用 Linux 代理。

我必须在 Install-Module -Name Az -AllowClobber -Force 命令中包含 -Force 标志才能安装 azure powershell 模块


我的输出如下:

2019-07-19T06:01:29.6372873Z Name                           Value
2019-07-19T06:01:29.6373433Z ----                           -----
2019-07-19T06:01:29.6373706Z KUBERNETES_CLUSTER             
2019-07-19T06:01:29.6373856Z RESOURCE_GROUP                 
2019-07-19T06:01:38.0177665Z ERROR: az aks show: error: argument --resource-group/-g: expected one argument
2019-07-19T06:01:38.0469751Z usage: az aks show [-h] [--verbose] [--debug]
2019-07-19T06:01:38.0470669Z                    [--output {json,jsonc,table,tsv,yaml,none}]
2019-07-19T06:01:38.0471442Z                    [--query JMESPATH] --resource-group RESOURCE_GROUP_NAME
2019-07-19T06:01:38.0472050Z                    --name NAME [--subscription _SUBSCRIPTION]
2019-07-19T06:01:38.1381959Z NODE_RESOURCE_GROUP            
2019-07-19T06:01:38.1382691Z PUBLIC_IP_NAME                 Zcrm365DevelopmentStaticIpAddress
2019-07-19T06:01:39.5094672Z ERROR: az network public-ip create: error: argument --resource-group/-g: expected one argument
2019-07-19T06:01:39.5231190Z usage: az network public-ip create [-h] [--verbose] [--debug]
2019-07-19T06:01:39.5232152Z                                    [--output {json,jsonc,table,tsv,yaml,none}]
2019-07-19T06:01:39.5232671Z                                    [--query JMESPATH] --resource-group
2019-07-19T06:01:39.5233234Z                                    RESOURCE_GROUP_NAME --name NAME
2019-07-19T06:01:39.5233957Z                                    [--location LOCATION]
2019-07-19T06:01:39.5234866Z                                    [--tags [TAGS [TAGS ...]]]
2019-07-19T06:01:39.5235731Z                                    [--allocation-method {Static,Dynamic}]
2019-07-19T06:01:39.5236428Z                                    [--dns-name DNS_NAME]
2019-07-19T06:01:39.5236795Z                                    [--idle-timeout IDLE_TIMEOUT]
2019-07-19T06:01:39.5237070Z                                    [--reverse-fqdn REVERSE_FQDN]
2019-07-19T06:01:39.5240483Z                                    [--version {IPv4,IPv6}]
2019-07-19T06:01:39.5250084Z                                    [--sku {Basic,Standard}] [--zone {1,2,3}]
2019-07-19T06:01:39.5250439Z                                    [--ip-tags IP_TAGS [IP_TAGS ...]]
2019-07-19T06:01:39.5251048Z                                    [--public-ip-prefix PUBLIC_IP_PREFIX]
2019-07-19T06:01:39.5251594Z                                    [--subscription _SUBSCRIPTION]
2019-07-19T06:01:40.4262896Z ERROR: az network public-ip list: error: argument --resource-group/-g: expected one argument
2019-07-19T06:01:40.4381683Z usage: az network public-ip list [-h] [--verbose] [--debug]
2019-07-19T06:01:40.4382086Z                                  [--output {json,jsonc,table,tsv,yaml,none}]
2019-07-19T06:01:40.4382346Z                                  [--query JMESPATH]
2019-07-19T06:01:40.4382668Z                                  [--resource-group RESOURCE_GROUP_NAME]
2019-07-19T06:01:40.4382931Z                                  [--subscription _SUBSCRIPTION]
2019-07-19T06:01:40.5103276Z PUBLIC_IP_ADDRESS              
2019-07-19T06:01:40.5133644Z ##[error]Unable to process command '##vso[task.setvaraible variable=ipAddress;]%PUBLIC_IP_ADDRESS%' successfully. Please reference documentation (http://go.microsoft.com/fwlink/?LinkId=817296)
2019-07-19T06:01:40.5147351Z ##[error]##vso[task.setvaraible] is not a recognized command for Task command extension. Please reference documentation (http://go.microsoft.com/fwlink/?LinkId=817296)

也许这就是我在执行az 命令时遇到问题的原因

Power shell 及其各自的 azure 任务对我来说是新的,我不确定如何才能完成这个过程。

【问题讨论】:

    标签: bash kubernetes azure-devops azure-aks


    【解决方案1】:

    您可以尝试调用 REST API(Variablegroups - Update) 在脚本中添加或更新变量组。请参考以下脚本。

    $orgUrl = "https://dev.azure.com/<your organization >"
    $projectName = "<your project>"
    $personalToken = "<your PAT>"
    
    $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
    $header = @{authorization = "Basic $token"}
    
    $projectsUrl = "$($orgUrl)/$($projectName)/_apis/distributedtask/variablegroups/1?api-version=5.0-preview.1"
    
    $requestBody = @{
      "variables" = @{
        "PUBLIC_STATIC_IP_ADDRESS" = @{
          "value" = "<the static ip you got>"
        }
      }
      "@type" = "Vsts"
      "name" = "<your variable group name>"
      "description" = "Updated variable group"
    } | ConvertTo-Json
    
    Invoke-RestMethod -Uri $projectsUrl -Method Put -ContentType "application/json" -Headers $header -Body $requestBody
    

    然后,您将在组中找到该变量。

    更新:

    您可以将AZ 命令直接用作powershell 脚本,因为在您为powershell 安装Az 模块后,Az 命令支持powershell 和bash。 请参考以下脚本。

    $KUBERNETES_CLUSTER = "KUBERNETES_CLUSTER"
    $RESOURCE_GROUP = "RESOURCE_GROUP"
    $PUBLIC_IP_ADDRESS
    
    $PUBLIC_IP_NAME="Zcrm365DevelopmentStaticIpAddress"
    $NODE_RESOURCE_GROUP = az aks show --resource-group $RESOURCE_GROUP --name $KUBERNETES_CLUSTER --query nodeResourceGroup -o tsv | az network public-ip create --resource-group --name $PUBLIC_IP_NAME --allocation-method static
    
    az network public-ip create --resource-group $NODE_RESOURCE_GROUP --name $PUBLIC_IP_NAME --allocation-method static
    
    $PUBLIC_IP_ADDRESS = az network public-ip list --resource-group $NODE_RESOURCE_GROUP --query [1].ipAddress --output tsv
    
    echo "##vso[task.setvaraible variable=ipAddress;]$PUBLIC_IP_ADDRESS"
    
    $orgUrl="https://dev.azure.com/<org>/"
    
    ....
    

    请参考以下链接了解az命令在powershell中的使用。

    https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-script

    Azure CLI vs Powershell?

    【讨论】:

    • 我不知道 Azure DevOps Services REST API 参考,看起来是一个很好的资源。我的疑问是,我如何将所有内容放在一起工作,我的意思是,我如何混合用于获取 IP 地址和此脚本的 azure cli 命令(bash)?我对此有点困惑。这个脚本是什么语言?可能是 Powershell?
    • Azure 命令行界面 (CLI) 是 Microsoft 用于管理 Azure 资源的跨平台命令行体验。它支持 bash 脚本和 powershell 脚本。上面的脚本是用powershell编写的。
    • 你的意思是,类似于这个过程? docs.microsoft.com/en-us/cli/azure/vm/… 我的意思是,在az cli 命令中调用脚本?或者在这个 powershell 脚本中包含我所有的 az 命令?
    • 您可以添加一个powershell任务,并将脚本指定为内联或脚本路径。在powershell脚本中,首先需要使用powershell命令安装Azure CLI模块,请看Install the Azure PowerShell module,之后可以在powershell脚本中添加az命令和我的代码。
    • 顺便说一句,您提到的链接是针对VM的,您不需要为vm运行az命令。
    【解决方案2】:

    您可以使用 Lu Mike 提到的 Rest API 来更新变量组,或者您可以安装 Shared variable updater 扩展来为您完成。

    但重要的是,您需要在 Azure CLI 任务中设置一个变量,以便在第二个任务(它是 Rest API 任务或共享变量更新程序任务)中使用它。所以你需要将这一行添加到你的脚本中:

    echo "##vso[task.setvaraible variable=ipAddress;]%PUBLIC_IP_ADDRESS%"
    

    现在在接下来的任务中,您可以使用包含 ip 值的变量 $(ipAddress)

    【讨论】:

    • 嗨,Shayki。我或多或少了解要遵循的工作流程。为了熟悉 Powershell 语言,我在您的回答中遵循 Mike Lu 方法,但我有一些错误。你能看看我原来问题中的 UPDATE 部分吗?
    • @bgarcial 为什么不在 azure cli 任务中设置变量,在另一个 powershell 任务中将它们推送到组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多