Puppet Parse Order解释

时间:2017-06-27 02:43:24

标签: puppet

我正在根据包提供的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相同的错误。似乎在解析期间,文件资源甚至在执行“执行”之前就进行了一些预验证。它应该在之后订购。任何人都可以解释这种行为吗?

1 个答案:

答案 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