Ruby 基于具有正确自定义值的傀儡模板创建XML?
在数据库配置设置中,我有20多个包含数据库连接信息的XML文件 它们的内容完全相同,只是连接信息不同。我必须将这些XML文件用于五种不同的环境,因此我希望有一种好方法可以使用puppet更新它们的内容,而不是手动更新它们,因为我使用它来设置环境的其余部分:Ruby 基于具有正确自定义值的傀儡模板创建XML?,ruby,xml,templates,puppet,Ruby,Xml,Templates,Puppet,在数据库配置设置中,我有20多个包含数据库连接信息的XML文件 它们的内容完全相同,只是连接信息不同。我必须将这些XML文件用于五种不同的环境,因此我希望有一种好方法可以使用puppet更新它们的内容,而不是手动更新它们,因为我使用它来设置环境的其余部分: <config-property-setting name="DatabaseName"></config-property-setting> <config-property-setting name="Pas
<config-property-setting name="DatabaseName"></config-property-setting>
<config-property-setting name="Password"></config-property-setting>
<config-property-setting name="UserName"></config-property-setting>
<config-property-setting name="ServerName"></config-property-setting>
<config-property-setting name="DriverType"></config-property-setting>
<config-property-setting name="MaxStatements"></config-property-setting>
<config-property-setting name="NetworkProtocol"></config-property-setting>
<config-property-setting name="PortNumber"></config-property-setting>
<config-property-setting name="LoginTimeout"></config-property-setting>
这些是每个XML文件需要更改的值
有没有一种好方法可以让配置文件输入这些文件的值,然后通过模板将其作为正确配置和命名的XML文件推出?我会使用纯ruby。首先,创建配置文件:
:properties:
:DatabaseName : 'name'
:Password : 'pwd'
:UserName : 'user'
:ServerName : 'server'
:DriverType : 'mysql'
:MaxStatements : 30
:NetworkProtocol : 'udp'
:PortNumber : 1234
:LoginTimeout : 60
然后使用此ruby代码生成您需要的:
require 'yaml'
cfg = YAML.load_file 'cfg.yml'
xml = cfg[:properties].map { |k, v|
"<config-property-setting name='#{k}'>#{v}</config-property-setting>"
}.join("\n")
需要“yaml”
cfg=YAML.load_文件'cfg.yml'
xml=cfg[:properties].map{k,v|
“#{v}”
}.join(“\n”)
最后,将这些值插入到xml配置模板中(xml配置中必须有一个占位符来表示正确值的位置,例如,如果您想将它们直接插入根节点
):
xml_config_files.each{124;文件|
File.write(File,File.read(f).gsub//m,“\n{xml}\n”)
}
希望有帮助。在纯木偶中实现这一点最优雅的方法可能是使用Hiera和Erb模板 首先,确保您的
hiera.yaml
包含适合您的用例的层次结构。例如,如果不同的环境位于不同的域中(但使用environment
变量可能更常见):
然后,您可以按照@mudasobwa的建议存储各种配置值,例如在hieradata/xmlmodule/domain1.internal
:
:properties:
:DatabaseName : 'name'
:Password : 'pwd'
:UserName : 'user'
:ServerName : 'server'
:DriverType : 'mysql'
:MaxStatements : 30
:NetworkProtocol : 'udp'
:PortNumber : 1234
:LoginTimeout : 60
那么就简单到:
$properties = hiera('properties')
file { '/where/the/xml/fileS/goes.xml':
content => template('template.xml.erb');
}
然后在properties
hash中获得所需的值:
<config-property-setting name="DatabaseName">
<%=properties['DatabaseName']%>
</config-property-setting>
<config-property-setting name="Password">
<%=properties['Password']%>
</config-property-setting>
...
...
您尝试过什么?想做什么并不难,但需要一些XML生成方面的知识。Nokogiri可以用于此,ERB也可以。Puppet是文件被推出的方式,但是生成它们应该使用Ruby或其他语言。
$properties = hiera('properties')
file { '/where/the/xml/fileS/goes.xml':
content => template('template.xml.erb');
}
<config-property-setting name="DatabaseName">
<%=properties['DatabaseName']%>
</config-property-setting>
<config-property-setting name="Password">
<%=properties['Password']%>
</config-property-setting>
...