如何使用 Puppet 为 DNS 区域生成良好的序列号?

如何使用 Puppet 为 DNS 区域生成良好的序列号?

我的传统是将所有区域序列设置为修改时的时间戳。现在 Puppet 是我的新信仰,我想在从导出的资源构建区域文件时设置序列时间戳。一个稍微简单的例子可能如下所示:

file { "/tmp/dafile": content = inline_template("<%= Time.now.to_i %>"), }

这种方法的问题在于内容会一直不同,这将(最终)导致每次 puppet 配置轮询时重建区域文件。

有什么方法可以插入时间戳,而不将其包含在与之前状态进行比较的数据中?

答案1

不要使用模板,如果您尝试使用序列号,那么问题就是您每次都会继续进行更改。

我有两个想法:

  1. 创建一个适当的类型,可以通过标准 API 使用 DNS 更新来管理 DNS。然后让 BIND 自行执行序列号递增。
  2. 对 DNS 区域中的每个元素使用文件片段模式,并使其仅在这些元素发生更改时更新主区域文件。您可以通过执行“区域刷新”来执行此操作,该执行程序将您的部分连接到最终区域(包括标头)。大多数文件片段解决方案之间的区别在于,您从时间戳或类似的东西生成区域序列,这应该只在部分发生更改时触发,从而避免从模板中获得的不断序列号变化。

以下是一些文件碎片模式的示例:

http://projects.puppetlabs.com/projects/puppet/wiki/Generating_a_config_file_from_fragments

https://github.com/ripienaar/puppet-concat

答案2

如何使用文件的时间戳:

file { "/tmp/dafile": content = inline_template("<%= File.mtime("/tmp/dafile").to_i %>"), }

唯一的问题是,这可能会在每个客户端上运行,并且每次运行时可能会更新文件的时间戳。如果没有,它应该适合您的要求。

答案3

那么下面这个怎么样,

$utime_serial = inline_template("<%= Time.now.to_i %>")

file { "/var/named/$domain.hosts":
          content => template("named/$domain.hosts.erb"),
          owner => root,
          group => named,
          mode => 0640,
}

erb 模板文件包含:

$TTL 1D
@             IN      SOA       galaxy.example.com.  sysadmin.example.com.  (
                               <%=utime_serial %>       ; Serial
                                8H             ; Refresh
                                2H             ; Retry
                                4W             ; Expire
                                1D )           ; Minimum

答案4

我使用以下命令执行此操作:

file {"${zone['zoneName']}.db":
        name            => "/var/lib/bind/.temp/${zone['zoneName']}.db",
        ensure          => file,
        content         => template('dns/bind/zone.db.erb'),
        owner           => 'root',
        group           => 'bind',
        mode            => 'ug=r,o=',
        require         => File['/var/lib/bind/.temp'],
        notify          => Exec["updateSerial-${zone['zoneName']}"]
}

exec {"updateSerial-${zone['zoneName']}":
        command         => "/bin/sed \"s/#SERIAL#/$(/bin/date '+%s')/\" '/var/lib/bind/.temp/${zone['zoneName']}.db' > '/var/lib/bind/${zone['zoneName']}.db'",
        refreshonly     => true,
        require         => File["${zone['zoneName']}.db"],
        notify          => Service['bind']
}

模板具有#SERIAL#占位符,在创建临时文件后,会收到Exec通知,然后使用seddate用当前 unix 时间戳替换占位符,最终将文件写入正确的位置。

相关内容