我的传统是将所有区域序列设置为修改时的时间戳。现在 Puppet 是我的新信仰,我想在从导出的资源构建区域文件时设置序列时间戳。一个稍微简单的例子可能如下所示:
file { "/tmp/dafile": content = inline_template("<%= Time.now.to_i %>"), }
这种方法的问题在于内容会一直不同,这将(最终)导致每次 puppet 配置轮询时重建区域文件。
有什么方法可以插入时间戳,而不将其包含在与之前状态进行比较的数据中?
答案1
不要使用模板,如果您尝试使用序列号,那么问题就是您每次都会继续进行更改。
我有两个想法:
- 创建一个适当的类型,可以通过标准 API 使用 DNS 更新来管理 DNS。然后让 BIND 自行执行序列号递增。
- 对 DNS 区域中的每个元素使用文件片段模式,并使其仅在这些元素发生更改时更新主区域文件。您可以通过执行“区域刷新”来执行此操作,该执行程序将您的部分连接到最终区域(包括标头)。大多数文件片段解决方案之间的区别在于,您从时间戳或类似的东西生成区域序列,这应该只在部分发生更改时触发,从而避免从模板中获得的不断序列号变化。
以下是一些文件碎片模式的示例:
http://projects.puppetlabs.com/projects/puppet/wiki/Generating_a_config_file_from_fragments
答案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
通知,然后使用sed
并date
用当前 unix 时间戳替换占位符,最终将文件写入正确的位置。