동일한 값으로 많은 구성 파일을 채우는 방법

동일한 값으로 많은 구성 파일을 채우는 방법

나는 많은 프로그램을 갖고 있으며 그 모든 프로그램의 구성 파일에 동일한 값이 있습니다(전부는 아니지만 대부분이 에 있습니다 /etc).

Apache, Postfix, SQL, clamAV 등의 구성 파일에 저장되는 호스트 이름이라고 가정해 보겠습니다. 때로는 해당 값을 변경해야 합니다. 지금 내가 하는 일은 해당 파일을 모두 편집하고 이전 값을 새 값으로 찾아서 바꾸는 것입니다.

한 곳에서 변경하고 해당 파일을 모두 올바르게 설정하고 싶습니다. 나는 bash의 export변수, source명령 또는 이와 유사한 것에 대해 생각했습니다. 그러나 구성 파일은 실행 가능하지 않기 때문에 작동하지 않을 것 같습니다.

권장되는 방법은 무엇입니까?

답변1

당연히 관리하려는 모든 매개변수와 해당 매개변수가 나타나는 모든 위치를 식별해야 합니다.  (Duh.)   당신은 이미 그것을 알고 있었죠.

올바른 방향으로 시작할 수 있는 접근 방식은 다음과 같습니다.

  1. 구성 파일 중 하나에 절대 나타나지 않는 문자열을 선택하십시오. (그렇게 말하면 당신처럼 들리네요~ 해야 하다첫 번째 시도에서 바로 알아보세요. 그것은 사실이 아닙니다. 문자열(예: )을 선택 @@하고 나중에 파일 중 하나에서 해당 문자열을 사용해야 하는 경우 이를 수정할 수 있습니다. 이 설정을 많이 다시 실행해야 합니다.)

    예를 들어, 오래 전 Unix에는 소스 코드 제어 시스템(SCCS)이라는 버전 제어 시스템이 있었습니다. 문자열을 @(#)파일에 자연적으로 나타나지 않는 문자열로 사용했습니다. 내가 아는 한, SCCS는 더 이상(적어도 많이는) 사용되지 않으므로 안전하게 사용할 수 있습니다 @(#). 또는 !user2461440?과 같은 이름을 사용하거나 실제 이름을 사용할 수도 있습니다 . 제어 문자를 포함할 수 있습니다. 예: Ctrl+ A또는 Ctrl+ G.

  2. 매개변수 자리 표시자의 명명 규칙을 선택합니다. @(#){HOSTNAME}, , 등과 같이 간단하고 간단한 것일 수 있습니다 @(#){IP}.@(#){GATEWAY}

  3. 등과 같은 모든 구성 파일의 템플릿 버전을 만듭니다. apache.template해당 템플릿을 편집하여 조작하려는 매개변수의 모든 항목을 해당 매개변수 자리 표시자(이전 단락의)로 바꿉니다. ./root

  4. 다음과 같은 스크립트를 작성하세요.

    HOST=Zanzibar
    IP=10.11.12.42
    LOG=/var/log/lumber
    
    fullpath[apache]=/etc/apache.conf
    fullpath[postfix]=/etc/postfix/configuration
    
    for file in apache postfix …
    do
        path=${fullpath[$file]}
        sed -e "s/@(#){HOSTNAME}/$HOST/g" \
            -e "s/@(#){IP}/$IP/g" \
            -e "s|@(#){LOG}|$LOG|g" \
            "$file.template" > "$path.new"  &&
            mv "$path" "$path.bak"          &&
            mv "$path.new" "$path"
    done
    

    값에 s가 포함되어 있으므로 @(#){LOG}with로 바꾸는 하위 명령은 $LOG 다른 구분 기호( |)를 사용합니다 . 따라서 문자열에는 이 구분 기호( )가 포함되어서는 안 됩니다. (물론 표준( ) 구분 기호를 포함해서는 안 됩니다.)$LOG/@(#)|/

  5. 배열(예: fullpath[apache])은 모든 셸에서 작동하지 않습니다. 배열을 지원하는 bash나 다른 셸이 없는 경우 배열을 시뮬레이션하거나 해결하도록 스크립트를 조정해야 합니다.

  6. 파일의 시스템 속성을 올바르게 설정하려면 스크립트에 chown및 명령을 추가해야 할 수도 있습니다 . chmod아니면 정말이라면정말스크립트가 올바르게 작동하는지 확인하고 다음과 같이 스크립트를 수정하여 해당 위치에 있는 파일을 덮어쓸 수 있습니다.

        sed  …      > "$path"
    

    따라서 inode와 해당 속성을 유지하고 mv명령이나 .new.bak파일을 사용하지 않습니다.

  7. 자동화하기로 선택한 매개변수 중 하나를 변경하려면 HOST=Wonderland스크립트 시작 부분에서 해당 지정 문(예: )을 편집하세요. 스크립트를 편집할 필요가 없으면 스크립트를 두 개의 파일로 나눕니다. 하나는 매개변수 값( HOST=…, IP=…등…)을 포함하고 다른 하나는 모든 구성 파일 처리를 수행합니다. 두 번째 스크립트는 source첫 번째 스크립트에서 매개변수 값을 가져옵니다. 이렇게 하면 매개변수 값이 변경될 때 기본 스크립트가 아닌 해당 값이 포함된 (스크립트) 파일만 편집하면 됩니다.

  8. 다음에 매개변수화 스크립트를 실행할 때 해당 변경 사항을 덮어쓰게 되므로 해당 위치에서 파일을 수동으로 편집하지 마십시오. 대신 해당 템플릿 파일을 편집하고 스크립트를 다시 실행하십시오. 이를 상기시키기 위해 파일에 주석을 추가할 수도 있습니다. (그 중 하나만 영향을 미치는 변경 사항에 대해 모든 구성 파일을 다시 생성하는 아이디어가 마음에 들지 않으면 선택한 파일만 다시 생성하는 기능을 갖도록 스크립트를 수정할 수 있습니다.)

관련 정보