最近まで、私はCpanelやWebminなどのツールを使用してApache2仮想ホストを管理しました。最近、sites-available
ディレクトリの下に手動で作成する方法が見つかりました。
このプロセスは手動で繰り返すことができますが、手動で実行する場合は、コピーと貼り付けの多く、繰り返し文字列の変更(ファイル名とドメイン+ tldに対して一度、そして次の追加実行)が必要ですa2ensite
(以下参照)。
これでプロセスを自動化しようとしていますが、ドメイン+ tldを内部的に(仮想ホスト上で)、外部的に(ファイル名と追加の実行で)変更する最善の方法は何であるかわかりません。
各仮想ホストを手動で作成する方法は次のとおりです。
1. Copy a ready Vhost template file (I have such a file which I name `d.t` and I clone it whenever I need to create a new Vhost):
<VirtualHost *:80>
DocumentRoot "/var/www/html/d.t"
ServerName www.d.t
<Directory "/var/www/html/d.t">
Options +SymLinksIfOwnerMatch
Require all granted
</Directory>
ServerAlias www.d.t
</VirtualHost>
3. Search and replace "d.t", with domain+tld:
Do in nano.
4. Replace filename (d.t) with domain+tld:
mv /etc/apache2/sites-available/d.t /etc/apache2/sites-available/domain.tld
5. Enable domain.tld.conf & restart the Apache service:
a2ensite domain.tld.conf && systemctl restart apache2.service
これは簡単に思えるかもしれませんが、手動ファイルでこのアルゴリズムを手動で実行すると、各例(dtなど)を関連ドメイン+ tldに再構築するのに時間がかかることがあります。
私の質問:
次のようにしてスクリプトを実行する方法を探しています。このスクリプトは実際には非常によく似ていますが、このスクリプトではd.t
スクリプトのファイル名が置き換えられます。たとえば、スクリプトのファイル名がある場合、MyNewVhost.com
そのd.t
中のすべての項目はになりますMyNewVhost.com
。
私は変更可能な操作がトリックを実行すると想像していますが、間違っている可能性があります。その場合は、プログラムに「ファイル名を各dtに入れてください」と指示する方法が必要です。
メモ:
- 私は、この回答がNginxサーバーブロック(Nginx Sblocks)と同様の問題に直面しているすべての人に良いガイドを提供できると信じています。
答え1
GNUはmake
よく戻る
新しい仮想ホストの作成は実行と同じくらい簡単です。 GNU make
1を使用できます。make example.com
短くて簡単:静的テンプレート
まず、次の/etc/apache2/sites-available/Makefile
ものを含むパッケージを作成します。
% :
printf '%s\n' \
'<VirtualHost *:80>' \
' DocumentRoot "/var/www/html/$@"' \
' ServerName www.$@' \
' <Directory "/var/www/html/$@">' \
' Options +SymLinksIfOwnerMatch' \
' Require all granted' \
' </Directory>' \
' ServerAlias www.$@' \
'</VirtualHost>' \
> "$@"
a2ensite "$@"
systemctl restart apache2.service
各後続の行は、% :
空白ではなくタブ文字で始まります。また、これらのほとんどは実際にはテンプレートファイルd.t
ですが$@
。
その後、次の新しい仮想ホストを作成できますdomain.tld
。
cd /etc/apache2/sites-available
make domain.tld
追加されたオプション:複数のテンプレート
これはそれを使用する最も簡単な方法の1つですmake
。やや複雑な構成では、2つ以上のテンプレートがあるとします。ここでbasic.template
私が呼ぶパターンを見てみましょう。
<VirtualHost *:80>
DocumentRoot "/var/www/html/$domain$"
ServerName www.$domain$
<Directory "/var/www/html/$domain$">
Options +SymLinksIfOwnerMatch
Require all granted
</Directory>
ServerAlias www.$domain$
</VirtualHost>
次に、以下を修正(単純化!)しますMakefile
。
% :
sed 's/\$$domain\$$/$@/g' < "$<" > "$@"
a2ensite "$@"
systemctl restart apache2.service
.PHONY : all
all :
@true
sed
ここで秘密は、変数を予想されるドメイン名に変更することです。$domain$
さらに、私はその目的がすぐに明らかになるというPHONY
目標を追加しました。all
今すぐ仮想ホストを作成するには、次のように指定する必要があります。どの使用するテンプレートです。私にとっては、スクリプトで梱包する方が良いです。
#!/bin/sh
# File update-makefile
# Call as:
# ./update-makefile domain.tld basic.template
sed '/^all :/s/$/ '"$1"'/' < Makefile > Makefile.new
printf '%s\n' "$1 : $2" >> Makefile.new
mv Makefile.new Makefile
これには追加のステップがあります。次へ追加2. Makefileに新しい仮想ホストを作成します。これにより、make
どのテンプレートが存在するかを確認できます。domain.tld
頼る存在する。これにより、次のことができます。
cd /etc/apache2/sites-available
./update-makefile domain.tld basic.template && make
この設定では、すべてそのテンプレートが変更されると、サイトが更新されます。
all
なることが重要です最初ターゲットの名前を指定します。これはmake
引数なしで呼び出されるとデフォルト値になります。スクリプトupdate-makefile
は新しいドメインを依存関係として追加するため、all
独自のmake
依存関係(テンプレートファイル)と比較して使用されなくなった場合に再生成されます。
1は make
作成のためのツールです。宛先ファイルグループ内レシピそして依存関係に文書化されていますMakefile
。
% :
# do stuff
はパターンルール。任意の名前()を持つファイルをターゲット%
として生成でき、依存関係がないことを示します。以下は、# do stuff
1つのタブにインデントされたレシピ(すべてのシェルスクリプト)です。変数を使用して、ターゲット名($@
)、最初の依存関係($<
)、またはすべての依存関係($^
)などを参照できます。詳細については、次を参照してください。ウィキペディア。
システムにインストールされていない可能性があります。make
その場合は直接インストールする必要があります。また、一部のシステムではmake
概念は同じですが、ルールの構文はGNUバージョンとは若干異なります。
2>>
上書きしないで追加を使用してください>
。
答え2
おめでとうございます。構成管理の最初のステップを開始しました!
これには多くの可能な結果がありますが、基本的に構成フラグメントのテンプレートを作成し、そのテンプレートのインスタンスを作成します。
そうですね。テンプレートの一部の変数は、お客様の要件に適しています。必要な値でテンプレートを入力するには、いくつかのプログラミング言語(または単純なシェル)を選択するだけです。 Makeを使ったFoxの答えは良い短い例です。テンプレートを更新したい場合は、Makefileのすべてのサイトを宣言してすべてのサイトを再構築して変更できます。
これは構成管理の簡単な終わりです(後で多くの構成を更新したい場合に備えて、テンプレートを変数で埋めるスクリプトを維持してください)。
Puppet、Chef、Cfengine、Saltなどの構成管理ツールはさらに洗練されています。
これはPuppet および PuppetLabs Apache モジュールを使用して Hiera のデータで埋める即時使用可能な例(変数値の構造化されたコレクション)。