Windows Azure:如何将配置设置公开为环境变量?

时间:2012-05-03 06:35:17

标签: configuration azure environment-variables

我尝试将其添加到我的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>

我在ServiceConfiguration.Cloud.cscfg文件中设置了配置设置:

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

但是当我运行cspack时出现以下错误:

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

4 个答案:

答案 0 :(得分:8)

您是否错过了该设置的声明?我在.csdef中没有看到相应的元素,例如<ConfigurationSettings><Setting name="AZURE_STORAGE_ACCOUNT"/></ConfigurationSettings>。您需要.csdef中的一个,然后您仍然需要.cscfg中包含该值的那个。

如果您使用的是Visual Studio,则在使用其属性视图时,它应该为您编辑这两个文件。 (只需双击该角色,然后单击以获取配置设置并添加新设置。)

答案 1 :(得分:0)

配置似乎是正确的。如果你能确保使用最新的SDK会更好。 Windows Azure SDK 1.5及更高版本中提供了xPath功能。

最诚挚的问候,

徐明。

答案 2 :(得分:0)

我尝试过在博客中提到的不同选项,例如包括.cscfg和.csdef中的设置。但是,它似乎不起作用。 此外,其他Xpath查询,如

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

正常工作。

最后,我发现使用的变量名称不同:

在cscfg中我有:

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

在csdef我有:

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

.... ....

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

将csdef更改为:

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

.... ....

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

现在似乎正常工作

答案 3 :(得分:0)

在这里遇到同样的问题,因为我试图通过此处提供的示例读取配置值:https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-role-config-xpath#config-setting - 在此过程中丢失了相当多的脑细胞!

诀窍是,这并不意味着您从web.config中读取配置值(这是我误读的方式),而是从cscfg文件中的Settings中读取。

使用云服务,您有1个csdef文件适用于所有云服务轮廓,但随后是每个环境的cscfg。在我的场景中,我有DEV,QA,Prod的cscfg,我需要根据环境设置不同的变量。

因此,对于OP的问题,当您尝试执行“RoleEnvironment / CurrentInstance / ConfigurationSettings ..”语句并获取无效的xpath值时,它基本上说“嘿,我找不到这个值”

如何让魔术发生:

您的csdef文件需要以下内容:

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

您的cscfg需要:

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

出于我的目的,我试图在startup.cmd文件中使用此值,因此我能够将以下内容添加到我的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>

然后在我的startup.cmd中,您可以将该值引用为%% AZURE_STORAGE_ACCOUNT %%