2016年5月17日火曜日

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - Azure Virtual Machine with RDP connection 記事訂正

githubのAzure Resource Manager テンプレート https://github.com/Azure/azure-quickstart-templatesは、ご存じだと思います。

自分の勉強もかねて、テンプレートをカスタマイズしてみたので、参考までに公開します。
もっと洗練された方法があればコメントもらえるとありがたいです。

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - Azure Virtual MachineにRDP接続用のエンドポイントを追加してみました。
元ネタは、
Azure Resource Manager Template Visualizerを開いたときに既定で表示される複数NICのテンプレートです。

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - 仮想ネットワークgithubのAzure Resource Manager テンプレートをカスタマイズしてみた - ストレージアカウントが先にデプロイされている前提です。
※2016/05/17 確認したところ、本記事のJSONファイルでは、仮想ネットワークは都度作成(つまり上書き)されることがわかりましたので、訂正します。
 githubのAzure Resource Manager テンプレートをカスタマイズしてみた - Azure Virtual Machine 記事訂正 に記載した通り、仮想ネットワークのフルセット記述不要です。既存の仮想ネットワークに関連付ける方法は調べたうえで、別途ブログ記事として投稿しようと思います。
 同様にストレージアカウントも関連付けの設定がありそうか否かを確認しようと思います。


githubのAzure Resource Manager テンプレートをカスタマイズしてみた - Azure Virtual Machineで公開したJSONファイルとのdiffをbash on Ubuntu on Windowsで取りました(しつこい)!

diff armTemplate-simplewindows-modified.json armTemplate-simplewindows-modified-withRDP.json
39a40,46
>     },
>     "rdpFrontend": {
>       "type": "int",
>       "defaultValue": 50001,
>       "metadata": {
>         "description": "Public port number for RDP"
>       }
47a55,56
>     "vmName": "[parameters('vmName')]",
>     "vmSize": "Standard_D1",
57,58d65
<     "vmName": "[parameters('vmName')]",
<     "vmSize": "Standard_D1",
61a69,77
>     "lbName": "[concat(parameters('vmName'),'-LB')]",
>     "lbInboundNatRulesName": "[concat(parameters('vmName'),'-lbInboundNatRules01')]",
>     "lbFrontEndName": "[concat(parameters('vmName'),'-lbFrontEnd')]",
>     "lbBackendAddressPoolName": "[concat(parameters('vmName'),'-lbBackendPool1')]",
>     "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]",
>     "lbID": "[resourceId('Microsoft.Network/loadBalancers',variables('lbName'))]",
>     "lbFrontEndIPConfigID": "[concat(variables('lbID'),'/frontendIPConfigurations/',variables('lbFrontEndName'))]",
>     "lbPoolID": "[concat(variables('lbID'),'/backendAddressPools/',variables('lbBackendAddressPoolName'))]",
>     "lbNatID": "[concat(variables('lbID'),'/inboundNatRules/',variables('lbInboundNatRulesName'))]",
77c93
<       "name": "myPublicIP",
---
>       "name": "[variables('publicIPAddressName')]",
87a104,143
>       "name": "[variables('lbName')]",
>       "type": "Microsoft.Network/loadBalancers",
>       "location": "[resourceGroup().location]",
>       "dependsOn": [
>         "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
>       ],
>       "properties": {
>         "frontendIPConfigurations": [
>           {
>             "name": "[variables('lbFrontEndName')]",
>             "properties": {
>               "publicIPAddress": {
>                 "id": "[variables('publicIPAddressID')]"
>               }
>             }
>           }
>         ],
>         "backendAddressPools": [
>           {
>             "name": "[variables('lbBackendAddressPoolName')]"
>           }
>         ],
>         "inboundNatRules": [
>           {
>             "name": "[variables('lbInboundNatRulesName')]",
>             "properties": {
>               "frontendIPConfiguration": {
>                 "id": "[variables('lbFrontEndIPConfigID')]"
>               },
>               "protocol": "tcp",
>               "frontendPort": "[parameters('rdpFrontend')]",
>               "backendPort": 3389,
>               "enableFloatingIP": false
>             }
>           }
>         ]
>       }
>     },
>     {
>       "apiVersion": "[variables('apiVersion')]",
113,114c169,170
<         "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
<         "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]"
---
>         "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
>         "[concat('Microsoft.Network/loadBalancers/',variables('lbName'))]"
122,124d177
<               "publicIPAddress": {
<                 "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
<               },
127c180,190
<               }
---
>               },
>               "loadBalancerBackendAddressPools": [
>                 {
>                   "id": "[variables('lbPoolID')]"
>                 }
>               ],
>               "loadBalancerInboundNatRules": [
>                 {
>                   "id": "[variables('lbNatID')]"
>                 }
>               ]
  • 外向けのRDPポート指定するためのparametersを追加。
  • 外向けRDPポートと3389をマッピングするための記述を追加。
  • 外向けのRDPポートのために、Microsoft.Network/loadBalancersを追加し、NICのdependsOnはMicrosoft.Network/virtualNetworks/をそのままとしつつ、Microsoft.Network/publicIPAddresses/のかわりにMicrosoft.Network/loadBalancers/を入れる。
    代わりにMicrosoft.Network/loadBalancers/のdependsOnはMicrosoft.Network/publicIPAddresses/を入れる。
  • resourcesのパブリックIPアドレスの名前をVM名由来に変更。
  • resourcesにあったidのconcatが可読性を損なっているので、valiablesへ移動。
