Поделиться через


Как настроить и выполнить задачи запуска для Облачной службы Azure (классическая)

Внимание

Облачные службы (классическая версия) объявлены устаревшими для новых клиентов. Их поддержка будет полностью прекращена 31 августа 2024 года. Для новых развертываний следует использовать Облачные службы Azure с расширенной поддержкой. Это новая модель развертывания на основе Azure Resource Manager.

С помощью задач запуска вы можете выполнять различные операции перед запуском роли. Операции, которые могут потребоваться выполнить, включают установку компонента, регистрацию компонентов объектной модели (COM), настройку разделов реестра или запуск длительного процесса.

Примечание.

Задачи запуска неприменимы к виртуальным машинам, они подходят только для веб-ролей и рабочих ролей облачной службы.

Как работают задачи запуска

Задачи запуска — это действия, выполняемые перед началом ролей. Файл ServiceDefinition.csdef определяет задачи запуска с помощью элемента Task в элементе Startup . Часто задачи запуска — это пакетные файлы, но они также могут быть консольными приложениями или пакетными файлами, запускающими сценарии PowerShell.

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

Задача запуска может записывать информацию и ошибки в журнал в каталоге, заданном переменной среды TEMP . Во время задачи запуска переменная среды TEMP разрешается в каталог C:\Resources\temp\[guid].[rolename]\RoleTemp при выполнении в облаке.

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

Задачи запуска должны заканчиваться errorlevel (или кодом выхода), равным 0. Тогда процесс запуска будет завершен. Если задача запуска заканчивается ненулевой ошибкой, роль не запускается.

Порядок запуска роли

Ниже приведена процедура запуска роли в Azure.

  1. Экземпляр помечается как "Запуск " и не получает трафик.

  2. Все задачи запуска выполняются в соответствии с их атрибутом taskType .

    • Простые задачи (simple) выполняются синхронно, по одной.

    • Фоновые задачи (background) и задачи переднего плана (foreground) запускаются асинхронно, параллельно с задачей запуска.

      Предупреждение

      Службы IIS могут не быть полностью настроены на этапе выполнения задач запуска в процессе запуска, поэтому данные, относящиеся к роли, могут быть недоступны. Для задач запуска, требующих данные, относящиеся к роли, следует использовать Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart.

  3. Процесс узла роли запускается и сайт создается в службы IIS (IIS).

  4. Вызывается метод Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart .

  5. Экземпляр помечается как Готов , и трафик перенаправляется в него.

  6. Вызывается метод Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run .

Пример задачи запуска

Задачи запуска определяются в файле ServiceDefinition.csdef, в элементе Task. Атрибут commandLine указывает имя и параметры запускаемого пакетного файла или команды консоли, атрибут executionContext указывает уровень привилегий задачи запуска, а атрибут taskType указывает, как выполняется задача.

В этом примере для задачи запуска создается переменная среды MyVersionNumber, которой присваивается значение 1.0.0.0.

ServiceDefinition.csdef:

<Startup>
    <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" >
        <Environment>
            <Variable name="MyVersionNumber" value="1.0.0.0" />
        </Environment>
    </Task>
</Startup>

В следующем примере пакетный файл Startup.cmd записывает строку «The current version is 1.0.0.0» в файл StartupLog.txt в каталоге, указанном в переменной среды TEMP. Строка EXIT /B 0 гарантирует, что задача запуска завершается errorlevel , равным 0.

ECHO The current version is %MyVersionNumber% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT /B 0

Примечание.

В Visual Studio свойству Копировать в выходной каталог для пакетного файла запуска должно быть присвоено значение Всегда копировать, чтобы пакетный файл запуска был должным образом развернут в проекте Azure (approot\bin для веб-ролей и approot для рабочих ролей).

Описание атрибутов задачи

Ниже описаны атрибуты элемента Task в файле ServiceDefinition.csdef .

commandLine — задает командную строку для задачи запуска:

  • Команда с необязательными параметрами командной строки, с которой начинается задача запуска.
  • Часто этот атрибут является именем файла .cmd или пакетного файла .bat.
  • Задача задается относительно папки "AppRoot\Bin" развертывания. Переменные среды не расширяются при определении пути и файла задачи. Если требуется расширение среды, можно создать небольшой CMD-файл сценария, который вызывает задачу запуска.
  • Может быть консольным приложением или пакетным файлом, который запускает сценарий PowerShell.

executionContext — задает уровень привилегий для задачи запуска. Уровень привилегий может быть ограничен или повышен:

  • limited
    Задача запуска выполняется с теми же привилегиями, что и роль. Если атрибут executionContext элемента Runtime также имеет значение limited, то используются привилегии пользователя.
  • elevated
    Задача запуска выполняется с привилегиями администратора. Эти привилегии позволяют задачам запуска устанавливать программы, вносить изменения конфигурации IIS, выполнять изменения реестра и другие задачи уровня администратора, не увеличивая уровень привилегий самой роли.

Примечание.

Уровень привилегий задачи запуска не обязательно должен совпадать с уровнем привилегий роли.

taskType — указывает способ выполнения задачи запуска.

  • Простые
    Задачи выполняются синхронно, поочередно и в порядке, указанном в файле ServiceDefinition.csdef . Если одна задача запуска simple завершается errorlevel, равным нулю, выполняется следующая задача запуска simple. Если выполнение более простых задач запуска не выполняется, сама роль запускается.

    Примечание.

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

    Чтобы убедиться, что пакетный файл завершается нулевым errorlevel, выполните команду EXIT /B 0 в конце обработки пакетного файла.

  • background
    Задачи выполняются асинхронно, параллельно с запуском роли.

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

Переменные среды

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

Существует два типа переменных среды для задачи запуска: статические переменные среды и переменные среды на основе членов класса RoleEnvironment . Оба они находятся в разделе Environment файла ServiceDefinition.csdef и используют элемент Variable и атрибут name.

Переменные статической среды используют атрибут значения элемента Variable. В предыдущем примере создается переменная среды MyVersionNumber , которая имеет статическое значение "1.0.0.0.0". Другим примером будет создание переменной среды StagingOrProduction, которую можно вручную задать значения промежуточного или рабочего для выполнения различных действий запуска на основе значения переменной среды StagingOrProduction.

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

Например, чтобы создать переменную среды, имеющую значение true при выполнении в эмуляторе вычислений и false — при выполнении в облаке, используйте следующие элементы Variable и RoleInstanceValue:

<Startup>
    <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>

            <!-- Create the environment variable that informs the startup task whether it is running
                in the Compute Emulator or in the cloud. "%ComputeEmulatorRunning%"=="true" when
                running in the Compute Emulator, "%ComputeEmulatorRunning%"=="false" when running
                in the cloud. -->

            <Variable name="ComputeEmulatorRunning">
                <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
            </Variable>

        </Environment>
    </Task>
</Startup>

Следующие шаги

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

Упакуйте облачную службу.