Ruby 基于具有正确自定义值的傀儡模板创建XML?

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

在数据库配置设置中,我有20多个包含数据库连接信息的XML文件

它们的内容完全相同,只是连接信息不同。我必须将这些XML文件用于五种不同的环境,因此我希望有一种好方法可以使用puppet更新它们的内容,而不是手动更新它们,因为我使用它来设置环境的其余部分:

<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>
...