我在通过与Capistrano部署兼容的Puppet设置服务器时遇到问题。 我正在使用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
指向适当的发行版。 但是,这意味着每当有人重新运行配置(例如,应用任何配置更改)时,符号链接将被重新定位到垃圾目录(如果那时甚至存在)。
有什么建议么? 我曾考虑过将供应分为应用程序供应和服务器供应,并让Capistrano在部署时执行应用程序供应,但我确实更希望保持简洁。
您应该只使用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
}
仅自己定义资源可能会阻止if ! defined(File[$docroot])
apache::vhost
模块的已if ! defined(File[$docroot])
部分正在运行。
斯图尔特
感谢您的出色回答。 我发现我必须稍作修改,以将replace => false放在“当前”目录上,而不是“当前/公共”目录上,就像这样(使用无业游民的所有者):
file {
'/home/vagrant/app/current':
ensure => directory,
replace => false,
owner => vagrant,
group => vagrant,
}