Расширения и функции виртуальных машин для Linux

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

Расширения виртуальных машин Azure можно запускать с помощью Azure CLI, Azure PowerShell, шаблонов Azure Resource Manager (шаблонов ARM) и портала Azure. Расширения можно упаковать с помощью нового развертывания виртуальной машины или запустить их в любой существующей системе.

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

Примечание.

Попробуйте использовать виртуальную машину для ускорения диагностики. Рекомендуется запустить Ассистент виртуальных машин для Windows или Ассистент виртуальных машин для Linux. Эти средства диагностики на основе скриптов помогают выявить распространенные проблемы, влияющие на гостевой агент виртуальной машины Azure и общую работоспособность виртуальных машин.

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

Варианты использования и примеры

У каждого расширения виртуальной машины Azure есть конкретный вариант использования. Вот некоторые примеры.

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

Предпосылки

Примечание.

Расширения поддерживаются только в утвержденных дистрибутивах Linux в Azure.

Агент Azure Linux

Для обработки расширения на виртуальной машине необходимо установить агент Linux Azure . Некоторые отдельные расширения имеют необходимые условия, например доступ к ресурсам или зависимостям.

Агент Azure Linux управляет взаимодействием между виртуальной машиной Azure и контроллером структуры Azure. Агент отвечает за множество функциональных аспектов развертывания виртуальных машин Azure и управления ими, включая запуск расширений виртуальных машин.

Агент Linux Azure предварительно установлен на образах Azure Marketplace. Его также можно установить вручную в поддерживаемых операционных системах.

Агент работает на нескольких операционных системах. Однако платформа расширений имеет ограничение для операционных систем, которые используют расширения. Некоторые расширения не поддерживаются во всех операционных системах и могут выдавать код ошибки 51 ("Неподдерживаемая ОС"). Проверьте отдельную документацию по расширению для проверки поддержки.

Доступ к сети

Пакеты расширений скачиваются из репозитория расширений службы хранилища Azure. Статус расширения загружается в Azure Storage.

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

Это важно

Если вы блокируете доступ к частному IP-адресу 168.63.129.16 с помощью гостевого брандмауэра, расширения перестают работать, даже если вы используете поддерживаемую версию агента или настраиваете исходящий доступ. Кроме того, если у виртуальной машины нет исходящего доступа к *.blob.windows.net и *.blob.storage.azure.net, то инициализация агента Linux Azure и установка расширений вызывает больше задержек. Чтобы избежать этих задержек, убедитесь, что доступ к этим конечным точкам разрешен.

Вы можете использовать агентов только для скачивания пакетов расширений и состояния отчетности. Например, если установка расширения должна скачать скрипт из GitHub (расширение пользовательского скрипта) или требуется доступ к службе хранилища Azure (Azure Backup), необходимо открыть дополнительные порты брандмауэра или группы безопасности сети (NSG). Разные расширения имеют разные требования, так как они приложения. Для расширений, требующих доступа к службе хранилища Azure, можно разрешить доступ с помощью тегов службы NSG Azure.

Для перенаправления запросов на трафик агента Azure Linux поддерживает прокси-сервер. Поддержка этого прокси-сервера не поддерживает расширения. Необходимо настроить каждое отдельное расширение для работы с прокси-сервером.

Обнаружение расширений виртуальных машин

Многие расширения виртуальных машин доступны для использования с виртуальными машинами Azure. Чтобы просмотреть полный список, используйте az vm extension image list. В следующем примере перечислены все доступные расширения в расположении westus :

az vm extension image list --location westus --output table

Запуск расширений виртуальной машины

Расширения виртуальных машин Azure выполняются на существующих виртуальных машинах. Эта возможность полезна, если необходимо внести изменения конфигурации или восстановить подключение на уже развернутой виртуальной машине. Расширения виртуальных машин также можно объединить с развертываниями шаблонов ARM. С помощью расширений с шаблонами ARM можно развертывать и настраивать виртуальные машины Azure без вмешательства после развертывания.

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

