点击上方蓝字关注“汪宇杰博客”

导语
Azure CLI 可以帮助我们使用脚本完成 Azure 的自动化配置和管理任务。理想情况下对于经常需要重复操作的任务,使用 CLI 脚本可以防止996修福报。然而 Azure CLI 目前仍有一些功能还不够方便,反而会让我们写脚本的时候修福报,比如检查资源是否存在……
对于某些资源类型,例如资源组(Resource Group),Azure CLI 直接提供了 exists 指令可以返回资源是否存在。例如我们的脚本在创建资源组之前可以先判断其是否存在:
$rsgExists = az group exists -n $rsgName
if ($rsgExists -eq 'false') {
az group create -l $regionName -n $rsgName
}
然而Bing不是每种 Azure 资源都提供了 exists 指令。截至目前最新版 2.1 CLI,其中 App Service Plan 就木有 exits 指令:

参考:https://docs.microsoft.com/en-us/cli/azure/appservice/plan?view=azure-cli-latest
既然 Azure CLI 对于部分资源类型还没提供原生 exits 支持,我们只能自己 996 一下,利用现有的指令查找资源名称,并判断返回结果的数目是否大于零,以此判断资源是否存在。
以 Windows PowerShell 为例,执行 az appservice plan list 可以列出当前订阅下所有的 App Service Plan。而加上 --query 参数就可以按条件筛选 App Service Plan,比如按名称筛选就是 ?name='名称'
az appservice plan list --query "[?name=='moonglade-test-plan']"

对于不存在的 App Service Plan,返回为空
az appservice plan list --query "[?name=='work996']"

这里的第一份福报是 Azure CLI 的返回格式为 Json 字符串,要让它转化为对象才可以被 PowerShell 识别进行后续操作。幸好 PowerShell 自带了很方便的转换方法,解决了福报:在命令后加上 | ConvertFrom-Json

于是,我们可以通过检查返回的数组对象长度是否大于0来判断 App Service Plan 是否存在:

这里会遇到第二个福报。注意看,这里的 True 和 False 是真正的布尔类型,而 Azure CLI 自带的 exists 命令返回的是字符串的 'true' 或 'false'。因此在这里,我们可以直接用if语句来判断这个真正的布尔类型,而不是像之前那样用-eq判断字符串相等。我的实际代码如下:
$planCheck = az appservice plan list --query "[?name=='$aspName']" | ConvertFrom-Json
$planExists = $planCheck.Length -gt 0
if (!$planExists) {
az appservice plan create -n $aspName -g $rsgName --sku S1 --location $regionName
}

参考: https://github.com/Azure/azure-cli/issues/6442#issuecomment-392963887