Azure CLI 如何检查资源是否存在
Azure CLI how to check if a resource exists
我开始编写 bash 脚本来在新的或现有的资源组中配置 VM,以便我们可以强制执行命名约定和配置。
在 bash 脚本中,我如何检查资源是否已经存在,以便我不再尝试重新创建它?
# 1. If a new resource group is desired, create it now. Microsoft Docs
az group create --name $RESOURCEGROUPNAME --location $LOCATION
# 2. Create a virtual network and subnet if one has not already been created. Microsoft Docs
# Consider a separate VNet for each resource group.
# az network vnet list -output table
az network vnet create \
--resource-group $RESOURCEGROUPNAME \
--name $RESOURCEGROUPNAME-vnet \
--address-prefix 10.0.x.0/24 \
--subnet-name default \
--subnet-prefix 10.0.x.0/24
# x is the next available 3rd octet value
# 3. Create a public IP Address. Microsoft Docs
az network public-ip create \
--resource-group $RESOURCEGROUPNAME \
--name $VMNAME-ip \
--dns-name $DNSNAME
# 4. Create a network security group. Microsoft Docs
az network nsg create \
--resource-group $RESOURCEGROUPNAME \
--name $VMNAME-nsg
# 5. Create a rule to allow SSH to the machine. Microsoft Docs
az network nsg rule create \
--resource-group $RESOURCEGROUPNAME \
--nsg-name $VMNAME-nsg \
--name allow-ssh \
--protocol tcp \
--priority 1000 \
--destination-port-range 22 \
--access allow
# 6. Create a virtual NIC. Microsoft Docs
az network nic create \
--resource-group $RESOURCEGROUPNAME \
--name $VMNAME-nic \
--vnet-name $RESOURCEGROUPNAME-vnet \
--subnet default \
--public-ip-address $VMNAME-ip \
--network-security-group $VMNAME-nsg
# 7. Create an availability set, if redundancy is required. Microsoft Docs
az vm availability-set create \
--resource-group $RESOURCEGROUPNAME \
--name $AVSETNAME-as
# 8. Create the VM. Microsoft Docs
az vm create \
--resource-group $RESOURCEGROUPNAME \
--location $LOCATION \
--name $VMNAME \
--image UbuntuLTS \
--size $VMSIZE \
--availability-set $AVSETNAME-as \
--nics $VMNAME-nic \
--admin-username $ADMINUSERNAME \
--authentication-type ssh
--ssh-key-value @$SSHPUBLICKEYFILE \
--os-disk-name $VMNAME-osdisk
In a bash script how can I check that a resource already exists so I
don't try to create it again?
我们可以使用CLI 2.0命令az group exists
来测试资源组是否存在,像这样:
C:\Users\user>az group exists -n jasontest
false
这样,在我们创建之前,我们可以测试名称是否可用。在新资源组中,我们可以创建新的Vnet和其他资源。
目前,没有 CLI 2.0 命令来测试其他资源是否存在。如果要在现有资源组中创建资源,也许我们应该使用 CLI 2.0 命令列出资源,并使用 bash 确定资源是否存在。
如果资源显示命令 returns 空字符串和成功状态代码 (0),则资源不存在。
编辑:ChrisWue 指出这不再是事实。自从我离开 Azure CLI 团队后它一定已经改变了(它曾经是要求 all 命令像这样工作)。或者可能是他在下面提到的密钥保管库命令存在错误。
这应该适用于 bash 脚本:
if [ $(az group exists --name $RESOURCEGROUPNAME) = false ]; then
az group create --name $RESOURCEGROUPNAME --location $LOCATION
fi
如另一个答案中所述 - 没有通用的“存在”命令。我发现的一种推理是,“创建”意味着具有相同的效力——因此,如果您有一个创建资源的脚本(例如,作为构建管道的一部分),那么执行它的频率并不重要,因为“它会做正确的事”。
如果您仍然需要这样做,您可以在 shell 中这样做(该示例适用于 keyvault,但它应该适用于所有具有 show 命令的资源类型)
if az keyvault show -n my-keyvault -o none; then
echo "keyvault exists"
else
echo "keyvault doesn't exist"
fi
需要注意的是,如果资源不存在,az
将向 stderr 输出一条错误消息 - 这不会影响检查,但如果它困扰您,那么您可以将 stderr 重定向到 /dev/null
在我们的例子中,我们需要这个,因为如果设置没有改变,我们不会 运行 基础脚本(将我们的构建时间缩短一半)。我们通过创建基础脚本的散列并将其存储在密钥库中来检测这一点。当脚本 运行s 它创建密钥库(以确保它存在)然后尝试检查包含哈希的秘密。如果哈希值仍然相同,则不要 运行 脚本的其余部分。
要注意的是 keyvault create
破坏了访问策略,其中还包括网络应用程序托管身份访问策略,如果脚本的其余部分没有 运行 则不会添加该策略。 .所以修复是首先检查密钥库是否存在,如果存在则不创建它。
这适用于我的批处理命令
call az webapp show --subscription <yoursubs> --resource-group <yourrg> --name <yourappname> -query name
if %errorlevel% == 1 (
az webapp create ...
)
您可以使用 JMESPath 查询来执行此操作。所有资源类型都支持这个,AFAIK。
例如,对于虚拟机:
az vm list --resource-group $RESOURCEGROUPNAME --query "[?name=='$VMNAME'] | length(@)"
这将输出匹配 VM 的数量 - 1
或 0
。
您可以使用它在 bash 中创建 if/else 逻辑,如下所示。
if [[ $(az vm list --resource-group $RESOURCEGROUPNAME --query "[?name=='$VMNAME'] | length(@)") > 0 ]]
then
echo "VM exists"
else
echo "VM doesn't exist"
fi
我开始编写 bash 脚本来在新的或现有的资源组中配置 VM,以便我们可以强制执行命名约定和配置。
在 bash 脚本中,我如何检查资源是否已经存在,以便我不再尝试重新创建它?
# 1. If a new resource group is desired, create it now. Microsoft Docs
az group create --name $RESOURCEGROUPNAME --location $LOCATION
# 2. Create a virtual network and subnet if one has not already been created. Microsoft Docs
# Consider a separate VNet for each resource group.
# az network vnet list -output table
az network vnet create \
--resource-group $RESOURCEGROUPNAME \
--name $RESOURCEGROUPNAME-vnet \
--address-prefix 10.0.x.0/24 \
--subnet-name default \
--subnet-prefix 10.0.x.0/24
# x is the next available 3rd octet value
# 3. Create a public IP Address. Microsoft Docs
az network public-ip create \
--resource-group $RESOURCEGROUPNAME \
--name $VMNAME-ip \
--dns-name $DNSNAME
# 4. Create a network security group. Microsoft Docs
az network nsg create \
--resource-group $RESOURCEGROUPNAME \
--name $VMNAME-nsg
# 5. Create a rule to allow SSH to the machine. Microsoft Docs
az network nsg rule create \
--resource-group $RESOURCEGROUPNAME \
--nsg-name $VMNAME-nsg \
--name allow-ssh \
--protocol tcp \
--priority 1000 \
--destination-port-range 22 \
--access allow
# 6. Create a virtual NIC. Microsoft Docs
az network nic create \
--resource-group $RESOURCEGROUPNAME \
--name $VMNAME-nic \
--vnet-name $RESOURCEGROUPNAME-vnet \
--subnet default \
--public-ip-address $VMNAME-ip \
--network-security-group $VMNAME-nsg
# 7. Create an availability set, if redundancy is required. Microsoft Docs
az vm availability-set create \
--resource-group $RESOURCEGROUPNAME \
--name $AVSETNAME-as
# 8. Create the VM. Microsoft Docs
az vm create \
--resource-group $RESOURCEGROUPNAME \
--location $LOCATION \
--name $VMNAME \
--image UbuntuLTS \
--size $VMSIZE \
--availability-set $AVSETNAME-as \
--nics $VMNAME-nic \
--admin-username $ADMINUSERNAME \
--authentication-type ssh
--ssh-key-value @$SSHPUBLICKEYFILE \
--os-disk-name $VMNAME-osdisk
In a bash script how can I check that a resource already exists so I don't try to create it again?
我们可以使用CLI 2.0命令az group exists
来测试资源组是否存在,像这样:
C:\Users\user>az group exists -n jasontest
false
这样,在我们创建之前,我们可以测试名称是否可用。在新资源组中,我们可以创建新的Vnet和其他资源。
目前,没有 CLI 2.0 命令来测试其他资源是否存在。如果要在现有资源组中创建资源,也许我们应该使用 CLI 2.0 命令列出资源,并使用 bash 确定资源是否存在。
如果资源显示命令 returns 空字符串和成功状态代码 (0),则资源不存在。
编辑:ChrisWue 指出这不再是事实。自从我离开 Azure CLI 团队后它一定已经改变了(它曾经是要求 all 命令像这样工作)。或者可能是他在下面提到的密钥保管库命令存在错误。
这应该适用于 bash 脚本:
if [ $(az group exists --name $RESOURCEGROUPNAME) = false ]; then
az group create --name $RESOURCEGROUPNAME --location $LOCATION
fi
如另一个答案中所述 - 没有通用的“存在”命令。我发现的一种推理是,“创建”意味着具有相同的效力——因此,如果您有一个创建资源的脚本(例如,作为构建管道的一部分),那么执行它的频率并不重要,因为“它会做正确的事”。
如果您仍然需要这样做,您可以在 shell 中这样做(该示例适用于 keyvault,但它应该适用于所有具有 show 命令的资源类型)
if az keyvault show -n my-keyvault -o none; then
echo "keyvault exists"
else
echo "keyvault doesn't exist"
fi
需要注意的是,如果资源不存在,az
将向 stderr 输出一条错误消息 - 这不会影响检查,但如果它困扰您,那么您可以将 stderr 重定向到 /dev/null
在我们的例子中,我们需要这个,因为如果设置没有改变,我们不会 运行 基础脚本(将我们的构建时间缩短一半)。我们通过创建基础脚本的散列并将其存储在密钥库中来检测这一点。当脚本 运行s 它创建密钥库(以确保它存在)然后尝试检查包含哈希的秘密。如果哈希值仍然相同,则不要 运行 脚本的其余部分。
要注意的是 keyvault create
破坏了访问策略,其中还包括网络应用程序托管身份访问策略,如果脚本的其余部分没有 运行 则不会添加该策略。 .所以修复是首先检查密钥库是否存在,如果存在则不创建它。
这适用于我的批处理命令
call az webapp show --subscription <yoursubs> --resource-group <yourrg> --name <yourappname> -query name
if %errorlevel% == 1 (
az webapp create ...
)
您可以使用 JMESPath 查询来执行此操作。所有资源类型都支持这个,AFAIK。
例如,对于虚拟机:
az vm list --resource-group $RESOURCEGROUPNAME --query "[?name=='$VMNAME'] | length(@)"
这将输出匹配 VM 的数量 - 1
或 0
。
您可以使用它在 bash 中创建 if/else 逻辑,如下所示。
if [[ $(az vm list --resource-group $RESOURCEGROUPNAME --query "[?name=='$VMNAME'] | length(@)") > 0 ]]
then
echo "VM exists"
else
echo "VM doesn't exist"
fi