我遇到与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
指向适当的版本。但是,这意味着每当有人重新运行该规定时(例如,应用任何配置更改),符号链接将被重定位到垃圾目录(如果它甚至存在于该点)。
有什么建议吗?我已经考虑将该规定拆分为应用程序配置和服务器配置,并让Capistrano在部署时执行应用程序配置,但我真的更喜欢保持这种简洁。
答案 0 :(得分:2)
您应该只使用Puppet创建应用程序目录,让Capistano使用releases
任务创建shared
和cap deploy:setup
目录,然后放下{{1使用current
部署新版本时的符号链接。
更具体地说,我建议在你的Puppet配置中使用它:
cap deploy
然后,作为一次性设置步骤,运行此任务以指示Capistrano在Puppet应为您创建的file { "/var/www/vhosts/${::fqdn}":
ensure => 'directory'
}
目录中创建releases
和shared
目录:< / p>
/var/www/vhosts/${::fqdn}
此后,只需运行cap deploy:setup
即可部署您的应用,这将为您创建或更新cap deploy
符号链接。
(请注意,您可以将current
选项传递给-n
以预览Capistrano将运行的确切命令。例如,cap
将显示其运行的cap -n deploy:setup
命令。)
Puppet的标准Apache模块似乎要求mkdir
存在,它使用以下内容:
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])
部分运行。
答案 1 :(得分:1)
司徒,
感谢您的回答。我发现我必须稍微修改它以放置replace =&gt;在'当前'目录中为false,而不是'current / public'目录,如此(使用vagrant所有者):
file {
'/home/vagrant/app/current':
ensure => directory,
replace => false,
owner => vagrant,
group => vagrant,
}