といった感じでカスタマイズし直しました。 Azure Resource Manager Template Visualizerで表示するとこういう感じ。
ということで、JSONのソースファイルを貼っておきます。 ※Azure Resource Managerでデプロイ確認済みです。
{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "name for the Virtual Machine."
      }
    },
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "dnsLabelPrefix": {
      "type": "string",
      "metadata": {
        "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "2012-R2-Datacenter",
      "allowedValues": [
        "2008-R2-SP1",
        "2012-Datacenter",
        "2012-R2-Datacenter"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
      }
    },
    "rdpFrontend": {
      "type": "int",
      "defaultValue": 50001,
      "metadata": {
        "description": "Public port number for RDP"
      }
    }
  },
  "variables": {
    "storageAccountName": "armstorageact01",
    "sizeOfDiskInGB": "100",
    "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
    "imagePublisher": "MicrosoftWindowsServer",
    "imageOffer": "WindowsServer",
    "vmName": "[parameters('vmName')]",
    "vmSize": "Standard_D1",
    "OSDiskName": "[concat(variables('vmName'),'-os')]",
    "nicName": "[concat(variables('vmName'),'-nic1')]",
    "addressPrefix": "10.0.0.0/16",
    "subnetName": "Subnet1",
    "subnetPrefix": "10.0.0.0/24",
    "storageAccountType": "Standard_LRS",
    "publicIPAddressName": "[concat(variables('vmName'),'-PublicIP')]",
    "publicIPAddressType": "Dynamic",
    "vmStorageAccountContainerName": "vhds",
    "virtualNetworkName": "ArmVNet1",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
    "lbName": "[concat(parameters('vmName'),'-LB')]",
    "lbInboundNatRulesName": "[concat(parameters('vmName'),'-lbInboundNatRules01')]",
    "lbFrontEndName": "[concat(parameters('vmName'),'-lbFrontEnd')]",
    "lbBackendAddressPoolName": "[concat(parameters('vmName'),'-lbBackendPool1')]",
    "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]",
    "lbID": "[resourceId('Microsoft.Network/loadBalancers',variables('lbName'))]",
    "lbFrontEndIPConfigID": "[concat(variables('lbID'),'/frontendIPConfigurations/',variables('lbFrontEndName'))]",
    "lbPoolID": "[concat(variables('lbID'),'/backendAddressPools/',variables('lbBackendAddressPoolName'))]",
    "lbNatID": "[concat(variables('lbID'),'/inboundNatRules/',variables('lbInboundNatRulesName'))]",
    "apiVersion": "2015-06-15"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "apiVersion": "[variables('apiVersion')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "accountType": "[variables('storageAccountType')]"
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[parameters('dnsLabelPrefix')]"
        }
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "name": "[variables('lbName')]",
      "type": "Microsoft.Network/loadBalancers",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
      ],
      "properties": {
        "frontendIPConfigurations": [
          {
            "name": "[variables('lbFrontEndName')]",
            "properties": {
              "publicIPAddress": {
                "id": "[variables('publicIPAddressID')]"
              }
            }
          }
        ],
        "backendAddressPools": [
          {
            "name": "[variables('lbBackendAddressPoolName')]"
          }
        ],
        "inboundNatRules": [
          {
            "name": "[variables('lbInboundNatRulesName')]",
            "properties": {
              "frontendIPConfiguration": {
                "id": "[variables('lbFrontEndIPConfigID')]"
              },
              "protocol": "tcp",
              "frontendPort": "[parameters('rdpFrontend')]",
              "backendPort": 3389,
              "enableFloatingIP": false
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[variables('virtualNetworkName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('addressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('subnetName')]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefix')]"
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
        "[concat('Microsoft.Network/loadBalancers/',variables('lbName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "subnet": {
                "id": "[variables('subnetRef')]"
              },
              "loadBalancerBackendAddressPools": [
                {
                  "id": "[variables('lbPoolID')]"
                }
              ],
              "loadBalancerInboundNatRules": [
                {
                  "id": "[variables('lbNatID')]"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('windowsOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "osdisk",
            "vhd": {
              "uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          },
          "dataDisks": [
            {
              "name": "datadisk1",
              "diskSizeGB": "[variables('sizeOfDiskInGB')]",
              "lun": 0,
              "vhd": {
                "uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
              },
              "createOption": "Empty"
            }
          ]
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": "true",
            "storageUri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net')]"
          }
        }
      }
    }
  ]
}

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - Azure Virtual Machine 記事訂正

githubのAzure Resource Manager テンプレート https://github.com/Azure/azure-quickstart-templatesは、ご存じだと思います。

自分の勉強もかねて、テンプレートをカスタマイズしてみたので、参考までに公開します。
もっと洗練された方法があればコメントもらえるとありがたいです。

カスタマイズした元ネタは、azure-quickstart-templates / 101-vm-simple-windows /です。githubのAzure Resource Manager テンプレートをカスタマイズしてみた - 仮想ネットワークgithubのAzure Resource Manager テンプレートをカスタマイズしてみた - ストレージアカウントが先にデプロイされている前提です。
※2016/05/17 確認したところ、本記事のJSONファイルでは、仮想ネットワークは都度作成(つまり上書き)されることがわかりましたので、訂正します。
 下記に疑問点として記載した通り、仮想ネットワークのフルセット記述不要です。既存の仮想ネットワークに関連付ける方法は調べたうえで、別途ブログ記事として投稿しようと思います。
 同様にストレージアカウントも関連付けの設定がありそうか否かを確認しようと思います。

こちらの変更点は、diffをとってみました。現在、Insider Preview で提供されているBash上でdiffを使いました!!!
Virtual Machineの名前を指定できるようにし、OSディスクやデータディスク、ネットワークインターフェースに付与しています。
元々のテンプレートがハードコーディングだったので、そこは直したいなーと思いましたので。
4a5,10
>     "vmName": {
>       "type": "string",
>       "metadata": {
>         "description": "name for the Virtual Machine."
>       }
>     },
37c43
<     "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'sawinvm')]",
---
>     "storageAccountName": "armstorageact01",
39c45
<     "dataDisk1VhdName": "datadisk1",
---
>     "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
42,43c48,49
<     "OSDiskName": "osdiskforwindowssimple",
<     "nicName": "myVMNic",
---
>     "OSDiskName": "[concat(variables('vmName'),'-os')]",
>     "nicName": "[concat(variables('vmName'),'-nic1')]",
45c51
<     "subnetName": "Subnet",
---
>     "subnetName": "Subnet1",
51c57
<     "vmName": "SimpleWindowsVM",
---
>     "vmName": "[parameters('vmName')]",
53c59
<     "virtualNetworkName": "MyVNET",
---
>     "virtualNetworkName": "ArmVNet1",
61c67
<       "name": "[object Object]sawinvm",
---
>       "name": "[variables('storageAccountName')]",
83c89
<       "name": "MyVNET",
---
>       "name": "[variables('virtualNetworkName')]",
104c110
<       "name": "myVMNic",
---
>       "name": "[variables('nicName')]",
130c136
<       "name": "SimpleWindowsVM",
---
>       "name": "[variables('vmName')]",

疑問なのは、
  • ストレージアカウントは、フルセットの記述ってやっぱり要る?
  • パブリックIPは、Virtual Machine毎に付与?今回は、ハードコーディングのままにしていますが。
  • 仮想ネットワークは、ネットワークインタフェースにアサインするために、フルセットの記述にしているのは、正しい?
という点です。修行が足りませんね。。。

ということで、カスタマイズしたコードを下記に貼っておきます。
{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "name for the Virtual Machine."
      }
    },
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "dnsLabelPrefix": {
      "type": "string",
      "metadata": {
        "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "2012-R2-Datacenter",
      "allowedValues": [
        "2008-R2-SP1",
        "2012-Datacenter",
        "2012-R2-Datacenter"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
      }
    }
  },
  "variables": {
    "storageAccountName": "armstorageact01",
    "sizeOfDiskInGB": "100",
    "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
    "imagePublisher": "MicrosoftWindowsServer",
    "imageOffer": "WindowsServer",
    "OSDiskName": "[concat(variables('vmName'),'-os')]",
    "nicName": "[concat(variables('vmName'),'-nic1')]",
    "addressPrefix": "10.0.0.0/16",
    "subnetName": "Subnet1",
    "subnetPrefix": "10.0.0.0/24",
    "storageAccountType": "Standard_LRS",
    "publicIPAddressName": "myPublicIP",
    "publicIPAddressType": "Dynamic",
    "vmStorageAccountContainerName": "vhds",
    "vmName": "[parameters('vmName')]",
    "vmSize": "Standard_D1",
    "virtualNetworkName": "ArmVNet1",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
    "apiVersion": "2015-06-15"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "apiVersion": "[variables('apiVersion')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "accountType": "[variables('storageAccountType')]"
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "myPublicIP",
      "location": "[resourceGroup().location]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[parameters('dnsLabelPrefix')]"
        }
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[variables('virtualNetworkName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('addressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('subnetName')]",
            "properties": {
              "addressPrefix": "[variables('subnetPrefix')]"
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
        "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[variables('subnetRef')]"
              }
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('windowsOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "osdisk",
            "vhd": {
              "uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          },
          "dataDisks": [
            {
              "name": "datadisk1",
              "diskSizeGB": "[variables('sizeOfDiskInGB')]",
              "lun": 0,
              "vhd": {
                "uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
              },
              "createOption": "Empty"
            }
          ]
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": "true",
            "storageUri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net')]"
          }
        }
      }
    }
  ]
}

