Руководство по Управление виртуальными машинами Linux с помощью Azure CLI

При развертывании ресурсов в Azure обеспечивается невероятная гибкость в выборе типов развертываемых ресурсов, а также их расположения и настройки. Однако эта гибкость может открыть больше возможностей, чем требуется в организации. Планируя развертывание ресурсов в Azure, вы можете задавать себе следующие вопросы:

  • "Как соблюсти местные нормативные требования к независимости данных в некоторых странах/регионах?"
  • "Как контролировать затраты?"
  • "Как гарантировать, что никто случайно не изменит критически важную систему?"
  • "Как точно отслеживать затраты на ресурсы и выставление счетов?"

Эти вопросы рассматриваются в данной статье. В частности:

  • Назначение пользователей ролям и назначение ролей области, чтобы пользователи имели разрешение на выполнение ожидаемых действий, но не более того.
  • Применение политик, определяющих соглашения о ресурсах в вашей подписке.
  • Блокировка ресурсов, которые являются критическими для вашей системы.
  • Добавление тегов для ресурсов, чтобы отслеживать их по значениям, понятным в вашей организации.

В этой статье описываются задачи, которые следует выполнить для реализации управления. Более подробное обсуждение понятий представлено в разделе Система управления в Azure.

Предварительные требования

  • Используйте среду Bash в Azure Cloud Shell.

    Запуск Cloud Shell в новом окне

  • При необходимости установите Azure CLI, чтобы выполнять справочные команды CLI.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о дополнительных возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Если появится запрос, установите расширения Azure CLI при первом использовании. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Для работы с этим учебником требуется Azure CLI версии 2.0.30 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

Общие сведения об области

Прежде чем создавать элементы, давайте узнаем, что такое область. В Azure предоставляется четыре уровня управления: группы управления, подписки, группы ресурсов и ресурсы. Группы управления доступны в режиме предварительной версии. Пример этих уровней приведен на следующем изображении.

Область

Параметры управления можно применить на любом из этих уровней области. Выбранный уровень определяет, насколько широка область применения параметра. На более низких уровнях наследуются параметры более высоких уровней. Если параметр применяется к подписке, он применяется ко всем группам ресурсов и ресурсам в подписке. Если же параметр применяется к группе ресурсов, то он применяется ко всем ресурсам в ней. Но в другой группе ресурсов этого параметра не будет.

Как правило, целесообразно применять важные параметры на более высоких уровнях, а требования для конкретного проекта — на более низких уровнях. Например, вам нужно, чтобы все ресурсы для вашей организации развертывались в определенных регионах. Чтобы выполнить это требование, примените политику к подписке, которая определяет разрешенные расположения. Когда другие пользователи в вашей организации будут добавлять новые ресурсы и группы ресурсов, разрешенные расположения будут применяться автоматически.

В этом руководстве к группе ресурсов применяются все параметры управления, поэтому вы сможете легко отменить их по завершении работы.

Создайте группу ресурсов.

az group create --name myResourceGroup --location "East US"

Сейчас группа ресурсов пуста.

Управление доступом на основе ролей в Azure

Вам нужно, чтобы у пользователей вашей организации был необходимый уровень доступа к этим ресурсам. Вы не хотите предоставлять пользователям неограниченный доступ, но при этом требуется обеспечить им возможность работать. Управление доступом Azure на основе ролей (Azure RBAC) позволяет предоставлять пользователям разрешения на выполнение определенных действий в той или иной области.

