Azure 角色配置管理

Posted

技术标签:

【中文标题】Azure 角色配置管理【英文标题】:Azure role configuration management 【发布时间】:2012-07-17 08:39:08 【问题描述】:

当您别无选择只能将配置设置保存在 web.config(或 app.config)中时,我不明白 Windows Azure 如何让您改变应用程序的配置。

例如...

项目经常会使用大量使用 web.config 的第三方库。 web.config 的使用可能涉及连接字符串、应用程序设置或自定义配置部分。一个很好的例子是 ELMAH。 ELMAH 的 web.config 文件可能如下所示:

<configuration>

  <configSections>
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
    </sectionGroup>
  </configSections>

  <connectionStrings>
    <add
      name="MyElmahDatabase"
      providerName="System.Data.SqlClient"
      connectionString="Server=tcp:myServer.database.windows.net,1433;Database=myDB;User ID=user@myServer;Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30" />
  </connectionStrings>

  <elmah>
    <security allowRemoteAccess="1" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyElmahDatabase" />
  </elmah>

</configuration>

这里有几个问题:

我无法更新或更改是否在服务配置之间启用远程访问。

我无法更新或更改服务配置之间的 ELMAH 连接字符串。

这是因为 web.config 按原样打包到 .cspkg 文件中,ELMAH 不会查看服务配置设置(这是我可以在服务配置之间更改配置设置的唯一方法)。

我能想到许多其他有问题的例子......

任何直接查看连接字符串部分的数据访问框架。 我需要创建的任何自定义配置设置。

...仅举两个例子。

我是否遗漏了什么,或者这是 Windows Azure 提供的配置管理中的一个重大差距?

编辑

从下面的答案和 cmets 看来,这似乎不是很好的支持。我认为管理多个解决方案构建配置以支持不同的配置文件是一个非常薄弱的​​解决方案。我不应该为我需要的每个配置文件重新构建解决方案(可能会有很多)。编译不等于配置。

我想知道是否有办法修改 .cspkg 文件,因为它只是一个 zip 文件。根据this 文档,您可以在 Linux 上使用。

我查看了 .cspkg 文件中的清单,它看起来像这样:

<PackageManifest version="2">
  <Encryption keytype="1" />
  <Contents hashtype="1">
    <Item name="MyApp.Web.UI_<GUID>.cssx" hash="AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2" uri="/MyApp.Web.UI_<GUID>.cssx" />
    <Item name="MyApp.Web.Services_<GUID>.cssx" hash="7AC81AFF642E4345173C8470C32A41118A4E3CFD4185B82D0ADA44B71057192D" uri="/MyApp.Web.Services_<GUID>.cssx" />
    <Item name="SMPackage_<GUID>.csmx" hash="B5E6B83B62AF64C7C11CAC1A394ABBF15D7DB7667A773C5284CE5BE95C5834E9" uri="/SMPackage_<GUID>.csmx" />
    <Item name="SDPackage_<GUID>.csdx" hash="F34B7C02A551D82BAD96881E2DA9447D0014D49B47CCB3840475BDC575234A7D" uri="/SDPackage_<GUID>.csdx" />
    <Item name="NamedStreamPackage_<GUID>.csnsx" hash="FA2B5829FF5D9B2D69DCDDB0E5BDEE6B8B0BC09FFBF37DAEEE41CF3F3F4D0132" uri="/NamedStreamPackage_<GUID>.csnsx" />
  </Contents>
  <NamedStreams>
    <Stream name="RequiredFeatures/MyApp.Web.Services/1.0" />
    <Stream name="RequiredFeatures/MyApp.Web.UI/1.0" />
    <Stream name="SupportData/MyApp.Web.Services/1.0" />
    <Stream name="SupportData/MyApp.Web.UI/1.0" />
  </NamedStreams>
</PackageManifest>

不幸的是,如果我重新计算未更改的“MyApp.Web.UI_.cssx”文件的哈希值,我的哈希值与清单中的不同。

来自清单的哈希:AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2

我计算的哈希值:E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855

请注意,我还没有更改文件,所以哈希应该是一样的。

这表明我计算错误。我的方法如下:

