Chef/puppet 是管理单个主机配置的绝佳工具,但当配置在主机之间具有依赖关系时,它们似乎会略有不足。例如,我希望有一个 Web 服务器配置尝试启动应用程序,但前提是数据库已经启动(在另一台主机上)。是否有一些类似的工具允许指定跨主机的配置,或者是否有一些额外的 chef 或 puppet 功能可以实现这一点?
答案1
您可以做的一件事是从数据库主机导出应用程序资源。它不会保证数据库正在运行,但话又说回来,什么也不会发生。毕竟,数据库之后可能会停止,而 Puppet 直到下次运行时才会知道这件事。
无论如何,它看起来像这样:
node 'database' {
service { 'mysql': ensure => running }
@@apache2::app { 'myapp':
ensure => running,
tag => 'appserver',
}
}
node 'appserver' {
Apache2::App <<| tag == "$hostname" |>>
}
如果你将它与戴维的建议,您可以进一步将启动应用程序与数据库测试联系起来:
@@apache2::app { 'myapp':
ensure => running,
dbtest => "$fqdn user database --password=12345",
tag => 'appserver',
}
define apache2::app(ensure = running, dbtest = '') {
service { 'apache2':
ensure => $ensure
require => $dbtest ? {
'' => undef,
default => Exec['test database'],
},
},
exec { "mysqlaccess $dbtest":
alias => 'test database',
}
}
答案2
我认为您可以为 puppet/facter 编写一个自定义事实来执行此操作。以下是来自 puppetlabs 网站的解释:
http://projects.puppetlabs.com/projects/1/wiki/Adding_Facts
基本上,如果您可以用 ruby 编写测试,那么您就可以创建一个事实并将其部署到您的 puppet 客户端。