我们有一个服务器(由 Puppet 管理),每天生成一次文件。有没有一种方法可以让 Puppet 执行以下操作:
- 确认文件位于服务器 A 上
- 将其上传至 Puppet Master
- 确保其在 Puppet 管理的服务器 B 上存在
- 在服务器B上重新加载服务
我确实不太清楚识别和上传。我想我明白如何确保在服务器B上的存在并重新加载服务。
任何模式或文档都会有帮助。谢谢。
答案1
我会看看出口资源。
您可以使用自定义事实作为文件内容的来源来定义附加资源:
node servera {
@@file { "/generated/file"
ensure => present,
content => $::myspecialfilecontent
tag => myspecialfile,
}
}
并在serverb上实现资源:
node serverb {
File <<| tag == 'myspecialfile' |>> {
notify => Service["your_service"],
}
}
自定义 puppet fact 可能如下所示(将其放在 modules/.../lib/facter/myspecialfilecontent.rb 文件中并启用 pluginsync):
filename = '/generated/file'
Facter.add(:myspecialfilecontent) do
setcode do
if File.file?(filename)
File.read(filename)
end
end
end
但是你需要storeconfigs = true
(puppetdb) 来实现这一点。
这不是一个很好的解决方案,但它可以发挥作用。
答案2
我们假设您有一个适用于 puppet 管理的所有节点的通用类或节点(如默认值)。
在这里您可以创建策略来管理每天创建的文件,但仅仅是虚拟资源。
node default {
$fsufix = strftime("%y_%m_%d")
@file { "everyday_file" :
path => "/scratch/usern/file_${fsufix}",
ensure => present,
}
}
然后对于服务器A,您只需通过实现我们刚刚创建的虚拟资源来检查该文件是否存在:
node 'serverA' inherits default {
realize(File["everyday_file"])
}
此后,您希望 serverB 执行与 serverA 相同的操作,并在文件创建或修改时刷新服务:
node 'serverB' inherits default {
realize(File["everyday_file"])
service { "mysqld" :
ensure => running,
hasrestart => true,
subscribe => File ["everyday_file"],
}
}