web-dev-qa-db-ja.com

複数のサーバー構成ファイルにgitを使用する

多くのソースコードをgitに移行しており、現在のソリューションに非常に満足しています。同じシステムでサーバー設定ファイルのバージョンを管理したいのですが、希望どおりに機能しないものがいくつかあります。誰かが彼の経験をここで共有できることを願っています。

この質問は サーバー構成ファイルのリビジョン管理を使用していますか? に似ていますが、この質問の提案では機能しない特別な要件があります。

現在のセットアップでは、構成ファイルにSubversionを使用しています。対応するリポジトリは次のようになります

 /#リポジトリのルート
 +-www.domain.com/#wwwの構成
 | \-etc /
 | \-Apache2 /
 +-dev.domain.com/#dev 
の設定| +-etc /
 | \-opt /
 | \-app1/
 | \-conf /#dev 
上のapp1の設定\-staging.domain.com/#ステージングの設定

リポジトリのサブディレクトリをチェックアウトするだけで済むため、Subversionではこれで問題なく動作します。さらに、svn:externalsを使用して、いくつかの異なる構成設定の1つの共通構造を指すことができます。バージョン管理されたすべてのディレクトリにある。svnファイルを処理するだけで済みました。一方、Git svn:externalsがない および sparse checkouts では、ルートから実際のディレクトリへのパスが常に同じである必要があります。

Gitへの移行について説明するときに、サーバー構成のバージョン管理の主な要件を書き留めてみました。

  • 単一のリポジトリのみが必要です
  • 中央のリモートに変更を簡単にプッシュできるはずです
  • チェンジセットは本当の作者を含むべきです

すべての構成を1つのリポジトリーに入れて、作業コピーとしてサブパスのみを持たせる方法はありますか?現在、2つのアプローチを検討していますが、最初にこの質問をしたいと思います

  1. 。gitリポジトリが固定された場所にある場合(例: / varのどこかに、「ターゲット」作業ディレクトリからサブパスにリンクできます。主な問題:/ etcから別のディレクトリに「リンク」してコンテンツをインポートする方法を知らないファイル
  2. this SO question で別の代替案を見つけました。1つのリポジトリに複数のブランチがあることを示唆しています。これは確かに複雑さを増すでしょうが、私がこの方法を試すのを見ることができました。

構成ファイルの管理に単一のマシンでgitを使用することは問題ありませんが、私がそれを使用したい方法でそれを使用している人がいるはずだと思います。

ありがとうございました
カリーム

15
Kariem

私は以前にこのようなものを使用しました。これがどのように機能したかです。

リポジトリ設定

  1. Gitリポジトリ「etc_files」を作成します。
  2. 「server/www」、「server/dev」など、マシンタイプごとにブランチを作成します。
    • gitはブランチ名のスラッシュをサポートしています。これは、頭をまっすぐに保つのに役立ちます。
    • 十分な数のマシンがない場合は、代わりに個々のマシンごとにブランチを持つことができます。
  3. 共有インフラストラクチャの各部分にブランチを作成します。 「モジュール/ Apache」、「モジュール/カップ」など
    • これらのブランチは、/etc/resolv.confなど、すべてのマシンで同じファイルを保持するためのものです。これらは、現在「svn:externals」リポジトリに保持しているファイルです。

新しいマシンの構築

  1. 新しいマシンで、gitリポジトリを複製し、そのマシンタイプのブランチをチェックアウトします。
    • 私はこれを読み取り専用のクローンにして、テストなしで本番マシンからの変更をコミットできないようにします。
  2. 毎日自動的にリポジトリをgit pullするようにcronジョブを設定します。

マシンブランチの変更

単一のマシンブランチでコードを変更するのは簡単です。開発環境の適切なブランチをgit checkoutだけ変更し、変更を中央リポジトリにコミットします。そのブランチのすべてのマシンは、次にcronジョブが実行されるときに自動的に変更を取得します。

モジュールブランチの変更

モジュールブランチのコードの変更は、次の2つのステップからなるため、少しだけ注意が必要です。

  1. git checkout適切なモジュールブランチ
  2. 変更を加えて、中央サーバーにコミットします。
  3. git checkoutそのモジュールブランチを使用する各マシンブランチ。その後、モジュールブランチをそこにマージします。 gitは、以前にそのモジュールブランチをマージしたことがわかり、最後の共通の親以降に発生した変更にのみ気付くでしょう。

この方法には利点と欠点の両方があります。 1つの利点は、モジュールブランチに変更を加え、それを必要とするマシンブランチに適用できることです。これにより、マシンブランチは準備が整うまで古いバージョンにとどまることができません。その場合の欠点は、モジュールブランチを、それを使用している可能性がある各マシンブランチに必ずマージする必要があることです。私は、コミットツリーをトラバースし、これを自動的にマージするスクリプトを使用していますが、それでも問題が発生する可能性があります。


別の方法として、新しいバージョンのgitは " submodules "と呼ばれるものをサポートしています:

サブモジュールを使用すると、常に特定のコミットを指すソースツリーの専用サブディレクトリ内に外部リポジトリを埋め込むことができます。

これにより、「svn:externals」ツリーのようなものを少し作成でき、今と同じように更新できます。

14
Handyman5

ここでちょっとしたコツですが、ポスト受信フックが仕事をするように聞こえます

レポマスターは/ var/masterに保存されます
フックはそれを/ var/localcloneに複製します
次に、ホスト固有の詳細をコピーします
各サーバーでローカルに.git/post-receiveフックを設定する必要があります(適切な設定を使用)

また、これよりもgitよりもパペットやシェフのようなものが必要なようですが、これによりgitを実行して構成とモジュールを一元管理し、puppet\chefでデプロイと検証を管理することができます

1
Tacticus

ここに私が考えた簡単な仕事があります
1。たとえば/var/repoに中央リポジトリがあります
2。すべてのドメインにグローバルなファイルをそのディレクトリに置きます。
3。すべてのサブドメイン/var/repo/subdomain1/var/repo/subdomain2などにブランチを作成します。
4。ブランチへのプッシュがマスターとマージされるポストフックを作成します。

したがって、/var/repo/subdomain2の構成を変更すると、マスターとすぐにマージされるため、リポジトリを完全にプルしてすべての構成ファイルを取得できます
個々のサブドメイン構成をプルする場合は、適切なブランチをプルするだけです。

設定ファイルをどのように/var/repo/*に入れるかは、まったく別の問題です(cronタブ、私は考えることができます)

〜$

1
Sudhi