おいおい、ここにパブリックIPアドレス経由でのRDP接続を追記していきたいですね。

2016年5月15日日曜日

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - ストレージアカウント


githubのAzure Resource Manager テンプレート https://github.com/Azure/azure-quickstart-templatesは、ご存じだと思います。

自分の勉強もかねて、テンプレートをカスタマイズしてみたので、参考までに公開します。
もっと洗練された方法があればコメントもらえるとありがたいです。

カスタマイズした元ネタは、azure-quickstart-templates / 101-storage-account-create /です。続いて公開予定のVMテンプレートにてVariablesにコーディングしているので、githubのAzure Resource Manager テンプレートをカスタマイズしてみた - 仮想ネットワークに続き、載せます。
こちらは、

  • "parameters"でストレージアカウント名を指定できるように追記し、"resources"の"name"でパラメーターをセットするように変更

くらいで大したカスタマイズではありません。
カスタマイズしたコードを下記に貼っておきます。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Storage Account type"
      }
    },
    "storageAccountName":{
     "type":"string",
     "defaultValue": "armstorageact01",
      "metadata": {
        "description": "Storage Account Name"
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]",
    "apiVersion": "2015-06-15"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[parameters('storageAccountName')]",
      "apiVersion": "[variables('apiVersion')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "accountType": "[parameters('storageAccountType')]"
      }
    }
  ]
}

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - 仮想ネットワーク

