使用Puppet将字符串插入到文件中并进行迭代

时间:2017-05-16 15:20:10

标签: puppet

我正在使用Puppet进行.each次迭代:

$extensions_list = ["RT::Extension::ActivityReports",
                    "RT::Extension::JSGantt",
                   ]
$extensions_list.each |$extls| {
  cpan { $extls:
    ensure  => present,
    require => Class['::cpan'],
  }
}

正如您所看到的,我只是使用Puppet Forge的cpan模块安装两个Perl模块。这部分工作正常。

我想要发生的是每次以这种方式安装新的Perl模块时,它都会添加到RT的配置行(Request Tracker)中。那个文件住在这里:

/opt/rt4/etc/RT_SiteConfig.pm

,该行的格式为:

Plugins('RT::MODULE::ONE RT::MODULE::TWO');

所以,最后我希望它看起来像这样:

Plugins('RT::Extension::ActivityReports RT::Extension::JSGantt');

让Puppet在安装时依次将每个新模块添加到该行。如果我决定从现在开始每月安装RT::Authen::ExternalAuth,我可以将它添加到我上面的迭代中,并在Puppet运行之后:

Plugins('RT::Extension::ActivityReports RT::Extension::JSGantt');

会变成这样:

Plugins('RT::Extension::ActivityReports RT::Extension::JSGantt RT::Authen::ExternalAuth');

我没有其他干预,然后将其添加到迭代声明。

1 个答案:

答案 0 :(得分:0)

假设您没有管理/opt/rt4/etc/RT_SiteConfig.pm的任何其他Puppet代码,那么您有几个选项可以确保该文件中有正确的Plugins行。

如果您只想管理那一行,我建议您使用join中的file_linestdlib资源。

例如:

include stdlib

$ext_string = join($extensions_list, ' ')

file_line { 'rt extensions':
  ensure => present,
  path   => '/opt/rt4/etc/RT_SiteConfig.pm',
  line   => "Plugins('${ext_string}');",
  match  => '^\s*Plugins\(',
}

这将添加一个包含插件列表的行,并将替换任何现有的插件行。

如果您要管理多个设置,那么仅对整个文件进行模板化是有意义的。在这种情况下,您可以简单地使用

Plugins('<%= @extensions_list.join(' ') %>');

在你的模板中。