我的传统是在修改时将所有区域序列设置为时间戳。 既然Puppet是我的新宗教,我想从导出的资源构build区域文件时设置连续的时间戳。 一个有点琐碎的例子可能是这样的:
file { "/tmp/dafile": content = inline_template("<%= Time.now.to_i %>"), }
这种方法的问题是,内容将始终不同,这将(最终)在每个木偶configuration轮询上引发区域文件的重build。
有没有什么办法可以插入一个时间戳,而不包含在与以前的状态进行比较的数据中?
不要使用模板,如果您尝试使用序列号,那么您每次都要继续进行更改。
我有两个想法:
这里有一些文件片段模式的例子:
http://projects.puppetlabs.com/projects/puppet/wiki/Generating_a_config_file_from_fragments
如何使用文件的时间戳:
file { "/tmp/dafile": content = inline_template("<%= File.mtime("/tmp/dafile").to_i %>"), }
唯一可能的是,这可能会在每个客户端上运行,并且可能会更新每次运行文件的时间戳。 如果没有,它应该适合您的要求。
以下情况如何,
$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
你可以在puppet内部运行外部命令(我正在使用cfengine,不知道puppet)这个/bin/date '+%Y%m%d00'
什么/bin/date '+%Y%m%d00'
我使用以下来执行此操作:
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#
作为占位符,在创build临时文件之后,会通知Exec
,然后使用sed
和date
将占位符replace为当前的unix时间戳,最后将文件写入正确的位置。
我倾向于使用声明主机条目的清单或hiera文件的修改时间,并将其转换为串行的合适时间戳。 (如果文件被分割成多个文件,你也可以使用最新的文件,或者是最近一次更改的时间戳,如果是通过数据库等其他途径的话)
不幸的是,最大的序列号是一个32位的无符号整数,所以你只能使用最多2147483647的数字。不幸的是, 这不允许我们简单地使用秒以来的序列号作为序列号 。 相反,默认格式是使用YYYYMMDDxx,但是如果您已经将它设置为同一date,则需要将当前序列号作为状态。
作为一种替代方法,不需要您读取文件并增加数字,我使用以下内联模板:
$serial_mtime_file = '/etc/puppetlabs/code/environments/production/site/profile/manifests/dns_dhcp_pxe.pp' $serial_secs = inline_template("<%= File.mtime(@serial_mtime_file).strftime(\"%y%j\").to_s + (File.mtime(@serial_mtime_file).to_i % 86400).to_s %>") notify { "Created magical serial number ${serial_secs}": } validate_numeric($serial_secs)
这会得到一个YYDDDsssss格式(2位数年份,3位数的日历,5位数的第二个日历),这将工作到2099年(如果你从2000年开始,如上所述),并允许每秒更新一次直到那时。 这允许使用这个variables作为你想要用来创build绑定configuration的任何现有模块的参数,而不需要一个你可以从中读回现有序列的模板。
所以,如果你有一些创意,你可以从那里设置序列号:)
我已经使用camptocamp / bind puppetforge模块的上面,这个工作正常