我在通过Puppet提供与Capistrano部署兼容的服务器时遇到了问题。我正在使用puppetlabs/apache设置我的虚拟主机,并且它(正确地)检查docroot是否存在(如果不存在,则创建它,忽略潜在的嵌套目录问题)。然而,真正的docroot将是/var/www/vhosts/${::fqdn}/current/public,并且Capistrano将在部署时创建适当的符号链接(从current到releases/{releasestamp}),并且当Puppet预先设置该目录路径时(由于current是实际的目录,而不是符号链接,并且不是空的)。
我曾经想过添加一些类似这样的东西:
file { "/var/www/vhosts/${::fqdn}/current":
ensure => 'link',
target => '/tmp/initial'
}并在/tmp/initial/public/index.html上设置一个空白文件,以便Capistrano能够在部署时将current指向适当的版本。然而,这意味着每当有人重新运行该配置时(例如,为了应用任何配置更改),symlink将被重新定位到垃圾目录(如果当时它甚至存在的话)。
有什么建议吗?我已经考虑过将供应拆分为应用程序供应和服务器供应,并在部署时让Capistrano执行应用程序供应,但我真的更喜欢保持简明。
发布于 2013-03-04 08:32:25
您只需使用Puppet创建应用程序目录,并让Capistano负责使用cap deploy:setup任务创建releases和shared目录,并在使用cap deploy部署新版本时设置current符号链接。
更具体地说,我建议在您的Puppet配置中包含以下内容:
file { "/var/www/vhosts/${::fqdn}":
ensure => 'directory'
}然后,作为一次性设置步骤,运行此任务来指示Capistrano在Puppet应该为您创建的/var/www/vhosts/${::fqdn}目录中创建releases和shared目录:
cap deploy:setup然后,只需运行cap deploy来部署您的应用程序,这将为您创建或更新current符号链接。
(请注意,您可以将-n选项传递给cap以预览Capistrano将运行的确切命令,例如,cap -n deploy:setup将显示它运行的mkdir命令。)
已更新
Puppet的标准Apache模块似乎需要存在docroot,它使用以下代码实现:
# This ensures that the docroot exists
# But enables it to be specified across multiple vhost resources
if ! defined(File[$docroot]) {
file { $docroot:
ensure => directory,
owner => $docroot_owner,
group => $docroot_group,
}
}但您可以使用以下命令禁用该功能:
file { "/var/www/vhosts/${::fqdn}/current/public":
ensure => directory,
replace => false, # don't replace the directory once Capistrano makes it a symlink
}仅仅自己定义资源可能会阻止apache::vhost模块的if ! defined(File[$docroot])部分运行。
发布于 2014-03-29 06:31:18
斯图尔特
谢谢你的精彩回答。我发现我必须稍微修改它,将替换公共错误放在‘当前’目录中,而不是‘当前/ =>’目录中,如下所示(使用一个流浪汉所有者):
file {
'/home/vagrant/app/current':
ensure => directory,
replace => false,
owner => vagrant,
group => vagrant,
}https://stackoverflow.com/questions/15167751
复制相似问题