如何使用Azure cli仅将标记分配给资源组中的所有VM

时间:2018-03-28 13:32:44

标签: azure tags virtual-machine command-line-interface

我正在尝试编写Azure CLI脚本,使用服务主体将我登录到门户网站,选择订阅,然后仅为每个资源组的订阅标记VM。

az login -u $service_principal_ID -p $service_principal_password --service-principal --tenant $tenant_ID

az account set --subscription $subID

az resource tag --resource-group $rg \
--tags tags.project=$project tags.owner=$owner tags.environment=$env \
--resource-type "Microsoft.Compute/virtualMachines" \
--output tsv

Azure在运行时出现错误,说--name缺失,但我不想逐个标记虚拟机。

任何想法?

2 个答案:

答案 0 :(得分:0)

我还没有尝试过这个(我不需要任何资源标记;)

但是这样的事情会让你工作。

基本上,您需要传递该命名参数,唯一的方法是首先解析VM列表。

sample=$(az vm list --resource-group $rg )
for row in $(echo "${sample}" | jq -r '.[] | @base64'); do
    _jq() {
    echo ${row} | base64 --decode | jq -r ${1}
    }

VMName=$(_jq '.name')

az resource tag --resource-group $rg \
--tags tags.project=$project tags.owner=$owner tags.environment=$env \
--resource-type "Microsoft.Compute/virtualMachines" \
--name $VMName \
--output tsv

done

完全不相关,这可能应该被删除 - 但是该死的,我确实想念这个东西在PowerShell中是多么容易。

答案 1 :(得分:0)

将所需的标记添加到资源组:

az group update -n $rg \
--set tags.project=$project tags.owner=$owner tags.environment=$env

然后将该资源组中的所有代码应用于每个子资源:

do
  jsontag=$(az group show -n $rg --query tags)
  t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')
  r=$(az resource list -g $rg --query [].id --output tsv)
  for resid in $r
  do
    az resource tag --tags $t --id $resid
  done
done