Windows Azure: ¿cómo expongo un ajuste de configuración como una variable de entorno?

Intenté agregar esto a mi archivo ServiceDefinition.csdef:

<WorkerRole ...><Runtime><Environment>
    <Variable name="AZURE_STORAGE_ACCOUNT">
      <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='AZURE_STORAGE_ACCOUNT']/@value" />
    </Variable>
</Environment></Runtime></WorkerRole>

Y establecí la configuración en mi archivo ServiceConfiguration.Cloud.cscfg:

<Role name="WorkerRole">
  <ConfigurationSettings>
    <Setting name="AZURE_STORAGE_ACCOUNT" value="<secret stuff>" />
  </ConfigurationSettings>
</Role>

Pero tengo el siguiente error cuando ejecuto cspack:

CloudServices091 : The '/RoleEnvironment/CurrentInstance/Configur
ationSettings/ConfigurationSetting[@name='AZURE_STORAGE_ACCOUNT']/@value' is an
invalid xpath expression.

preguntado el 03 de mayo de 12 a las 07:05

Esta pregunta en sí misma fue suficiente para darme en el blanco, tenía suficiente respuesta incorporada. +1! -

4 Respuestas

¿Te falta la declaración de esa configuración? No veo el elemento apropiado en su .csdef, algo como <ConfigurationSettings><Setting name="AZURE_STORAGE_ACCOUNT"/></ConfigurationSettings>. Necesitas uno de esos en tu .csdef, y luego todavía quieres el que está en tu .cscfg que incluye el valor.

Si está usando Visual Studio, debería editar ambos archivos si usa su vista de propiedades. (Simplemente haga doble clic en el rol y luego haga clic para acceder a los ajustes de configuración y agregar uno nuevo).

contestado el 03 de mayo de 12 a las 17:05

La configuración parece ser correcta. Sería mejor si puede asegurarse de que está utilizando el SDK más reciente. La función xPath está disponible en Windows Azure SDK 1.5 y versiones posteriores.

Atentamente,

Ming Xu.

contestado el 03 de mayo de 12 a las 08:05

He probado diferentes opciones mencionadas en los blogs, como incluir la configuración tanto en .cscfg como en .csdef. Pero, no parece funcionar. Además, otras consultas Xpath como

      <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/>

funciona correctamente.

Finalmente, descubrí que el nombre de la variable utilizada era diferente:

En cscfg tuve:

<Setting name="WFFEPeriodicRestartTime" value="168:00:00" />

en csdef tuve:

  <ConfigurationSettings>
      <Setting name="PeriodicRestartTime" />
   </ConfigurationSettings>

.... ....

 <Variable name="PeriodicRestartTime">
            <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='WFFEPeriodicRestartTime']/@value" />
  </Variable>

Csdef cambiado a:

<ConfigurationSettings>
      <Setting name="WFFEPeriodicRestartTime" />
   </ConfigurationSettings>

.... ....

 <Variable name="WFFEPeriodicRestartTime">
            <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='WFFEPeriodicRestartTime']/@value" />
          </Variable>

Parece funcionar correctamente ahora

respondido 12 nov., 13:11

Me encontré con el mismo problema aquí cuando intentaba leer los valores de configuración a través del ejemplo proporcionado aquí: https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-role-config-xpath#config-setting - ¡perdió bastantes células cerebrales en el proceso!

El truco es que esto no significa que lea los valores de configuración de su web.config (que es como lo leí mal), sino de la Configuración en el archivo cscfg.

Con los servicios en la nube, tiene 1 archivo csdef que se aplica a todas sus configuraciones de servicios en la nube, pero luego un cscfg para cada entorno. En mi escenario, tengo cscfg para DEV, QA, Prod y necesitaba establecer una variable diferente según el entorno.

Entonces, para la pregunta del OP, cuando intenta realizar la declaración "RoleEnvironment/CurrentInstance/ConfigurationSettings ..." y obtiene el valor de xpath no válido, esencialmente dice "oye, no puedo encontrar este valor"

Cómo hacer que la magia suceda:

Su archivo csdef necesita lo siguiente:

<ConfigurationSettings>
    <Setting name="AZURE_STORAGE_ACCOUNT" />
</ConfigurationSettings>

Su cscfg entonces necesita:

<ConfigurationSettings>
      <Setting name="AZURE_STORAGE_ACCOUNT" value="Some Secret Value" />
</ConfigurationSettings>

Para mis propósitos, estaba tratando de usar este valor en un archivo startup.cmd, por lo que pude agregar lo siguiente a mi tarea de inicio csdef

<Startup>
  <Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple">
    <Environment>
      <Variable name="AZURE_STORAGE_ACCOUNT">
        <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='AZURE_STORAGE_ACCOUNT']/@value" />
      </Variable>
    </Environment>
  </Task>
</Startup>

Luego, en mi startup.cmd, puede hacer referencia al valor como %%AZURE_STORAGE_ACCOUNT%%

contestado el 03 de mayo de 18 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.