Python Cloud Service中的Azure环境变量

时间:2016-01-04 12:41:29

标签: python azure azure-storage azure-cloud-services

我有一个在Microsoft Azure上运行的Python Cloud Service,它应该在dev开始运行时使用不同的存储帐户(用于blob存储和队列),而不是分段与生产。

我宁愿不对存储帐户凭据进行硬编码,而是从环境中获取它们。或者,我想要一个环境变量或者某个东西来指示我是在分阶段还是在制作中。当我尝试print(os.environ)时,我看不到任何azure存储凭据,也没有显示表示暂存或生产的值。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题,因为我已经使用了一系列解决方案来制作适合我的东西。

我能够在多个ServiceConfiguration文件中定义我的设置,例如ServiceConfiguration.Local.cscfgServiceConfiguration.Dev.cscfgServiceConfiguration.Production.cscfg。在<ConfigurationSettings>下,添加<Setting name="settingname" value="settingvalue" />,或在Visual Studio中使用该界面。发布时,您可以选择要使用的配置文件,而无需修改任何代码。添加的优点是,在服务发布后,还可以通过Azure门户修改这些设置。请参阅this postthis post

接下来的挑战是将这些变量注入Python环境。与ServiceDefinition.csdef中定义的变量不同,Python环境无法使用配置设置。然而,它们存储在DLL的某个地方,可以使用一些C#方法调用访问并注入到Python环境中(我对这整个过程一无所知,我只是遵循this post)。只需在LaunchWorker.ps1之前的任何位置将这些行添加到iex "py $worker_command"

# search for the Dll
$Splathashtable = @{
                    'Path' = "$env:windir\Microsoft.NET\assembly\";
                    'Filter' = 'Microsoft.WindowsAzure.ServiceRuntime.dll';
                    'Include' = '*.dll'
                    }

$dllfile = Get-ChildItem @Splathashtable -Recurse  | Select-Object -Last 1 
# selecting only one object, in case of multiple results

# add the DLL to the current PowerShell session
Add-Type -Path $dllfile.FullName    

# Call the Static method on the class to retrieve the setting value
$Setting = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue('settingname')

# add setting to environment
[Environment]::SetEnvironmentVariable('settingname', $Setting)

现在,您将通过os.environ.get('SETTINGNAME')

找到可在Python中使用的设置

答案 1 :(得分:0)

您可以在ServiceDefinition.csdef文件中设置自定义运行时变量,然后您可以利用os.environ.get('MY_ENV_NAME')调用它。

E.G。 ServiceDefinition.csdef的内容应为:

  <WorkerRole name="WorkerRole1" vmsize="Small">
    <ConfigurationSettings>
      ...
    </ConfigurationSettings>
    <Startup>
      ...
    </Startup>
    <Runtime>
      <Environment>
        <Variable name="MY_ENV_NAME" value="my_value" />
        <Variable name="EMULATED">
          <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
        </Variable>
      </Environment>
      ...
    </Runtime>
    ...
  </WorkerRole>

您可以参考http://blog.toddysm.com/2011/03/what-environment-variables-can-you-use-in-windows-azure.html了解更多详情。