githubのAzure Resource Manager テンプレート https://github.com/Azure/azure-quickstart-templatesは、ご存じだと思います。

自分の勉強もかねて、テンプレートをカスタマイズしてみたので、参考までに公開します。
もっと洗練された方法があればコメントもらえるとありがたいです。

カスタマイズした元ネタは、azure-quickstart-templates / 101-vnet-two-subnets /です。続いて公開予定のVMテンプレートにてVariablesにコーディングしているので、最初に載せておくこととしました。
こちらは、

  • "vnetName"のdefaultvalueを変えたこと
  • 10.0.0.0/24をゲートウェイサブネット用に予約するため、"subnet1Name"と"subnet2Name"のアドレス範囲を変更

くらいで大したカスタマイズではありません。なお、クラスAのvnetAddressPrefixを10.0.0.0/16から、もう少し狭くしようと試みたものの、ここを変えるとうまくAzure Resource Managerにデプロイできなかったりしますので、留意しておくべきでしょうか。
ここに、サブネットやゲートウェイサブネットを追加するテンプレートもgithubのAzure Resource Manager テンプレート https://github.com/Azure/azure-quickstart-templatesをベースにカスタマイズしてみたいと考えています。

というわけで、カスタマイズしたコードを下記に貼っておきます。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vnetName": {
      "type": "string",
      "defaultValue": "ArmVNet1",
      "metadata": {
        "description": "VNet name"
      }
    },
    "vnetAddressPrefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/16",
      "metadata": {
        "description": "Address prefix"
      }
    },
    "subnet1Prefix": {
      "type": "string",
      "defaultValue": "10.0.1.0/24",
      "metadata": {
        "description": "Subnet 1 Prefix"
      }
    },
    "subnet1Name": {
      "type": "string",
      "defaultValue": "Subnet1",
      "metadata": {
        "description": "Subnet 1 Name"
      }
    },
    "subnet2Prefix": {
      "type": "string",
      "defaultValue": "10.0.2.0/24",
      "metadata": {
        "description": "Subnet 2 Prefix"
      }
    },
    "subnet2Name": {
      "type": "string",
      "defaultValue": "Subnet2",
      "metadata": {
        "description": "Subnet 2 Name"
      }
    }
  },
  "variables": {
    "apiVersion": "2015-06-15"
  },
  "resources": [
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/virtualNetworks",
      "name": "[parameters('vnetName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('vnetAddressPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[parameters('subnet1Name')]",
            "properties": {
              "addressPrefix": "[parameters('subnet1Prefix')]"
            }
          },
          {
            "name": "[parameters('subnet2Name')]",
            "properties": {
              "addressPrefix": "[parameters('subnet2Prefix')]"
            }
          }
        ]
      }
    }
  ]
}

