Scripting

自動化虛擬主機創建過程

  • March 30, 2017

直到最近,我還使用 Cpanel 或 Webmin 等工具來管理 Apache2 虛擬主機。我最近發現瞭如何在sites-available目錄下手動創建這些。

我可以一次又一次地手動執行此過程,但是當手動完成時,它包括大量的應對和粘貼、重複的字元串更改(一次用於文件名和其中的域 + tld,以及進一步的執行,例如a2ensite(見下文)。

我現在尋求自動化該過程,但我不確定在內部(在 Vhost 中)和外部(在文件名和進一步執行中)更改域 + tld 的最佳方法是什麼

這是我手動創建每個 Vhost 的方式:

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”的方法。

筆記:

  1. 我相信答案也可以為在 Nginx 伺服器塊(Nginx Sblocks)中有類似問題的人提供一個很好的方向。

GNUmake執行良好

您可以使用 GNU make1,其中創建一個新的虛擬主機就像執行一樣簡單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

添加選項:多個模板

這是最簡單的使用方法之一make。對於稍微複雜的配置,假設您有兩個(或更多)模板。我將在這裡展示一個,我稱之為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

請注意,這還有一個將新虛擬主機添加到 Makefile的附加步驟。這讓我們看看依賴make於哪個模板。然後你可以這樣做:domain.tld

cd /etc/apache2/sites-available
./update-makefile domain.tld basic.template && make

使用此設置,如果其相應的模板已更改,每個站點都將更新。

all成為第一個命名的目標很重要。這使得它在make不帶參數的情況下被呼叫時的預設值。該update-makefile腳本將新域添加為 的依賴項all,因此make如果它相對於它自己的依賴項(模板文件)過時,將重新創建它。


1是一種 工具make用於從記錄在. 在 GNU 語法中,Makefile

% :
   # do stuff

模式規則。它聲明可以將具有任何名稱 ( %) 的文件創建為目標,並且它沒有依賴關係。是# do stuff配方(任何 shell 腳本),縮進一個製表符。您可以使用一些變數來引用目標的名稱 ( $@)、第一個依賴項 ( $<) 或所有依賴項 ( $^) 等。有關詳細資訊,請參閱維基百科

您的系統可能尚未make安裝,在這種情況下,您必須自己安裝。此外,一些系統使用make. 概念是相同的,但規則的語法與 GNU 版本略有不同。

2絕對確定您使用>>的是追加而不是>覆蓋!

引用自:https://unix.stackexchange.com/questions/354222