Exportar (0) Imprimir
Expandir todo

Ejecutar tareas de inicio en Azure

Actualizado: mayo de 2014

Puede usar las tareas de inicio para realizar operaciones antes de que se inicie un rol. Las operaciones que quizás desee realizar incluyen la instalación de un componente, el registro de componentes COM, la configuración de claves del Registro o el inicio de un proceso de ejecución prolongada.

noteNota
Las tareas de inicio no son aplicables a los roles de VM.

Las tareas de inicio son acciones que se emprenden antes de que los roles empiecen. Las tareas de inicio quedan definidas en el archivo ServiceDefinition.csdef mediante el elemento Task dentro del elemento Startup. Las tareas de inicio son, por lo general, archivos por lotes, pero también pueden ser aplicaciones de consola, o archivos por lotes que inician scripts de PowerShell.

Las variables del entorno envían información a una tarea de inicio y se puede utilizar un almacenamiento local para transmitir información sobre una tarea de inicio. Por ejemplo, una variable de entorno puede especificar la ruta de acceso al programa que se desee instalar, y los archivos se pueden escribir en el almacenamiento local que podrán leer más tarde los roles.

La tarea de inicio puede registrar información y errores en el directorio que especifica la variable de entorno TEMP. Durante la tarea de inicio, la variable de entorno TEMP va al directorio C:\Recursos\temp\<guid>.<rolename>\RoleTemp cuando se ejecuta en la nube.

Las tareas de inicio se pueden ejecutar varias veces entre reinicios. Por ejemplo, la tarea de inicio se ejecuta cada vez que el rol se recicla y puede que esto no incluya siempre un reinicio. Las tareas de inicio deben escribirse de forma que puedan ejecutarse varias veces sin problemas.

Las tareas de inicio deben finalizar con un errorlevel (o código de salida) de cero para que se complete el proceso de inicio. Si una tarea de inicio finaliza con un errorlevel que no sea cero, el rol no se iniciará.

A continuación se enumera el procedimiento del rol de inicio en Windows Azure:

  1. La instancia se marca como Iniciándose y no recibe tráfico.

  2. 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.

      WarningAdvertencia
      Es posible que IIS no se haya configurado durante la tarea de inicio en el proceso de inicio, por tanto, es posible que no estén disponibles los datos específicos del rol. Las tareas de inicio que requieren datos de rol específicos debería usar Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart.

  3. Se inicia el proceso del host del rol y el sitio se crea en IIS.

  4. Se llama al método Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart.

  5. La instancia se marca como Listo y el tráfico se enruta hacia la instancia.

  6. Se llama al método Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run.

Las tareas de inicio quedan definidas en el archivo ServiceDefinition.csdef, en el elemento Task. El atributo commandLine especifica el nombre y los parámetros del archivo por lotes de inicio o el comando de la consola, el atributo executionContext especifica el nivel de privilegio de la tarea de inicio y el atributo taskType especifica cómo se ejecutará la tarea.

En este ejemplo se crea una variable de entorno, MyVersionNumber, 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 “La versión actual es 1.0.0.0” en el archivo StartupLog.txt en el directorio que ha especificado la variable de entorno TEMP. La línea EXIT /B 0 garantiza que la tarea de inicio finalice con un errorlevel de cero.

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

noteNota
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 Windows Azure (approot\bin para los roles web y approot para los roles de trabajo).

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:

  • Comando, con parámetros de línea de comando opcionales, que hace que comience la tarea de inicio.

  • Suele ser el nombre de archivo de un archivo .cmd o de un archivo por lotes .bat.

  • Puede ser una aplicación de consola o un archivo por lotes que inicia un script de PowerShell. Para obtener información específica sobre cómo usar un script de PowerShell como tarea de inicio, vea Usar un script de PowerShell como tarea de inicio.

executionContext: especifica el nivel de privilegio para la tarea de inicio. El nivel de privilegio puede tener restricciones o ser elevado:

  • limited : la tarea de inicio se ejecuta con los mismos privilegios que el rol. Cuando el atributo executionContext para el elemento Runtime también es limited, se utilizan los privilegios de usuario.

  • elevated: la tarea de inicio se ejecuta con privilegios de administrador. Esto permite que las tareas de inicio instalen programas, efectúen cambios en la configuración de IIS, realicen cambios en el Registro y otras tareas propias de administrador, sin aumentar el nivel de privilegios del rol.

noteNota
El nivel de privilegio de una tarea de inicio puede ser mayor que el nivel de privilegio de un rol. Una tarea de inicio puede utilizar privilegios elevated para instalar programas o realizar cambios en la configuración de IIS, mientras que un rol puede utilizar los privilegios limited por razones de seguridad.

taskType: especifica la forma en que se ejecuta una tarea de inicio.

  • Las tareas simple se ejecutan sincrónicamente, de una en una, según el orden especificado en el archivo ServiceDefinition.csdef. Cuando una tarea de inicio simple finaliza con un errorlevel de cero, se ejecuta la tarea de inicio simple siguiente. Si no hay más tareas de inicio simple para ejecutarse, se iniciará el propio rol.

    noteNota
    Si la tarea simple finaliza con un errorlevel distinto de cero, la instancia se bloquea. Las tareas de inicio simple siguientes y el rol no se iniciarán.

    Para asegurarse de que el archivo por lotes finalice con un errorlevel de cero, ejecute el comando EXIT /B 0 al final del proceso del archivo por lotes.

  • Las tareas en background se ejecutan de forma asincrónica, en paralelo con el inicio del rol.

  • Las tareas en foreground se ejecutan de forma asincrónica, en paralelo con el inicio del rol. La diferencia clave entre una tarea en foreground y una tarea en background es que una tarea en foreground mantiene el rol en ejecución, mientras que la tarea en foreground se ejecuta. Esto también indica que si la tarea en foreground no finaliza, el rol no se cerrará ni se reciclará. Las tareas en background no tienen esta restricción, por tanto, los roles se pueden reciclar aunque las tareas en background no hayan finalizado.

Las variables de entorno constituyen un método para transmitir información a una tarea de inicio. Por ejemplo, puede colocar la ruta de acceso para un blob que contiene un programa que se va a instalar o números de puerto que vaya a usar el rol o bien, los valores que controlan las funciones de la tarea de inicio.

Hay dos tipos de variables de entorno para las tareas de inicio; las variables de entorno estáticas y las variables de entorno basadas en los miembros de la clase RoleEnvironment. Ambas se encuentran en la sección Environment del archivo ServiceDefinition.csdef y usan el elemento Variable y el atributo name.

Las variables de entorno estáticas utilizan 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 que pueda establecer manualmente los valores de "ensayo" o "producción" para llevar a cabo acciones de inicio diferentes en función del valor de la variable de entorno StagingOrProduction.

Las variables de entorno según los miembros de la clase RoleEnvironment no utilizan el atributo value del elemento Variable. En su lugar, el elemento secundario RoleInstanceValue, con el valor de atributo adecuado xPath, se utilizan para crear una variable de entorno basada en un miembro de la clase RoleEnvironment. Los valores del atributo xPath que dan acceso a los diversos valores RoleEnvironment se pueden encontrar en Valores xPath en Azure.

Por ejemplo, para crear una variable de entorno que sea "true" cuando la instancia se está ejecutando en el emulador de proceso y "false" cuando se ejecute en la nube, utilice los elementos Variable y RoleInstanceValue siguientes:

    <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>

Vea también

Mostrar:
© 2015 Microsoft