GNU는 make잘 돌아간다

GNU는 make잘 돌아간다

최근까지 저는 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.comd.t안에 있는 모든 항목은 가 됩니다 MyNewVhost.com.

나는 변경 가능한 작업이 트릭을 수행할 것이라고 상상하지만 틀릴 수 있습니다. 그렇다면 프로그램에 "파일 이름을 각 dt에 넣으십시오"라고 지시하는 방법이 필요합니다.

노트:

  1. 나는 이 답변이 Nginx 서버 블록(Nginx Sblocks)과 유사한 문제에 직면한 모든 사람에게 좋은 가이드를 제공할 수도 있다고 믿습니다.

답변1

GNU는 make잘 돌아간다

새로운 가상 호스트를 생성하는 것은 실행만큼 간단합니다. 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

여기에는 추가 단계가 있습니다.다음에 추가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하나의 탭으로 들여쓰기된 레시피(모든 쉘 스크립트)입니다. 변수를 사용하여 대상 이름( $@), 첫 번째 종속성( $<) 또는 모든 종속성( $^) 등을 참조할 수 있습니다 . 자세한 내용은 다음을 참조하세요.위키피디아.

시스템에 설치되어 있지 않을 수 있으며 make, 이 경우 직접 설치해야 합니다. 또한 일부 시스템에서는 make개념은 동일하지만 규칙의 구문은 GNU 버전과 약간 다릅니다.

2>> 덮어쓰지 말고 추가를 사용하십시오 >!

답변2

축하합니다. 구성 관리의 첫 번째 단계를 시작하셨습니다!

여기에는 가능한 결과가 많이 있지만 기본적으로 구성 조각의 템플릿을 만들고 해당 템플릿의 인스턴스를 만드는 것입니다.

맞습니다. 템플릿의 일부 변수는 귀하의 요구 사항에 적합합니다. 필요한 값으로 템플릿을 채우려면 일부 프로그래밍 언어(또는 간단한 셸)를 선택하기만 하면 됩니다. Make를 사용한 Fox의 대답은 좋은 짧은 예입니다. 템플릿을 업데이트하려는 경우 Makefile의 모든 사이트를 선언하여 모든 사이트를 다시 빌드하여 수정할 수 있습니다.

이것이 구성 관리의 간단한 끝입니다(나중에 많은 구성을 업데이트하려는 경우를 대비하여 템플릿을 변수로 채우는 스크립트를 유지하세요).

Puppet, Chef, Cfengine, Salt 등과 같은 구성 관리 도구는 더욱 정교해졌습니다.

이것은Puppet 및 PuppetLabs Apache 모듈을 사용하고 Hiera의 데이터로 채우는 즉시 사용 가능한 예제(변수 값의 구조화된 모음).

답변3

당신이 사용할 수있는안시푸르, 이는 진자 2템플릿에 사용되며 다른 많은 작업을 자동화할 수도 있습니다.

관련 정보