0

Capistrano デプロイメントと互換性のある Puppet を介したサーバーのプロビジョニングに問題があります。puppetlabs/apacheを使用して仮想ホストをセットアップしていますが、存在することを (正当に) チェックしていdocrootます (存在しない場合は作成し、ネストされたディレクトリの問題の可能性を無視します)。ただし、truedocrootは であり、Capistrano はデプロイ時に/var/www/vhosts/${::fqdn}/current/public適切なシンボリック リンク (からcurrentへ) を作成し、そのディレクトリ パスが事前に Puppet によって設定されている場合 (シンボリック リンクではなく実際のディレクトリであるため、および空ではない)。releases/{releasestamp}current

私は次のようなものを追加することを考えました:

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

に空のファイルを設定して、/tmp/initial/public/index.htmlCapistrano がcurrentデプロイ時に適切なリリースを参照できるようにします。ただし、これは、誰かが (たとえば、構成の変更を適用するために) プロビジョニングを再実行するたびに、シンボリック リンクがジャンク ディレクトリに再配置されることを意味します (その時点で存在していたとしても)。

助言がありますか?プロビジョニングをアプリケーション プロビジョニングとサーバー プロビジョニングに分割し、デプロイ時に Capistrano にアプリケーション プロビジョニングを実行させることを検討しましたが、これは簡潔に保ちたいと思います。

4

2 に答える 2

2

Puppetを使用してアプリケーションディレクトリを作成し、Capistanoにタスクを使用してディレクトリreleasesとディレクトリを作成させ、。を使用して新しいバージョンをデプロイするときにシンボリックリンクを配置する必要があります。sharedcap deploy:setupcurrentcap deploy

より具体的には、Puppet構成にこれを含めることをお勧めします。

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

次に、1回限りのセットアップ手順として、このタスクを実行して、Puppetが作成するはずのディレクトリ内にreleasesおよびディレクトリを作成するようにCapistranoに指示します。shared/var/www/vhosts/${::fqdn}

cap deploy:setup

その後、実行してアプリをデプロイします。これにより、シンボリックリンクcap deployが作成または更新されます。current

-n(オプションを渡して、Capistranoが実行する正確なコマンドをプレビューできることに注意してくださいcap。たとえば、実行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

スチュアート、

素晴らしい答えをありがとう。'current/public' ディレクトリではなく、'current' ディレクトリに replace => false を配置するように少し修正する必要があることがわかりました (vagrant 所有者を使用):

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