參考文件:
對 server 建立 image 過程中,server 狀態改變後會無法重啟,得用建立好的 Resource template 重新建立,需分外留意!機器就這樣下去領便當了 囧 (Azure/azure-powershell: UN-generalize a VM)
首先,遠端登入機器,執行此道指令
$ sudo waagent -deprovision+user
此命令會嘗試清除系統,使之適合重新佈建。這項作業會執行下列工作:
移除 SSH 主機金鑰 (如果組態檔中的 Provisioning.RegenerateSshHostKeyPair 是 'y')
清除 /etc/resolv.conf 中的名稱伺服器設定
移除 /etc/shadow 中的 root 使用者密碼 (如果組態檔中的 Provisioning.DeleteRootPassword 是 'y')
移除快取的 DHCP 用戶端租用
將主機名稱重設為 localhost.localdomain
刪除最後佈建的使用者帳戶 (取自於 /var/lib/waagent) 和相關聯的資料。
接著,再回到自己的常用的機器,改用 azure cli 對該機器設置以下流程:
$ azure config mode arm
info: Executing command config mode
info: New mode is arm
info: config mode command OK
// Shutdown a virtual machine in a resource group and release the compute resources
$ azure vm deallocate -g MyResource -n MyCurrentVM --subscription MySubscription
info: Executing command vm deallocate
+ Looking up the VM "MyCurrentVM"
+ Deallocating the virtual machine "MyCurrentVM"
info: vm deallocate command OK
// Set the state of a VM in a resource group to Generalized.
$ azure vm generalize MyResource MyCurrentVM --subscription MySubscription
info: Executing command vm generalize
+ Looking up the VM "MyCurrentVM"
+ Generalizing the virtual machine "MyCurrentVM"
info: vm generalize command OK
$ azure vm capture MyResource MyCurrentVM MyImageID -t MyImageID-base.json --subscription MySubscription
info: Executing command vm capture
+ Looking up the VM "MyCurrentVM"
+ Capturing the virtual machine "MyCurrentVM"
info: Saved template to file "MyImageID-base.json"
info: vm capture command OK
接著,可以建立新開機器!只是開機器前又得好好管理"Resouce"建立,由於我已經有常用的 Resource 跟 Location 了,在此只需建立 IP 跟 NIC 即可!
$ azure network public-ip create MyResource MyImageID-ip-1 -l westus --subscription MySubscription
info: Executing command network public-ip create
warn: Using default --idle-timeout 4
warn: Using default --allocation-method Dynamic
warn: Using default --ip-version IPv4
+ Looking up the public ip "MyImageID-ip-1"
+ Creating public ip address "MyImageID-ip-1"
data: Id : /subscriptions/MySubscription/resourceGroups/MyResource/providers/Microsoft.Network/publicIPAddresses/MyImageID-ip-1
data: Name : MyImageID-ip-1
data: Type : Microsoft.Network/publicIPAddresses
data: Location : westus
data: Provisioning state : Succeeded
data: Allocation method : Dynamic
data: IP version : IPv4
data: Idle timeout in minutes : 4
info: network public-ip create command OK
$ azure network nic create MyResource MyImageID-nic-1 -k default -m MyResource -p MyImageID-ip-1 -l westus --subscription MySubscription
info: Executing command network nic create
+ Looking up the network interface "MyImageID-nic-1"
+ Looking up the subnet "default"
+ Looking up the public ip "MyImageID-ip-1"
+ Creating network interface "MyImageID-nic-1"
data: Id : /subscriptions/MySubscription/resourceGroups/MyResource/providers/Microsoft.Network/networkInterfaces/MyImageID-nic-1
data: Name : MyImageID-nic-1
data: Type : Microsoft.Network/networkInterfaces
data: Location : westus
data: Provisioning state : Succeeded
data: Internal domain name suffix : #############.dx.internal.cloudapp.net
data: Enable IP forwarding : false
data: IP configurations:
data: Name : default-ip-config
data: Provisioning state : Succeeded
data: Private IP address : 10.0.0.6
data: Private IP version : IPv4
data: Private IP allocation method : Dynamic
data: Public IP address : /subscriptions/MySubscription/resourceGroups/MyResource/providers/Microsoft.Network/publicIPAddresses/MyImageID-ip-1
data: Subnet : /subscriptions/MySubscription/resourceGroups/MyResource/providers/Microsoft.Network/virtualNetworks/MyResource/subnets/default
data:
info: network nic create command OK
建立機器吧!
$ azure --version
0.10.2 (node: 4.2.4)
$ azure group deployment create MyResource -f MyImageID-base.json --subscription MySubscription
$ azure group deployment create MyResource -f MyImageID-base.json --subscription MySubscription -p '{"vmName":{"value":"MyVM"},"adminUserName":{"value":"ubuntu"},"adminPassword":{"value":"MyPassword"},"networkInterfaceId":{"value":"/subscriptions/MySubscription/resourceGroups/MyResource/providers/Microsoft.Network/networkInterfaces/MyImageID-nic-base"}}'
然而,因為預設產出的 template 定義了以下資訊,以至於開機器必須填寫以下資訊:
$ cat template.json | jq '.parameters'
{
"vmName": {
"type": "string"
},
"vmSize": {
"type": "string",
"defaultValue": "Standard_A1"
},
"adminUserName": {
"type": "string"
},
"adminPassword": {
"type": "securestring"
},
"networkInterfaceId": {
"type": "string"
}
}
用在這邊:
$ cat template.json | jq '.resources[0].properties.osProfile'
{
"computerName": "[parameters('vmName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
}
接著,稍微修改來支援 ssh keypair 登入方式,將 template.json 中的 parameters 多增加個 adminPublicKey/adminPublicKeyPath:
$ cat template.json | jq '.parameters'
{
"vmName": {
"type": "string"
},
"vmSize": {
"type": "string",
"defaultValue": "Standard_A1"
},
"adminUserName": {
"type": "string"
},
"adminPassword": {
"type": "securestring",
"defaultValue": null
},
"networkInterfaceId": {
"type": "string"
},
"adminPublicKey": {
"type": "array"
},
"adminPublicKeyPath": {
"type": "string"
}
}
並修改 properties.osProfile 區:
$ cat template.json | jq '.resources[0].properties.osProfile'
{
"computerName": "[parameters('vmName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"ssh": {
"publicKeys": [
{
"path": "[parameters('adminPublicKeyPath')]",
"keyData": "[parameters('adminPublicKey')]"
}
]
}
}
}
如此一來,就開機能用 keypair 登入機器:
$ azure group deployment create MyResource -f MyImageID-base.json --subscription MySubscription -p '{"adminPassword":{"value":""},"vmName":{"value":"MyVM"},"adminUserName":{"value":"ubuntu"},"adminPublicKey":{"value":"ssh-rsa ########"},"adminPublicKeyPath":{"value":"/home/ubuntu/.ssh/authorized_keys"},"networkInterfaceId":{"value":"/subscriptions/MySubscription/resourceGroups/MyResource/providers/Microsoft.Network/networkInterfaces/MyImageID-nic-base"}}'
沒有留言:
張貼留言