2016年5月7日土曜日

Azure VMとオンプレミスのWindows Server 2016 TP5でContainer Hostを作る

Azure VMとオンプレミスのWindows Server 2016 TP5でContainer Hostを作って見ました。
が、Azure VMではなかなか動かず、山市良さんからご助力いただきました、この場をお借りして御礼申し上げます。

まず、
Quick Start – configure a container host
で、PowerShellスクリプトを実行することで、面倒な手順をバイパスできるということを知りました。orz

Azure VMですので、
Scripted - Existing System
に書かれている
wget -uri https://aka.ms/tp5/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1
powershell.exe -NoProfile C:\Install-ContainerHost.ps1
をそれぞれ実行します。
なお、wgetは、PowerShellのエイリアスなので、別途wgetコマンドを導入するは必要はありません(Nano Server除く)。
山市良さんのブログ記事を貼っておきますので参考にしてください。
で、powershell.exe -NoProfile C:\Install-ContainerHost.ps1を実行したのですが、エラーで上手くいきませんでした。


「サービス」からDockerを再起動してみましたが効果無し。



もう一度、powershell.exe -NoProfile C:\Install-ContainerHost.ps1を実行したところ、スクリプトは完了しました。


ですが、docker imagesはエラーで上手くいきませんでした。


山市良さんより下記の手順で再トライをアドバイスいただいたので、実施です。

Install-PackageProvider ContainerImage -Force
Find-ContainerImage
Install-ContainerImage -Name WindowsServerCore
Install-ContainerImage -Name NanoServer
docker images
docker tag "image ID" windowsservercocre:latest
docker tag "image ID" nanoserver:latest


