0

我在通过与 Capistrano 部署兼容的 Puppet 配置服务器时遇到问题。我正在使用puppetlabs/apache来设置我的虚拟主机,它(正确地)检查是否docroot存在(如果不存在则创建它,忽略潜在的嵌套目录问题)。然而,真正的docroot将是/var/www/vhosts/${::fqdn}/current/public,并且 Capistrano 将在部署时创建适当的符号链接(从currentreleases/{releasestamp}),并且当 Puppet 预先设置该目录路径时不高兴(由于current是实际目录,而不是符号链接,并且不为空)。

我考虑过添加类似的东西:

file { "/var/www/vhosts/${::fqdn}/current":
  ensure => 'link',
  target => '/tmp/initial'
}

并在 处设置一个空白文件/tmp/initial/public/index.html,以便 Capistrano 在部署时能够指向current适当的版本。但是,这意味着每当有人重新运行配置(例如,应用任何配置更改)时,符号链接将被重新定位到垃圾目录(如果它当时甚至存在的话)。

有什么建议么?我考虑过将配置分为应用程序配置和服务器配置,并让 Capistrano 在部署时执行应用程序配置,但我真的更希望保持简洁。

4

2 回答 2

2

您应该只使用 Puppet 创建应用程序目录,并让 Capistano负责使用任务创建releases和目录,并在使用.sharedcap deploy:setupcurrentcap deploy

更具体地说,我建议在您的 Puppet 配置中使用它:

file { "/var/www/vhosts/${::fqdn}":
  ensure => 'directory'
}

然后,作为一次性设置步骤,运行此任务以指示 Capistrano在Puppet 应该为您创建的目录中创建releasesshared目录:/var/www/vhosts/${::fqdn}

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运行。

于 2013-03-04T00:32:25.000 回答
1

斯图尔特,

感谢您的出色回答。我发现我必须稍微修改一下,将 replace => false 放在“当前”目录上,而不是“当前/公共”目录上,就像这样(使用 vagrant 所有者):

file {
  '/home/vagrant/app/current':
    ensure => directory,
    replace => false,
    owner  => vagrant,
    group  => vagrant,
 }
于 2014-03-28T22:31:18.417 回答