Azure: Resource manager, Azure CLI и деплой resource group

Автор: | 07/19/2016
 

azure_logoAzure 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 git@github.com: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 setevoy@ubuntu123.westeurope.cloudapp.azure.com

Опции тут:

  • -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 setevoy@ubuntu123.westeurope.cloudapp.azure.com

И проверяем саму группу после деплоя:

$ 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:               user@domain.tld
...

Вместо --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.