Для создания и удаления назначений ролей пользователи должны иметь доступ Microsoft.Authorization/roleAssignments/*. Такой доступ предоставляется с помощью ролей владельца или администратора доступа пользователей.

Для управления решениями виртуальной машины существует три роли для конкретных ресурсов, предоставляющие необходимый тип доступа:

Чтобы не назначать роли для отдельных пользователей, зачастую бывает проще создать группу Azure Active Directory для пользователей, которым нужно выполнять подобные действия. А затем назначить этой группе соответствующую роль. В этой статье описано, как использовать существующую группу, чтобы управлять виртуальной машиной, или портал, чтобы создать группу Azure Active Directory.

Создав новую группу или найдя существующую, воспользуйтесь командой az role assignment create, чтобы назначить группе Azure Active Directory роль участника виртуальных машин для группы ресурсов.

adgroupId=$(az ad group show --group <your-group-name> --query objectId --output tsv)

az role assignment create --assignee-object-id $adgroupId --role "Virtual Machine Contributor" --resource-group myResourceGroup

Если появляется сообщение об ошибке с сообщением о том, что guid> участника <не существует в каталоге, новая группа не распространилась в Azure Active Directory. Попробуйте выполнить команду снова.

Как правило, нужно повторить эту процедуру для участника сети и участника учетной записи хранения, чтобы назначить пользователей для управления развернутыми ресурсами. В текущей статье эти действия можно пропустить.

Политика Azure

Служба Политика Azure позволяет следить за тем, чтобы все ресурсы в подписке соответствовали корпоративным стандартам. Ваша подписка уже имеет несколько определений политики. Чтобы просмотреть доступные определения политик, воспользуйтесь командой az policy definition list:

az policy definition list --query "[].[displayName, policyType, name]" --output table

Отобразится список имеющихся определений политики. Политика может относиться к типу Встроенная или Настраиваемая. Просмотрите определения, которые описывают необходимое вам условие. В этой статье вы назначаете политики, которые:

  • ограничивают расположения для всех ресурсов;
  • ограничивают номера SKU для виртуальных машин;
  • выполняют аудит виртуальных машин, не использующих управляемые диски.

В следующем примере вы получите три определения политик на основе отображаемого имени. Назначьте эти определения группе ресурсов с помощью команды az policy assignment create. Для некоторых политик нужно указать допустимые значения, задав значения параметров.

# Get policy definitions for allowed locations, allowed SKUs, and auditing VMs that don't use managed disks
locationDefinition=$(az policy definition list --query "[?displayName=='Allowed locations'].name | [0]" --output tsv)
skuDefinition=$(az policy definition list --query "[?displayName=='Allowed virtual machine SKUs'].name | [0]" --output tsv)
auditDefinition=$(az policy definition list --query "[?displayName=='Audit VMs that do not use managed disks'].name | [0]" --output tsv)

# Assign policy for allowed locations
az policy assignment create --name "Set permitted locations" \
  --resource-group myResourceGroup \
  --policy $locationDefinition \
  --params '{ 
      "listOfAllowedLocations": {
        "value": [
          "eastus", 
          "eastus2"
        ]
      }
    }'

# Assign policy for allowed SKUs
az policy assignment create --name "Set permitted VM SKUs" \
  --resource-group myResourceGroup \
  --policy $skuDefinition \
  --params '{ 
      "listOfAllowedSKUs": {
        "value": [
          "Standard_DS1_v2", 
          "Standard_E2s_v2"
        ]
      }
    }'

# Assign policy for auditing unmanaged disks
az policy assignment create --name "Audit unmanaged disks" \
  --resource-group myResourceGroup \
  --policy $auditDefinition

В предыдущем примере предполагается, что вам уже известны параметры политики. Если требуется просмотреть параметры, выполните следующую команду.

az policy definition show --name $locationDefinition --query parameters

Развертывание виртуальной машины

Роли и политики назначены — теперь все готово для развертывания вашего решения. Размер по умолчанию — Standard_DS1_v2. Он соответствует одному из ваших разрешенных номеров SKU. С помощью этой команды создаются ключи SSH, если они еще не существуют в расположении по умолчанию.

az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS --generate-ssh-keys

После завершения развертывания к решению можно применить дополнительные параметры управления.

Блокировка ресурсов

Блокировки ресурсов не позволяют пользователям в организации случайно удалить или изменить критически важные ресурсы. В отличие от управления доступом на основе ролей, блокировки ресурсов применяют ограничение для всех пользователей и ролей. Можно установить уровень блокировки CanNotDelete или ReadOnly.

Для создания или удаления блокировок управления необходим доступ к действиям Microsoft.Authorization/locks/*. Из встроенных ролей эти действия предоставляются только владельцу и администратору доступа пользователей.

Чтобы заблокировать виртуальную машину и группу безопасности сети, выполните команду az lock create.

# Add CanNotDelete lock to the VM
az lock create --name LockVM \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVM \
  --resource-type Microsoft.Compute/virtualMachines

# Add CanNotDelete lock to the network security group
az lock create --name LockNSG \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVMNSG \
  --resource-type Microsoft.Network/networkSecurityGroups

Чтобы протестировать блокировки, попробуйте выполнить следующую команду:

az group delete --name myResourceGroup

Появится ошибка с сообщением о том, что операцию удаления не удалось выполнить из-за блокировки. Группу ресурсов можно удалить, только если намеренно снять блокировки. Этот шаг описан в разделе Очистка ресурсов.

Добавление тегов к ресурсам

К ресурсам Azure можно применять теги, чтобы логически упорядочивать их по категориям. Каждый тег состоит из имени и значения. Например, имя Environment и значение Production можно применить ко всем ресурсам в рабочей среде.

Чтобы добавить два тега в группу ресурсов, используйте команду az group create:

az group update -n myResourceGroup --set tags.Environment=Test tags.Dept=IT

Предположим, вы хотите добавить третий тег. Выполните команду еще раз с новым тегом. Он будет добавлен к уже существующим.

az group update -n myResourceGroup --set tags.Project=Documentation

Ресурсы не наследуют теги от группы ресурсов. Сейчас в группе ресурсов три тега, но у ресурсов нет ни одного. Чтобы добавить все теги из группы ресурсов к ресурсам из этой группы и сохранить существующие теги ресурсов, используйте следующий скрипт:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Get the tags for this resource
  jsonrtag=$(az resource show --id $resid --query tags)
  
  # Reformat from JSON to space-delimited and equals sign
  rt=$(echo $jsonrtag | tr -d '"{},' | sed 's/: /=/g')
  
  # Reapply the updated tags to this resource
  az resource tag --tags $t$rt --id $resid
done

Также можно применить теги группы ресурсов к ресурсам без сохранения существующих тегов:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Apply tags from resource group to this resource
  az resource tag --tags $t --id $resid
done

Для объединения нескольких значений в один тег используйте строку JSON.

az group update -n myResourceGroup --set tags.CostCenter='{"Dept":"IT","Environment":"Test"}'

Чтобы удалить все теги в группе ресурсов, используйте следующую команду:

az group update -n myResourceGroup --remove tags

Чтобы применить теги к виртуальной машине, выполните команду az resource tag. Существующие теги для ресурса не сохраняются.

az resource tag -n myVM \
  -g myResourceGroup \
  --tags Dept=IT Environment=Test Project=Documentation \
  --resource-type "Microsoft.Compute/virtualMachines"

Поиск ресурсов по тегу

Чтобы найти ресурсы по имени и значению тега, выполните команду az resource list:

az resource list --tag Environment=Test --query [].name

Возвращаемые значения можно использовать для выполнения задач управления, например, остановки всех виртуальных машин с определенным значением тега.

az vm stop --ids $(az resource list --tag Environment=Test --query "[?type=='Microsoft.Compute/virtualMachines'].id" --output tsv)

Просмотр данных о затратах по значениям тега

После применения тегов к ресурсам можно просмотреть затраты на ресурсы с этими тегами. Однако сведения о последнем использовании отобразятся в анализе затрат только через некоторое время. Если сведения о затратах на ресурсы доступны, их можно просмотреть в группах ресурсов в подписке. Чтобы пользователи увидели сведения о затратах, им необходимы права доступа на уровне подписки к сведениям о выставлении счетов.

Чтобы просмотреть сведения о затратах по тегам на портале, выберите подписку и щелкните Анализ затрат.

Анализ затрат

Затем отфильтруйте результаты по значению тега и нажмите кнопку Применить.

Просмотр данных о затратах по тегу

Изучите также статью Общие сведения об API потребления ресурсов Azure, чтобы узнать о том, как получить сведения о затратах с помощью программных средств.

Очистка ресурсов

Удалить заблокированные группы безопасности сети невозможно до тех пор, пока не будет снята блокировка. Чтобы снять блокировку, получите идентификаторы блокировок и укажите их при выполнении команды az lock delete.

vmlock=$(az lock show --name LockVM \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Compute/virtualMachines \
  --resource-name myVM --output tsv --query id)
nsglock=$(az lock show --name LockNSG \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Network/networkSecurityGroups \
  --resource-name myVMNSG --output tsv --query id)
az lock delete --ids $vmlock $nsglock

Вы можете удалить ставшие ненужными группу ресурсов, виртуальную машину и все связанные с ней ресурсы, выполнив команду az group delete. Завершите сеанс SSH для виртуальной машины, а затем удалите ресурсы, как показано ниже:

az group delete --name myResourceGroup

Дальнейшие действия

В рамках этого руководства вы создали пользовательский образ виртуальной машины. Вы ознакомились с выполнением следующих задач:

  • назначение пользователей для роли;
  • применение политик, принудительно внедряющих стандарты;
  • защита важных ресурсов с помощью блокировок;
  • добавление к ресурсам тегов для выставления счетов и управления.

Перейдите к следующему руководству, чтобы узнать, как выявлять изменения и управлять обновлениями пакетов на виртуальной машине.