如果这些情况不是一次性的而是定期发生的,那么处理这些情况的最佳方法是什么:
- 很多机器上的自托管服务需要集中重定向到不同的数据库。因此需要更改 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 的运行原理都非常相似。