使用带有迭代的 Puppet 将字符串插入到文件中

Inserting a string into a file with Puppet with iteration

我是 运行 与 Puppet 的 .each 迭代:

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

如您所见,我只是安装了两个 Perl 模块和一个来自 Puppet Forge 的 cpan 模块。这部分工作正常。

我希望每次以这种方式安装新的 Perl 模块时,它都会被添加到 RT(请求跟踪器)的配置行中。该文件位于此处:

/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');

在我没有其他干预的情况下,然后将其添加到迭代语句中。

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

如果您只想管理那一行,那么我建议使用 join and a file_line resource from stdlib

例如:

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(' ') %>');

在您的模板中。