class Program

    static void Main(string[] args)
    
        using (FileStream fs = new FileStream(args[0], FileMode.Open))
        
            ComputeHash(new SHA256Managed(), fs);
        
    

    private static void ComputeHash(HashAlgorithm hashAlgorithm, Stream stream)
    
        byte[] hash = hashAlgorithm.ComputeHash(stream);
        string hashString = BitConverter.ToString(hash);
        Console.WriteLine(hashString.Replace("-", string.Empty));
        Console.WriteLine();
    

上面的文档链接表明重新计算哈希很简单(无论如何在 Linux 上)。

有人知道如何重新计算哈希值吗?

【问题讨论】:

您可以将 .cscfg 文件用于您的包的任何可配置项。 那行不通 - ELMAH(和其他框架)不会查看 .cscfg 中保存的配置数据。 据我所知,azure 包的唯一可能配置方法是 .cscfg 文件。对于像 ELMAH 这样的框架,您可能必须找到一种解决方法,例如动态更改配置。但我认为 *** 上有很多天蓝色的专家可能会提供更好的答案。这也是一个非常有趣和重要的问题。 【参考方案1】:

与使用byte[] 重载相比,将Stream 传递给ComputeHash() 最终会得到不同的哈希值。我不知道为什么。

尝试类似:

private static void ComputeHash(HashAlgorithm hashAlgorithm, Stream stream)

    BinaryReader reader = new BinaryReader(stream)
    byte[] hash = hashAlgorithm.ComputeHash( reader.ReadBytes( (int)stream.length ) );
    string hashString = BitConverter.ToString(hash);
    Console.WriteLine(hashString.Replace("-", string.Empty));
    Console.WriteLine();

这将为您提供所需的哈希值。

您可能已经发现,在 linux 上,您可以使用

openssl dgst -sha256 /path/to/file

【讨论】:

【参考方案2】:

如果您的 web.config 中有一些项目要根据构建方式进行更改,那么您可以使用 Azure 之外的解决方案。您可以使用Web.config transforms。这些转换与您的构建配置而不是您的服务配置相关联,但您的服务配置可能与您的构建配置密切相关(...Local.csfg -> Debug,...Cloud.csfg -> Release)。如果默认构建配置不适合您,请创建您需要的配置。

如果你想为每个服务配置使用不同的服务定义,那么 UI 不支持,但你可以mess around with the build process to make it work

【讨论】:

这在技术上可行,但我必须开始为每个环境维护构建配置。此列表可能很长(开发、集成、系统测试、UAT、生产),并且必须构建每个额外的构建配置,这会增加构建时间。我想要一个 Debug 版本和一个 Release 版本,并且能够将其中任何一个部署到任何环境。 无论您使用什么解决方案,如果您想要为每个环境使用不同的 web.config,则无论如何您都必须为每个环境进行构建,因为 web.config 包含在包中。包一经创建就无法更改。 我不确定这是否完全正确 - 在“调试”构建配置下,我可以拥有“n”个服务配置。默认情况下,这些是“本地”和“云”,如果我可以有“本地”、“云集成”、“云系统测试”、“云-UAT”等,那就太好了。而且我可以改变配置文件对于每个服务配置。我不明白为什么我必须重建整个解决方案来应对额外的配置文件 - 编译不等于配置。 我想我们可能在谈论不同的目的,所以让我退后一步。您的问题是关于 web.config 设置及其与服务配置的关系。目前没有,我认为这种情况不会很快改变。如果您希望拥有某种外部 web.config,例如 .cscfg,您可以在其中只创建一个包并提供不适用于 Azure 的不同配置,因为在创建包时 web.config 包含在包裹。您不能只是打开包并对其进行更改,因为它已签名并校验和,因此任何更改都会使其无效 虽然很烦人,但如果您想为每个环境使用不同的 web.config,则必须为每个环境进行构建。

以上是关于Azure 角色配置管理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 管理 Azure:基础配置

自定义配置脚本 Azure 资源管理器模板

Azure 流量管理器性能平衡与不同数据中心的嵌套配置文件

Azure通过RBAC对资源进行管理

Jenkins配置基于角色的项目权限管理

Jenkins配置基于角色的项目权限管理