我正在根据包提供的30-stig.rules文件构建auditd audit.rules文件。
stig.rules文件位于/usr/share/doc/audit-<version>/rules/30-stig.rules。但是,事先很难知道安装了哪个版本的auditd因此我想使用exec资源将此文件复制到标准位置:
exec { 'Copy stig.rules to /tmp/stig.rules':
command => 'cp $(rpm -qf auditd | grep stig.rules) /tmp/stig.rules',
unless => 'cmp /tmp/stig.rules $(rpm -qf auditd | grep stig.rules)',
}
file { '/etc/audit/audit.rules':
ensure => file,
content => template('auditd/audit.rules.erb'),
}
模板(audit.rules.erb)包含:
scope.function_file(['/tmp/stig.rules'])
我最初得到一个错误,模板找不到/tmp/stig.rules。因此,我补充道:
Exec['Copy stig.rules to /tmp/stig.rules'] -> File['/etc/audit/audit.rules']
即使经过这种明确的排序,我也会得到与找不到/tmp/stig.rules相同的错误。似乎在解析期间,文件资源甚至在执行“执行”之前就进行了一些预验证。它应该在之后订购。任何人都可以解释这种行为吗?
答案 0 :(得分:0)
正如评论中所提到的,你遇到的问题是Puppet函数在Puppet Master上执行。
通常,这个问题可以通过创建一个返回审计版本的custom fact来解决。
使用以下内容在模块中创建文件:
# lib/facter/auditd_version.rb
Facter.add(:auditd_version) do
confine :osfamily => 'RedHat'
setcode do
Facter::Core::Execution.exec('rpm -q --queryformat "%{VERSION}\n" audit')
end
end
然后,您可以使用以下方法在清单中引用文件路径:
$file_path = "/usr/share/doc/audit-${facts['auditd_version']}/rules/30-stig.rules"
或(遗产):
$file_path = "/usr/share/doc/audit-${::auditd_version}/rules/30-stig.rules"
您可以使用以下方法在ERB模板中访问它:
/usr/share/doc/audit-<%= @auditd_version %>/rules/30-stig.rules
如果您需要清单中的stig规则文件的内容,通常会将该内容传输到Puppet清单中,并允许Puppet管理该文件:
$stig_rules = template('mymodule/stig_rules.erb')
file { "/usr/share/doc/audit-${facts['auditd_version']}/rules/30-stig.rules":
ensure => file,
content => $stig_rules,
}
然后在模板中,您现在可以@stig_rules
访问该内容。
如果RPM偶尔会更改该文件的内容,则需要更新您的Puppet清单 - true,这是不理想的。
另一种方法是简单地在自定义事实中返回整个文件内容。
# lib/facter/stig_rules.rb
Facter.add(:stig_rules) do
confine :osfamily => 'RedHat'
setcode do
Facter::Core::Execution.exec("cat \
/usr/share/doc/audit-#{Facter.value(:auditd_version)}/stig.rules")
end
end