2017年4月11日火曜日

Azure仮想マシン展開用のJSONファイル

Microsoft Azureの仮想マシンを一般化して再展開する場合は、JSON形式のフォーマットでパラメーターを与える必要があります。

このフォーマット、なかなか複雑なので苦労します。私が使っているものを公開しておきます。

なお、このファイルはマイクロソフトの安納さんのブログ記事「Azure Resource Manager で作成した仮想マシンをキャプチャーする」に掲載されたものを一部修正し、可用性セットの設定を追加したものです。

もっとも、現在は「管理ディスク(managed disk)」を使った仮想マシンであれば、GUIで簡単に取り込めるので、JSONファイルの出番もあまりないかもしれません。



{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",

    "parameters": {
      "osMasterImageUri": {
      "type": "string",
      "metadata": {
        "description": "マスターイメージのURI"
      }
    },
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "仮想マシンの名前"
      }
    },
    "osType": {
      "type": "string",
      "allowedValues": [
        "Windows",
        "Linux"
      ],
      "defaultValue" :"Windows",
      "metadata": {
        "description": "OSのタイプ"
      }
    },
    "adminUserName": {
      "type": "string",
      "metadata": {
        "description": "管理者ユーザーID"
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "管理者ユーザーIDのパスワード"
      }
    },
    "vmSize": {
      "type": "string",
      "allowedValues": [
        "Standard_D1",
        "Standard_D1_v2",
        "Standard_F1"
      ],
      "defaultValue" :"Standard_F1",
      "metadata": {
        "description": "仮想マシンのサイズ"
      }
    },
    "StorageAccountName": {
      "type": "string",
      "metadata": {
        "description": "ストレージアカウントの名前"
      }
    },
    "existingVirtualNetworkName": {
      "type": "string",
      "metadata": {
        "description": "仮想ネットワーク"
      }
    },
    "subnetName": {
      "type": "string",
      "metadata": {
        "description": "サブネット名"
      }
    },
    "availabilitySetName": {
      "type": "string",
      "metadata": {
        "description": "可用性セット名"
      }
    }
  },

  "variables": {
    "api-version": "2015-06-15",
    "location": "[resourceGroup().location]",
    "publicIPAddressType": "Dynamic",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks', parameters('existingVirtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/', parameters('subnetName'))]",
    "nicName": "[concat(parameters('vmName'),'-nic')]",
    "publicIPAddressName": "[concat(parameters('vmName'),'-pip')]",
    "osDiskVhdName": "[concat('http://',parameters('StorageAccountName'),'.blob.core.windows.net/vhds/',parameters('vmName'),'osDisk.vhd')]"
  },

  "resources": [
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[variables('location')]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]"
      }
    },
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[variables('location')]",
      "dependsOn": [ "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]" ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[variables('subnetRef')]"
              }
            }
          }
        ]
     }
  },
  {
    "apiVersion": "[variables('api-version')]",
    "type": "Microsoft.Compute/virtualMachines",
    "name": "[parameters('vmName')]",
    "location": "[variables('location')]",
    "dependsOn": [
      "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
    ],
    "properties": {
      "hardwareProfile": {
        "vmSize": "[parameters('vmSize')]"
      },
      "osProfile": {
        "computername": "[parameters('vmName')]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]"
      },
      "storageProfile": {
        "osDisk": {
          "name": "[concat(parameters('vmName'),'-osDisk')]",
          "osType": "[parameters('osType')]",
          "caching": "ReadWrite",
          "createOption": "FromImage",
          "image": {
            "uri": "[parameters('osMasterImageUri')]"
          },
          "vhd": {
            "uri": "[variables('osDiskVhdName')]"
          }
        }
      },
      "networkProfile": {
        "networkInterfaces": [
          {
            "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
          }
        ]
      },
      "availabilitySet": {
           "id": "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySetName'))]"
      }
    }
  }
  ]
}