Configuración y ejecución de tareas de inicio en un servicio en la nube de Azure (clásico)
Importante
Cloud Services (clásico) ahora está en desuso para todos los clientes a partir del 1 de septiembre de 2024. Microsoft detendrá y cerrará todas las implementaciones en curso y los datos se perderán de forma permanente a partir de octubre de 2024. Las nuevas implementaciones deben utilizar el nuevo modelo de implementación basado en Azure Resource Manager Azure Cloud Services (soporte extendido) .
Puede usar las tareas de inicio para realizar operaciones antes de que se inicie un rol. Las operaciones que puede realizar incluyen instalar un componente, registrar componentes del modelo de objetos componentes (COM), establecer claves del registro o iniciar un proceso de larga duración.
Nota:
Las tareas de inicio no son aplicables a las máquinas virtuales, solo a los roles web y de trabajo del servicio en la nube.
Cómo funcionan las tareas de inicio
Las tareas de inicio son acciones realizadas antes de que los roles empiecen. El archivo ServiceDefinition.csdef define las tareas de inicio mediante el elemento Task dentro del elemento Startup. Con frecuencia, las tareas de inicio son archivos por lotes, pero también pueden ser aplicaciones de consola o archivos por lotes que inician scripts de PowerShell.
Las variables de entorno pasan información a una tarea de inicio y el almacenamiento local puede usarse para pasar información de una tarea de inicio. Por ejemplo, una variable de entorno puede especificar la ruta de acceso a un programa que quiera instalar, los archivos pueden escribirse en un almacenamiento local. Desde allí, los roles pueden leer los archivos.
La tarea de inicio puede registrar información y errores en el directorio especificado por la variable de entorno TEMP . Durante la tarea de inicio, la variable de entorno TEMP va al directorio C:\Resources\temp\[guid].[rolename]\RoleTemp cuando se ejecuta en la nube.
Las tareas de inicio también se puede ejecutar varias veces entre reinicios. Por ejemplo, se ejecuta la tarea de inicio cada vez que el rol se recicla y los reciclajes de rol pueden no incluir siempre un reinicio. Las tareas de inicio deben escribirse de forma que les sea posible ejecutarse varias veces sin problemas.
Las tareas de inicio tienen que terminar con un errorlevel (o código de salida) de cero para que el proceso de inicio se complete. Si una tarea de inicio termina con un errorleveldistinto de cero, el rol no se inicia.
Orden de inicio de rol
A continuación se enumera el procedimiento de inicio de rol en Azure:
La instancia se marca como Starting y no recibe tráfico.
Todas las tareas de inicio se ejecutan de acuerdo con su atributo taskType .
Las tareas sencillas se ejecutan sincrónicamente, de una en una.
Las tareas en segundo plano y en primer plano se inician de forma asincrónica, paralelas a la tarea de inicio.
Advertencia
Puede que IIS no se haya configurado por completo durante la fase de la tarea de inicio en el proceso de inicio, por lo que los datos específicos de rol pueden no estar disponibles. Las tareas de inicio que requieren datos específicos de la role tienen que usar Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart.
Se inicia el proceso de host de rol y se crea el sitio en Internet Information Services (IIS).
Se llama al método Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart .
La instancia se marca como Ready y el tráfico se enruta a la instancia.
Se llama al método Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run .
Ejemplo de una tarea de inicio
Las tareas de inicio se definen en el archivo ServiceDefinition.csdef , en el elemento Task . El atributo commandLine especifica el nombre y los parámetros del archivo por lotes o del comando de consola, el atributo executionContext especifica el nivel de privilegio de la tarea de inicio y el atributo taskType especifica cómo se ejecuta la tarea.
En este ejemplo, una variable de entorno MyVersionNumber, se crea para la tarea de inicio y se establece en el valor "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>
En el ejemplo siguiente, el archivo por lotes Startup.cmd escribe la línea "The current version is 1.0.0.0" en el archivo StartupLog.txt en el directorio especificado por la variable de entorno TEMP. La línea EXIT /B 0
garantiza que la tarea de inicio finaliza con un errorlevel de cero.
ECHO The current version is %MyVersionNumber% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT /B 0
Nota:
En Visual Studio, la propiedad Copiar en el directorio de salida para el archivo por lotes de inicio se debe establecer en Copiar siempre con el fin de garantizar que el archivo por lotes de inicio se implementa debidamente en el proyecto en Azure (approot\bin para los roles web y approot para los roles de trabajo).
Descripción de los atributos de la tarea
A continuación se describen los atributos del elemento Task en el archivo ServiceDefinition.csdef :
commandLine - especifica la línea de comandos para la tarea de inicio:
- El comando, con los parámetros de línea de comandos opcionales, que comienza la tarea de inicio.
- Con frecuencia este atributo es el nombre de archivo de un archivo por lotes .bat o .cmd.
- La tarea es relativa a la carpeta AppRoot\Bin para la implementación. Las variables de entorno no se expanden para determinar la ruta de acceso y el archivo de la tarea. Si se requiere la expansión del entorno, puede crear un pequeño script .cmd que llame a la tarea de inicio.
- Puede ser una aplicación de consola o un archivo por lotes que inicie un script de PowerShell.
executionContext - especifica el nivel de privilegio de la tarea de inicio. El nivel de privilegio puede tener los valores limited o elevated:
- limited
la tarea de inicio se ejecuta con los mismos privilegios que el rol. Cuando el atributo executionContext para el elemento Runtime también tiene el valor limited, se usan los privilegios de usuario. - elevated
la tarea de inicio se ejecuta con privilegios de administrador. Estos privilegios permiten a las tareas de inicio instalar programas, realizar cambios en la configuración de IIS, realizar cambios en el registro y otras tareas de nivel de administrador, sin aumentar el nivel de privilegio del propio rol.
Nota:
No es preciso que el nivel de privilegios de la tarea de inicio sea el mismo que el del propio rol.
taskType - especifica la manera en que se ejecuta una tarea de inicio.
simple
Las tareas se ejecutan sincrónicamente, una a una, en el orden especificado en el archivo ServiceDefinition.csdef . Cuando una tarea de inicio simple finaliza con un errorlevel de cero, se ejecuta la siguiente tarea de inicio simple. Si no hay más tareas de inicio con el valor simple para ejecutarse, se inicia el propio rol.Nota:
Si la tarea simple finaliza con un valor errorlevel distinto de cero, se bloqueará la instancia. Las subsiguientes tareas de inicio simple y el propio rol no se iniciarán.
Para asegurarse de que el archivo por lotes finaliza con un valor errorlevel de cero, ejecute el comando
EXIT /B 0
al final del proceso de archivo por lotes.background
Las tareas se ejecutan de forma asincrónica, en paralelo con el inicio del rol.foreground
Las tareas se ejecutan de forma asincrónica, en paralelo con el inicio del rol. La diferencia clave entre una tarea con el valor foreground y otra con el valor background es que una tarea foreground impide que el rol se recicle o se cierre hasta que finalice la tarea. Las tareas con el valor background no tienen esta restricción.
Variables de entorno
Las variables de entorno son una manera de pasar información a una tarea de inicio. Por ejemplo, puede colocar la ruta de acceso a un blob que contiene un programa para instalar, o los números de puerto que usa el rol o las configuraciones que controlan las funciones de la tarea de inicio.
Hay dos tipos de variables de entorno para las tareas de inicio; variables de entorno estáticas y variables de entorno basadas en los miembros de la clase RoleEnvironment . Ambos tipos se encuentran en las sección Environment del archivo ServiceDefinition.csdef y usan el elemento Variable y el atributo name.
Las variables de entorno estáticas usan el atributo value del elemento Variable. El ejemplo anterior crea la variable de entorno MyVersionNumber que tiene un valor estático de "1.0.0.0". Otro ejemplo sería crear una variable de entorno StagingOrProduction, para la que pueda establecer manualmente los valores de "staging" o "production" para realizar acciones de inicio diferentes en función del valor de la variable de entorno StagingOrProduction.
Las variables de entorno que se basan en los miembros de la clase RoleEnvironment no usan el atributo value del elemento Variable. En su lugar, el elemento secundario RoleInstanceValue, con el valor de atributo XPath adecuado, se usa para crear una variable de entorno basada en un miembro específico de la clase RoleEnvironment. Los valores del atributo XPath para acceder a distintos valores RoleEnvironment pueden encontrarse aquí.
Por ejemplo, para crear una variable de entorno que sea "true" cuando se ejecuta la instancia en el emulador de proceso, y "false" cuando se ejecuta en la nube, use los siguientes elementos Variable y 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>
Pasos siguientes
Aprenda a realizar algunas tareas de inicio comunes con el servicio en la nube.
Empaquete el servicio en la nube.