从文件 /etc/resolv.conf 读取并填充到 named.conf.options

Reading from file /etc/resolv.conf and populating in named.conf.options

我正在使用 puppet 生成我的 named.conf.options 文件,为此我希望它使用 /etc/resolv.conf 中定义的转发器。这样做的最佳方法是什么,我一直在这样做(其中 named.conf.options.erb 包含) - 但它一直在运行。

file { '/etc/bind/named.conf.options':
    ensure => present,
    content => template('my_template_location/named.conf.options.erb'),
    replace => true,
}
->
exec { "add_nameserver":
    command => '/bin/sed -i "s/<name_server>/$(grep nameserver/etc/resolv.conf | tr -d [a-z])/g" /etc/bind/named.conf.options',
}

执行者将始终运行,除非它有限制它的东西。您可以设置许多参数。

在您的情况下,听起来您希望 exec 仅在文件更改时 运行。您可能想在 exec 上使用 refreshonly 参数。

首先,将要求箭头更改为通知箭头,从 -> 更改为 ~>。这将导致 Puppet 在文件更改时刷新 exec。

其次,将 refreshonly => true 添加到您的 exec。这将导致 exec 在被其他资源刷新时仅 运行。

您将得到以下结果:

file { '/etc/bind/named.conf.options':
    ensure  => present,
    content => template('my_template_location/named.conf.options.erb'),
    replace => true,
}
~>
exec { "add_nameserver":
    command     => '/bin/sed -i "s/<name_server>/$(grep nameserver/etc/resolv.conf | tr -d [a-z])/g" /etc/bind/named.conf.options',
    refreshonly => true,
}

您可以查看其他一些方法来限制 Puppet Type Reference Page 上的 exec。

您无法通过这种方式获得所需的状态,因为您正在使用两个不同的声明修改同一资源(文件 /etc/bind/named.conf.options)。

通常你必须避免 Puppet 中的 exec 资源,因为在执行 "old-school" 命令时很难保持状态和幂等性。

因此,获得所需行为的最佳方式是创建一个自定义事实 [1],将您的名称服务器公开给任何资源,然后将其包含在您的 ERB 模板中。

Facter.add(:nameservers_array) do
  setcode do
    nameservers = Facter::Core::Execution.exec('grep nameserver/etc/resolv.conf | tr -d [a-z]')
    nameservers_array = nameservers.split(" ")
    nameservers_array
  end
end

这里还有一个例子:https://www.jethrocarr.com/2013/11/05/exposing-name-servers-with-puppet-facts/

[1] https://docs.puppetlabs.com/facter/latest/fact_overview.html