docker imagesを実行したところで、やはりエラー。

ファイルの有無を調べてみましょうということで、見たところ、
C:\ProgramData\docker\tag.txt
が無い!
UNIXならtouchで作るのですが、普通にExplorerで作りました。
それだけではだめで、
net stop docker
net start docker
を実行したところで、ようやく構築がうまく行きました~


しかし、

docker tag "image ID" windowsservercocre:latest
docker tag "image ID" nanoserver:latest

を実行したもののIMAGE IDをテレコにしたため↓

後で実行し直しました。(^^;)
※2016/05/08に画像追加。


ここからは、オンプレミスのWindows Server 2016 TP5でContainer Hostを構築です。
物理ホスト上で構築しても良かったのですが、リトライの可能性を考慮し、Nested Hyper-Vで構築しました。
Windows Server 2016 TP5の英語版を使っていますが、やり方自体はNsted Hyper-Vを試してみたと変わらないので、割愛します。

スクリプトは、Scripted - Existing Systemに書かれている
wget -uri https://aka.ms/tp5/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass C:\Install-ContainerHost.ps1 -HyperV
Install-ContainerHost.ps1 の引数に-Hyper-Vがついています~

と実行自体は、すんなり終わりました。
が、Nano Serverしかイメージがないのですね。。。

Install-PackageProvider ContainerImage -Force
Find-ContainerImage
Install-ContainerImage -Name WindowsServerCore

を再実行してみたものの変化無し。

で、ふと

net stop docker
net start docker

を実行してみたところ、WindowsServerCoreのイメージを認識してくれました。

ということで、
docker tag "image ID" windowsservercocre:latest
を実行して、構築完了です。


PS C:\Windows\system32> docker images
An error occurred trying to connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/images/json: open //./pipe/docker_engine: The system cannot find the file specified.

が出たら、
C:\ProgramData\docker\runDockerDaemon.cmd
C:\ProgramData\docker\tag.txt
c:\windows\system32\dockerd.exe
の有無をチェック。C:\ProgramData\docker\tag.txtが無い場合は、空のファイルを作っておく。その後、

net stop docker
net start docker
を実行してみる。

docker imagesでイメージがそろっていない場合は、

net stop docker
net start docker

を実行してみる。

という点が今回のトラブルで勉強となった点です。

2016年5月3日火曜日

Bash on Ubuntu on Windows Part 3 ~セットアップ時にユーザー名とパスワードを聞かれるようになった~

Insider Preview 14332でBash on Ubuntu on Windowsをセットアップすると、ユーザー名とパスワードを聞かれるようになりました。

ということで、通常利用では特権無しで使えることとなり、よりセキュアというかUNIX/Linuxの一般的な使い方ができます。

このユーザーは、sudoグループに入っているため、特に設定なしでsudoできる状態になっています。


というわけで、apt-getもsudoで一時的に権限昇格して実行できるというわけです!

2016年5月1日日曜日

Windows Server 2016 Technical Preview 5, System Center 2016 Technical Preview 5がリリース

これからいろいろ確認するので、まずはシステム要件を抜き書きしておきます。

  1. Windows Server 2016 Technical Preview 5
  2. System Center 2016 Technical Preview 5
    • 評価版のダウンロード
    • System Requirements for System Center Technical Preview
      この中では、さらに最低HW要件、OS要件等のリンクに分かれています。
      Service Manager、VMMの推奨メモリがけっこく大きくなっていますね。。。
      OMの推奨メモリは、SC2012のOperations Manager Sizing Helperを使って求めて良いようです。
      Windows Server Technical Previewであれば、Server with Desktop Experience、つまりGUIを主に使う想定ですね。
      DPMのみ、SQL Server 2008 R2 SP1からSQL Server 2014です。それ以外は、SQL Server 2012 SP2からSQL Server 2016 RC1を用意すれば良いようです。
  3. What’s new in System Center 2016 Technical Preview 5
    こちらのブログ記事で、新機能と変更点を一覧できます。
  4. What's New in System Center Technical Preview 5
    こちらは、Technetライブラリ。ここのコンポーネント毎の新機能と変更点がリンクされています。