Azure Resource Manager используется для создания и управления ресурсами (например — виртуальными машинами, серверами баз данных и т.д.), которые объеденены в группы ресурсов (Resource Group). Ближайший аналог — CloudFormation от Amazon.
Аналогичный пост, но с использованием панели управления Azure — тут>>>.
Группа ресурсов Azure описывается в JSON-шаблоне.
Содержание
Авторизация
$ azure login info: Executing command login |info: To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code CSCQ5UZM2 to authenticate. /info: Added subscription DEV_TEST info: Added subscription DEV info: Setting subscription "DEV_TEST" as default + info: login command OK
Находим нужную подписку:
$ azure account list info: Executing command account list data: Name Id Current State data: -------------------------------------------------- ------------------------------------ ------- -------- data: Free Trial 97214f99-***-***-715556cd5906 false Enabled data: Pay-As-You-Go fe37db50-***-***-66145cdbd735 false Disabled ... data: DEV_TEST 784f2db5-***-***-560bd3043989 true Enabled data: DEV 3a3db38d-***-***-24d66ae03e38 false Enabled
Переключаемся на неё:
$ azure account set 3a3db38d-***-***-24d66ae03e38 info: Executing command account set info: Setting subscription to "DEV" with id "3a3db38d-***-***-24d66ae03e38". info: Changes saved
У меня уже имеется созданная группа, находим её:
$ azure group list info: Executing command group list + Listing resource groups data: Name Location Provisioning State Tags: data: ------------------ ---------- ------------------ ----- data: Default westeurope Succeeded null data: JWestEuropeDEV westus Succeeded null data: jm-platfrom-dev-1 westeurope Succeeded null
Шаблоны ARM
Начнем с создания просто виртуальной машины с Ubuntu 14.04.2-LTS, готовый шаблон для которой можно найти на Github>>>.
Копируем его:
$ git clone [email protected]:Azure/azure-quickstart-templates.git $ cd azure-quickstart-templates/101-vm-simple-linux
Переключаемся в режим ARM (Azure Resouce Management):
$ azure config mode arm info: Executing command config mode info: New mode is arm
Для новой VM потребуется указать несколько параметров:
adminUsername
— логин пользователя;adminPassword
— пароль;dnsLabelPrefix
— имя машины.
Редактируем файл azuredeploy.parameters.json
, и меняем:
$ cat azuredeploy.parameters.json { "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "adminUsername": { "value": "setevoy" }, "adminPassword": { "value": "p@ssw0rd" }, "dnsLabelPrefix": { "value": "ubuntu123" }, "ubuntuOSVersion": { "value": "14.04.2-LTS" } } }
Эти параметры используются для подстановки в azuredeploy.json
, в котором и описывается всё, что необходимо выполнить для создания группы ресурсов, например:
$ cat azuredeploy.json | grep adminUsername "adminUsername": { "adminUsername": "[parameters('adminUsername')]", "value": "[concat('ssh ', parameters('adminUsername'), '@', parameters('dnsLabelPrefix'), '.', resourceGroup().location, '.cloudapp.azure.com')]"
Структура шаблона выглядит так:
{ "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "", "parameters": { }, "variables": { }, "resources": [ ], "outputs": { } }
$schema
: JSON-схема, которая будет использоваться. Обязательный элемент, менять не стоит.contentVersion
: Версия шаблона. Можно использовать любое удобное значение. Обязательный элемент.parameters
: Параметры, которые будут использоваться во время деплоя.variables
: Переменные для подстановки в шаблон.resources
: Ресурсы, которые будут задеплоены или обновлены в группе;outputs
: Данные, которые будут отображены после деплоя.
На удивление — у Azure имеется достаточно толковая документация (не может быть!) по созданию и формату шаблонов. Больше информации — тут>>>.
Деплой группы ресурсов
Запускаем деплой:
$ azure group deployment create -f azuredeploy.json -e azuredeploy.parameters.json jm-platfrom-dev-1 UbuntuDeploy1 info: Executing command group deployment create + Initializing template configurations and parameters + Creating a deployment error: Long running operation failed with error: 'At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-debug for usage details.'. info: Error information has been recorded to /home/setevoy/.azure/azure.err
Проверяем лог:
$ cat /home/setevoy/.azure/azure.err | grep Fail { body: '{"status":"Failed","error":{"code":"DeploymentFailed","message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-debug for usage details.","details":[{"code":"BadRequest","message":"{\\r\\n \\"error\\": {\\r\\n \\"code\\": \\"InvalidParameter\\",\\r\\n \\"target\\": \\"adminPassword\\",\\r\\n \\"message\\": \\"The supplied password must be between 6-72 characters long and must satisfy at least 3 of password complexity requirements from the following: \\\\r\\\\n1) Contains an uppercase character\\\\r\\\\n2) Contains a lowercase character\\\\r\\\\n3) Contains a numeric digit\\\\r\\\\n4) Contains a special character.\\"\\r\\n }\\r\\n}"}]}}', code: 'DeploymentFailed', { status: 'Failed', { code: 'DeploymentFailed',The supplied password must be between 6-72 characters long and
The supplied password must be between 6-72 characters long
Обновляем параметр adminPassword
в azuredeploy.parameters.json
, и запускаем повторно:
$ azure group deployment create -f azuredeploy.json -e azuredeploy.parameters.json jm-platfrom-dev-1 Ubu info: Executing command group deployment create + Initializing template configurations and parameters + Creating a deployment info: Created template deployment "UbuntuDeploy1" + Waiting for deployment to complete data: DeploymentName : UbuntuDeploy1 data: ResourceGroupName : jm-platfrom-dev-1 data: ProvisioningState : Succeeded data: Timestamp : data: Mode : Incremental data: CorrelationId : d78a2dbc-***-***-4ca62762a14c data: DeploymentParameters : data: Name Type Value data: --------------- ------------ ----------- data: adminUsername String setevoy data: adminPassword SecureString undefined data: dnsLabelPrefix String ubuntu123 data: ubuntuOSVersion String 14.04.2-LTS data: Outputs : data: Name Type Value data: ---------- ------ --------------------------------------------------- data: hostname String ubuntu123.westeurope.cloudapp.azure.com data: sshCommand String ssh [email protected]
Опции тут:
-e
: файл параметров, в нашем случае —azuredeploy.parameters.json
;-f
: файл самого шаблона.
Проверить статус деплоя:
$ azure group deployment show jm-platfrom-dev-1 UbuntuDeploy1 info: Executing command group deployment show + Getting deployments data: DeploymentName : UbuntuDeploy1 data: ResourceGroupName : jm-platfrom-dev-1 data: ProvisioningState : Succeeded data: Timestamp : data: Mode : Incremental data: CorrelationId : d78a2dbc-***-***-4ca62762a14c data: DeploymentParameters : data: Name Type Value data: --------------- ------------ ----------- data: adminUsername String setevoy data: adminPassword SecureString undefined data: dnsLabelPrefix String ubuntu123 data: ubuntuOSVersion String 14.04.2-LTS data: Outputs : data: Name Type Value data: ---------- ------ --------------------------------------------------- data: hostname String ubuntu123.westeurope.cloudapp.azure.com data: sshCommand String ssh [email protected]
И проверяем саму группу после деплоя:
$ azure group show jm-platfrom-dev-1 info: Executing command group show + Listing resource groups + Listing resources for the group data: Id: /subscriptions/3a3db38d-***-***-24d66ae03e38/resourceGroups/jm-platfrom-dev-1 data: Name: jm-platfrom-dev-1 data: Location: westeurope data: Provisioning State: Succeeded data: Tags: null data: Resources: data: data: Id : /subscriptions/3a3db38d-***-***-24d66ae03e38/resourceGroups/jm-platfrom-dev-1/providers/Microsoft.Compute/virtualMachines/MyUbuntuVM data: Name : MyUbuntuVM data: Type : virtualMachines data: Location: westeurope data: Tags : data: data: Id : /subscriptions/3a3db38d-***-***-24d66ae03e38/resourceGroups/jm-platfrom-dev-1/providers/Microsoft.Network/networkInterfaces/myVMNic data: Name : myVMNic data: Type : networkInterfaces data: Location: westeurope data: Tags : data: data: Id : /subscriptions/3a3db38d-***-***-24d66ae03e38/resourceGroups/jm-platfrom-dev-1/providers/Microsoft.Network/publicIPAddresses/myPublicIP data: Name : myPublicIP data: Type : publicIPAddresses data: Location: westeurope data: Tags : data: data: Id : /subscriptions/3a3db38d-***-***-24d66ae03e38/resourceGroups/jm-platfrom-dev-1/providers/Microsoft.Network/virtualNetworks/MyVNET data: Name : MyVNET data: Type : virtualNetworks data: Location: westeurope data: Tags : data: data: Id : /subscriptions/3a3db38d-***-***-24d66ae03e38/resourceGroups/jm-platfrom-dev-1/providers/Microsoft.Storage/storageAccounts/7qwybwaqeho22salinuxvm data: Name : 7qwybwaqeho22salinuxvm data: Type : storageAccounts data: Location: westeurope data: Tags : data: data: Permissions: data: Actions: * data: NotActions: Microsoft.Authorization/*/Delete,Microsoft.Authorization/*/Write data:
Другой вариант использования шаблона — указать URL к нему, а не путь к локальному файлу:
$ azure group deployment create --template-uri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-vm-simple-linux/azuredeploy.json -e azuredeploy.parameters.json jm-platfrom-dev-1 UbuntuDeploy2
Если не указать файл с параметрами — CLI предложит их указать во время создания.
Просмотр логов
Для просмотра логов деплоя группы — используйте azure group log show
:
$ azure group log show jm-platfrom-dev-1 --all | head -n 50 info: Executing command group log show info: Getting group logs data: ---------- data: EventId: 52218503-cdbe-4bae-81d5-5fe11c160d23 data: Authorization: data: action: Microsoft.Resources/deployments/write data: role: data: scope: /subscriptions/3a3db38d-***-***- 24d66ae03e38/resourcegroups/jm-platfrom- dev-1/providers/Microsoft.Resources/ deployments/UbuntuDeploy2 data: ResourceUri: /subscriptions/3a3db38d-***-***- 24d66ae03e38/resourcegroups/jm-platfrom-dev-1/ providers/Microsoft.Resources/deployments/ UbuntuDeploy2 data: SubscriptionId: 3a3db38d-***-***-24d66ae03e38 data: EventTimestamp (UTC): Thu Jul 14 2016 17:28:11 GMT+0300 (EEST) data: OperationName: Microsoft.Resources/deployments/write data: OperationId: ffbd5a69-948a-4dd4-afe7-c84096d887b6 data: Status: Succeeded data: SubStatus: data: Caller: [email protected] ...
Вместо --all
можно указать --last-deployment
или -deployment <ИМЯ_ДЕПЛОЯ>
.
Экспорт шаблона группы
Azure предоставляет возможность экспортировать два типа шаблонов — текущий шаблон всей группы, и/или шаблон конкретного деплоя.
Шаблон всей группы включает в себя представление текущего состояния группы ресурсов, но соддержит минимально количество параметров и не содержит переменных — большая часть значений содержится прямо в элементах шаблона. Перед тем, как использовать его для деплоя — лучше обновить его, и вынести часть данных в параметры.
Что бы экспортировать шаблон группы — используйте azure group export
:
# azure group export jm-platfrom-dev-1 /azurearm/templates/ info: Executing command group export + Exporting resource group as template jm-platfrom-dev-1 warn: ExportTemplateCompletedWithErrors : Export template operation completed with errors. Some resources were not exported. Please see details for more information. warn: ExportTemplateProviderError : Could not get resources of the type 'Microsoft.Compute/virtualMachines/extensions'. Resources of this type will not be exported. info: Template downloaded to /azurearm/templates/jm-platfrom-dev-1.json
Проверяем:
# head -n 30 /azurearm/templates/jm-platfrom-dev-1.json { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "virtualMachines_MyUbuntuVM_adminPassword": { "type": "SecureString" }, "virtualMachines_MyUbuntuVM_name": { "defaultValue": null, "type": "String" }, "networkInterfaces_myVMNic_name": { "defaultValue": null, "type": "String" }, "publicIPAddresses_myPublicIP_name": { "defaultValue": null, "type": "String" }, "virtualNetworks_MyVNET_name": { "defaultValue": null, "type": "String" }, "storageAccounts_7qwybwaqeho22salinuxvm_name": { "defaultValue": null, "type": "String" } }, "variables": {}, "resources": [ ...
Шаблон конкретного деплоя можно загрузить с помощью azure group deployment template download.
Он будет включать в себя параметры и переменные, которые были определены во время деплоя.
Для получения шаблона деплоя — укажите имя группы ресурсов, и имя деплоя. Выше было использовано имя «UbuntuDeploy1» — используем его:
# azure group deployment template download jm-platfrom-dev-1 UbuntuDeploy1 /azurearm/templates/ info: Executing command group deployment template download + Getting resource group deployment template UbuntuDeploy1 info: Deployment template downloaded to /azurearm/templates/UbuntuDeploy1.json
Проверяем:
# head -n 30 /azurearm/templates/UbuntuDeploy1.json { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "adminUsername": { "type": "String", "metadata": { "description": "User name 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." } }, "ubuntuOSVersion": { "defaultValue": "14.04.2-LTS", "allowedValues": [ "12.04.5-LTS", "14.04.2-LTS", "15.10" ], "type": "String", ...
В целом — это всё, что требуется для того, что бы начать работу с Azure Resource Manager.