Azure CLI如何检查资源是否存在

Azure CLI如何检查资源是否存在,azure,azure-virtual-machine,azure-cli,azure-cli2,Azure,Azure Virtual Machine,Azure Cli,Azure Cli2,我开始编写一个bash脚本,在新的或现有的资源组中提供一个VM,以便我们可以强制执行命名约定和配置 在bash脚本中,如何检查资源是否已经存在,以便不再尝试创建它 #1。如果需要新的资源组,请立即创建它。微软文档 az组创建--名称$RESOURCEGROUPNAME--位置$location # 2. 创建虚拟网络和子网(如果尚未创建)。微软文档 考虑每个资源组的一个单独的VNET。 #az网络vnet列表-输出表 az网络vnet创建\ --资源组$RESOURCEGROUPNAME\

我开始编写一个bash脚本,在新的或现有的资源组中提供一个VM,以便我们可以强制执行命名约定和配置

在bash脚本中,如何检查资源是否已经存在,以便不再尝试创建它

#1。如果需要新的资源组,请立即创建它。微软文档
az组创建--名称$RESOURCEGROUPNAME--位置$location
# 2.    创建虚拟网络和子网(如果尚未创建)。微软文档
考虑每个资源组的一个单独的VNET。
#az网络vnet列表-输出表
az网络vnet创建\
--资源组$RESOURCEGROUPNAME\
--名称$RESOURCEGROUPNAME vnet\
--地址前缀10.0.x.0/24\
--子网名称默认值\
--子网前缀10.0.x.0/24
#x是下一个可用的第三个八位字节值
# 3.    创建公共IP地址。微软文档
az网络公共ip创建\
--资源组$RESOURCEGROUPNAME\
--名称$VMNAME ip\
--dns名称$DNSNAME
# 4.    创建网络安全组。微软文档
az网络nsg创建\
--资源组$RESOURCEGROUPNAME\
--名称$VMNAME nsg
# 5.    创建允许SSH访问计算机的规则。微软文档
az网络nsg规则创建\
--资源组$RESOURCEGROUPNAME\
--nsg名称$VMNAME nsg\
--名称允许ssh\
--协议tcp\
--优先权1000\
--目标端口范围22\
--允许访问
# 6.    创建虚拟NIC。微软文档
az网络nic创建\
--资源组$RESOURCEGROUPNAME\
--名称$VMNAME nic\
--vnet名称$RESOURCEGROUPNAME vnet\
--子网默认值\
--公共ip地址$VMNAME ip\
--网络安全组$VMNAME nsg
# 7.    如果需要冗余,则创建可用性集。微软文档
az虚拟机可用性集创建\
--资源组$RESOURCEGROUPNAME\
--名称$AVSETNAME为
# 8.    创建虚拟机。微软文档
az虚拟机创建\
--资源组$RESOURCEGROUPNAME\
--地点$地点\
--名称$VMNAME\
--图像结果\
--大小$VMSIZE\
--可用性设置$AVSETNAME为\
--nic$VMNAME nic\
--管理员用户名$ADMINUSERNAME\
--身份验证类型ssh
--ssh密钥值@$SSHPUBLICKEYFILE\
--操作系统磁盘名$VMNAME操作系统磁盘
在bash脚本中,如何检查资源是否已经存在,以便 不要再尝试创建它了

我们可以使用CLI 2.0命令
az group exists
测试资源组是否存在,如下所示:

C:\Users\user>az group exists -n jasontest
false
这样,在创建它之前,我们可以测试名称是否可用。在新资源组中,我们可以创建新的Vnet和其他资源


目前,有nocli2.0命令来测试其他资源是否存在。如果要在现有资源组中创建资源,可能应该使用CLI 2.0命令列出资源,并使用bash确保资源是否存在。

如果资源显示命令返回空字符串和成功状态代码(0),则资源不存在


编辑:克里斯伍指出这不再是事实。自从我离开Azure CLI团队后,它一定发生了变化(以前要求所有命令都是这样工作的)。或者,他在下面提到的关键vault命令可能存在错误。

这应该在bash脚本中起作用:

如果[$(az组存在--name$RESOURCEGROUPNAME)=false];然后
az组创建--名称$RESOURCEGROUPNAME--位置$location
fi

如另一个答案中所述-没有通用的“exists”命令。我发现的一条推理路线是,“create”意味着idem强大——因此,如果您有一个创建资源的脚本(例如作为构建管道的一部分),那么执行它的频率并不重要,因为“它将做正确的事情”

如果仍然需要这样做,可以在shell中这样做(该示例适用于keyvault,但它应该适用于具有show命令的所有资源类型)

应该注意的是,如果资源不存在,
az
将向stderr输出一条错误消息-这不会影响检查,但是如果它困扰您,那么您可以将stderr重定向到
/dev/null

在我们的例子中,我们需要这样做,因为如果设置没有改变,我们就不会运行infra脚本(将构建时间减少一半)。我们通过创建infra脚本的散列并将其存储在keyvault中来检测它。当脚本运行时,它会创建keyvault(以确保它存在),然后尝试检查包含哈希的秘密。如果哈希值仍然相同,则不要运行脚本的其余部分


问题是
keyvault create
取消访问策略,其中还包括web应用程序管理的身份访问策略,如果脚本的其余部分未运行,则不会添加该策略。。。因此,解决方法是首先检查keyvault是否存在,如果存在则不创建它。

这适用于我的批处理命令

call az webapp show --subscription <yoursubs> --resource-group <yourrg> --name <yourappname> -query name
if %errorlevel% == 1 (
    az webapp create ...
)
调用az webapp show--订阅--资源组--名称--查询名称
如果%errorlevel%==1(
az网络应用程序创建。。。
)

您可以使用JMESPath查询来完成此操作。所有资源类型都支持这一点

例如,对于虚拟机:

az虚拟机列表--资源组$RESOURCEGROUPNAME--查询“[?名称=='$VMNAME']|长度(@)”
这将输出匹配VM的数量-要么
1
要么
0

您可以使用它在bash中创建if/else逻辑,如下所示

if[[$(az vm列表--资源组$RESOURCEGROUPNAME--查询”[?名称=='$VMNAME']|长度(@)>0]]
然后
回显“虚拟机存在”
其他的
回显“虚拟机不存在”
fi

请您添加一个例子,好吗?这个答案充其量是不完整的,至少在某些资源中是不正确的<代码>az keyvault show-n不存在返回错误消息,如果keyvault不存在,则退出代码3。这种行为已经在az cli 2.2和2.9上进行了测试,我怀疑其他资源也会发生同样的情况
call az webapp show --subscription <yoursubs> --resource-group <yourrg> --name <yourappname> -query name
if %errorlevel% == 1 (
    az webapp create ...
)