Azure CLI (интерфейс командной строки Azure)

Расширения виртуальных машин Azure можно запускать для существующей виртуальной машины с помощью команды az vm extension set . В следующем примере выполняется расширение пользовательского скрипта для виртуальной машины с именем myVM в группе ресурсов с именем myResourceGroup. Замените пример имени группы ресурсов, имени виртуальной машины и скрипта для выполнения https:\//raw.githubusercontent.com/me/project/hello.sh собственными сведениями.

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

При правильном выполнении расширения выходные данные аналогичны следующему примеру:

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

Расширения виртуальных машин Azure можно запустить для существующей виртуальной машины с помощью команды Set-AzVMExtension . В следующем примере выполняется расширение пользовательского скрипта для виртуальной машины с именем myVM в группе ресурсов с именем myResourceGroup. Замените пример имени группы ресурсов, имени виртуальной машины и скрипта для выполнения https:\//raw.githubusercontent.com/me/project/hello.sh собственными сведениями.

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

При правильном выполнении расширения выходные данные аналогичны следующему примеру:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

Портал Azure

Расширения виртуальных машин можно применить к существующей виртуальной машине с помощью портала Azure. Выберите виртуальную машину на портале, выберите "Расширения" и нажмите кнопку "Добавить". Выберите расширение, которое требуется в списке доступных расширений, и следуйте инструкциям мастера.

На следующем рисунке показана установка расширения пользовательского скрипта для Linux на портале Azure.

Снимок экрана: диалоговое окно установки расширения пользовательского скрипта для Linux.

Шаблоны диспетчера ресурсов Azure

Вы можете добавить расширения виртуальных машин в шаблон ARM и запустить их с развертыванием шаблона. При развертывании расширения с помощью шаблона можно создать полностью настроенные развертывания Azure.

Например, следующий КОД JSON взят из полного шаблона ARM , который развертывает набор виртуальных машин с балансировкой нагрузки и базу данных SQL Azure. Затем он устанавливает приложение .NET Core на каждой виртуальной машине. Расширение виртуальной машины отвечает за установку программного обеспечения.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

Дополнительные сведения о создании шаблонов ARM см. в статье "Виртуальные машины" в шаблоне Azure Resource Manager.

Помогите обеспечить безопасность данных расширения виртуальной машины

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

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

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Перемещение свойства commandToExecute в protected конфигурацию помогает защитить строку выполнения, как показано в следующем примере:

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Обновление агентов и расширений

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

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

  • Диски данных
  • Расширения
  • Теги расширений
  • Контейнер для диагностики загрузки
  • Секреты гостевой операционной системы
  • Размер виртуальной машины
  • сетевой профиль.

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

Примечание.

Для некоторых обновлений могут потребоваться дополнительные правила брандмауэра. Дополнительные сведения см. в разделе "Доступ к сети".

Обновления агента

Агент виртуальной машины Linux содержит код агента подготовки и код обработки расширений в одном пакете. Они не могут быть разделены.

Можно отключить агент настройки, если хотите выполнить подготовку на Azure с помощью cloud-init.

Поддерживаемые версии агентов могут использовать автоматические обновления. Единственный код, который можно обновить, — это код обработки расширений, а не код агента подготовки. Код Provisioning Agent является одноразовым.

Код обработки расширений отвечает за:

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

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

Родительский процесс не может быть автоматически обновлен. Только пакет распространения может обновить родительский объект.

Чтобы узнать, какая версия используется, проверьте waagent:

waagent --version

Результат аналогичен следующему примеру:

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

В примере результата выше, родитель (или развернутая версия пакета) имеет значение WALinuxAgent-2.2.45. Значением Goal state agent является версия автоматического обновления.

Настоятельно рекомендуется всегда включить автоматическое обновление агента: AutoUpdate.Enabled=y. Если вы не включите автоматическое обновление, вам нужно будет постоянно вручную обновлять агент. Вы также не получаете исправления ошибок и безопасности.

Обновления расширений

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

