集中管理自托管 .NET 服务的 app.config 部分

集中管理自托管 .NET 服务的 app.config 部分

如果这些情况不是一次性的而是定期发生的,那么处理这些情况的最佳方法是什么:

  • 很多机器上的自托管服务需要集中重定向到不同的数据库。因此需要更改 app.configs 并重启服务。
  • 所有服务都需要获取新的日志配置(例如),比如说更新 App.config 中的部分并重新启动

当然,这可以使用 powershell 自动完成,但肯定有工具可以做到这一点。我知道,有些公司使用配置管理系统来实现这一点 - 比如Ansible厨师或者木偶,但它们适合这种任务吗?

我现在也了解 Java 解决方案Spring Cloud 配置,但还没有找到类似的东西。NET

答案1

您所描述的任务可以通过多种方式解决。没有一种方法是“最佳”的,因为每种方法都有各自的优缺点。

整个行业已经从脚本发展到配置管理,再到不可变系统。

例如,要管理 IIS Web 服务器的 web.config,您可以发出 appcmd.exe 命令。我们使用 Chef 和 IIS cookbook 来抽象 appcmd.exe 命令幂等资源。

  iis_config "session sql_provider" do
    cfg_cmd "Foobar/#{site} -section:system.web/sessionState /+\"providers.[name='#{session_name}',connectionString='#{session_connection_string}',type='#{session_type}']\""
    action :set
      notifies :restart, 'iis_site[mysite]'
  end

这里“#{}”内的所有内容都是 chef 变量。如果资源运行,则会触发 IIS 服务的重新启动。

不直接使用 appcmd.exe 而是将其抽象为资源的优点是,资源可以轻松地将变量作为参数。这样,​​您只需编写一次代码,即可在多个数据中心和环境中使用它。最终目标是能够为每种类型的服务器编写策略,并让配置管理使服务器与策略保持一致。

在 chef 内部管理日志配置文件的另一个示例。

template "#{node['web']['path']}/log4net.config.xml" do
  source 'wwwroot/log4net.config.erb'
  variables(
    :log_level => node['web']['log4net']['log_level']
  )
  action :create
end

然后,xml 文件被“模板化”为 erb 模板。<%= -%> 之间的所有内容都是变量

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
    <root>
      <level value="<%= @log_level -%>"/>

然后,您可以按计划运行 chef,这样如果变量发生变化,配置管理就会将文件置于所需状态。

Ansible、Chef、Puppet 和 Salt 的运行原理都非常相似。

相关内容