Автоматические обновления расширений являются дополнительными или исправлением. При настройке расширения вы можете принять или отклонить незначительные обновления. В следующем примере показано, как автоматически обновлять минорные версии в шаблоне ARM с помощью "autoUpgradeMinorVersion": true,:

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

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

Если отключить автоматическое обновление или обновить основную версию, используйте az vm extension set или Set-AzVMExtension и укажите целевую версию.

Проверка версии расширения

Примечание.

Модель и представление экземпляра

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

Проверка одной виртуальной машины

Azure CLI

az vm get-instance-view -g <rg> -n <vm> \
  --query "extensions[].{name:name,type:type,version:typeHandlerVersion,status:statuses[0].displayStatus}" \
  -o table

Считывает инстанс-вью виртуальной машины, отображая фактически установленную версию обработчика и его состояние.

Проверка масштабируемых наборов (единый или гибкий)

Azure CLI

# Scale set summary (health)
az vmss get-instance-view -g <rg> -n <vmss>

# Per-instance extension versions
az vmss list-instances -g <rg> -n <vmss> --expand instanceView \
  --query "[].{instanceId:instanceId, extVers:instanceView.extensions[].typeHandlerVersion}"

# Specific instance
az vmss vm get-instance-view -g <rg> -n <vmss> --instance-id <id>

Используйте представление экземпляров на уровне масштабируемого набора или экземпляра, чтобы проверить фактические версии обработчика.

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

Определение обновлений расширений

Определить, установлено ли расширение с параметром autoUpgradeMinorVersion на виртуальной машине

Вы можете увидеть по модели виртуальной машины, было ли расширение подготовлено с autoUpgradeMinorVersion. Чтобы проверить, используйте az vm show и укажите имя группы ресурсов и виртуальной машины:

az vm show --resource-group myResourceGroup --name myVM

В следующем примере выходных данных показано, что autoUpgradeMinorVersion задано значение true:

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

Определите, когда произошло событие autoUpgradeMinorVersion

Чтобы узнать, когда произошло обновление расширения, просмотрите журналы агента на виртуальной машине по адресу /var/log/waagent.log.

В следующем примере виртуальная машина имела установленный Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025. Исправление (хотфикс) доступно Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027.

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

Разрешения агента

Для выполнения задач агенту необходимо запускаться с правами root.

Устранение неполадок расширений виртуальных машин

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

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

  • Проверьте журнал агента Linux Azure. Просмотрите активность, когда расширение подготавливалось в /var/log/waagent.log.
  • Дополнительные сведения см. в журналах расширений в файле /var/log/azure/<extensionName>.
  • Ознакомьтесь с разделами по устранению неполадок в документации по расширению для кодов ошибок, известных проблем и других сведений о расширении.
  • Просмотрите системные журналы. Проверьте, не вмешиваются ли другие операции в расширение, например длительный запуск другого приложения, требующего монопольного доступа к диспетчеру пакетов.

Распространенные причины сбоев расширения

  • На выполнение расширений отведено 20 минут. (Исключения — это настраиваемый скрипт и Chef, которые имеют 90 минут.) Если развертывание превышает это время, оно помечается как тайм-аут. Причиной времени ожидания может быть следующее:

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

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

Просмотр состояния расширения

После запуска расширения виртуальной машины используйте az vm get-instance-view, чтобы получить статус расширения.

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

Результат аналогичен следующему примеру:

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

Вы также можете найти состояние выполнения расширения на портале Azure. Выберите виртуальную машину, выберите расширения и выберите нужное расширение.

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

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

Чтобы удалить расширение, используйте az vm extension delete:

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

Вы также можете удалить расширение на портале Azure:

  1. Выберите виртуальную машину.
  2. Выберите Расширения.
  3. Выберите расширение.
  4. Выберите Удалить.

Общая справка по расширениям ВМ

Имя расширения Описание
Расширение пользовательского скрипта для Linux Выполнение скриптов на виртуальной машине Azure.
Расширение VMAccess Восстановление доступа к виртуальной машине Azure. Вы также можете использовать его для управления пользователями и учетными данными.