메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

시스템 관리용 오픈 소스 패키지 톱 5: 제5편 Cfengine

한빛미디어

|

2003-08-18

|

by HANBIT

17,199

저자: 『시스템 관리의 핵심, 개정3판』의 저자 아일린 프리시/『시스템 관리의 핵심, 개정3판』의 역자 홍상욱 역

본 기사는 가장 유용하고 널리 사용되고 있는 오픈 소스 관리 툴을 소개하는 5부작 시리즈 기사 중에 마지막 기사이다. 어떠한 유닉스 운영체제를 사용하고 있든지 이와 같은 툴을 사용하면 작업이 한결 수월해진다.

그동안 소개한 기사는 다음과 같다. 1위: Cfengine

필자가 권장하는 다섯 가지 툴 중에 최고의 영예는 마크 버제스 (Mark Burgess)가 작성한 Cfengine에게 돌아갔다. Cfengine은 유닉스 컴퓨터 시스템 설정 및 유지보수를 환상적으로 해주는 유용한 툴이다. Cfengine은 독립형(stand-alone) 도구모음으로 설정 파일에 있는 명령에 따라 컴퓨터를 설정하고 관리한다. 설정 파일은 습득해서 사용하기 쉬운 고급 언어로 다양한 시스템 컴포넌트에 적합한 속성을 정의하고 있다(프로그래밍은 하지 않아도 됨). 이런 방식으로 Cfengine은 각각의 시스템을 정의된 설정 스펙에 맞게 자동으로 여러 시스템을 설정해 줄 수 있다. 또한, 계속해서 시스템을 감시하면서 필요에 따라 설정을 조절해주도록 할 수도 있다.

Cfengine으로 할 수 있는 작업

아래 목록은 Cfengine에서 자동으로 할 수 있는 관리 및 설정 작업을 나열한 것이다. 더 구체적으로 Cfengine의 기능을 엿볼 수 있을 것이다.
  • 네트워크 인터페이스 설정
  • 시스템 설정 파일 및 기타 텍스트 파일 편집
  • 상징적 링크 생성
  • 파일 권한과 소유자 점검 및 수정
  • 불필요한 파일 삭제
  • 선택된 파일 압축
  • 정확하고 안전한 방식으로 네트워크에서 파일 배포
  • 자동으로 NFS 파일 시스템 마운트
  • 주요 파일 및 파일 시스템 존재 여부와 무결성 확인
  • 명령어 및 스크립트 실행
  • 프로세스 관리
  • 보안관련 패치 및 유사한 수정사항 적용
Cfengine 홈페이지는 www.cfengine.org로 다음과 같은 컴포넌트를 포함하고 있다.

프로그램 용도
cfagent 로컬 시스템에 설정 파일을 적용하는 주요 유틸리티
cfrun 리모트 시스템에 설정 파일을 적용하는 유틸리티
cfservd cfrun을 지원하는 서버 프로세스. 리모트 시스템으로부터 Cfengine 에이전트 기능을 사용할 수 있게 해줌.
cfexecd 작업 스케쥴링 및 보고 등을 자동화 해주는 데몬
cfenvd 문제 감지 데몬
cfkey 보안 키 생성 유틸리티


Cfengine은 다양한 설정 파일을 사용한다(일반적으로 /var/cfengine/inputs에 저장되어 있음). 주요 설정 파일은 cfagent.conf로서 Cfengine이 유지보수 할 시스템의 특성이 정의되어 있다. 일반적으로 cfagent.conf에는 시스템의 최종 상태만이 정의되어 있고 중간 과정은 구체적으로 설명되어 있지 않다.


시스템 관리의 핵심, 개정 3판

참고 도서

시스템 관리의 핵심, 개정 3판
에일린 프리시, 홍상욱 역




Cfengine 설정

이 파일을 이해하는 가장 좋은 방법은 간단한 예제 파일을 살펴보는 것이다.
control:
   domain = ( ahania.com )            로컬 도메인 지정
   access = ( chavez root )           cfagent를 실행할 수 있는 사용자
   actionsequence = ( links tidy )    수행할 작업 (순서대로)
   maxage = ( 7 )                     나중에 사용할 변수 정의
   
   groups:                            호스트 목록 정의
   HaveNoBin = ( blake yeats bogan toi robin )
tidy:                                 작업: 불필요한 파일 삭제
   /tmp pattern=* age=$(maxage) recurse=inf
   /home pattern=*~ recurse=inf
links:                                작업: 상징적 링크 유지
   /logs -> /var/log                  필요에 따라서 링크 생성
   
   HaveNoBin::                        다음 링크는 이 호스트에서만 적용된다
   /bin -> /usr/bin
이 파일에는 4부분으로 구성되어 있으며 각각은 키워드, 콜론으로 시작된다. 첫번째 control은 파일의 일반적인 설정, 변수 정의, 기타 용도 등을 지정하는데 사용된다. 여기서는 이 파일을 입력으로 cfagent를 실행할 수 있는 사용자 목록, 파일을 호출 했을 때 수행할 작업 순서, maxage 변수 등을 정의하고 이 변수의 값을 7로 지정했다.

변수값을 지정할 때는 예제에서와 마찬가지로 괄호 안에 묶어서 지정해주면 된다.

name = ( value )
작업은 Cfengine이 수행할 수 있는 작업으로서 키워드로 지정하면 된다. 여기서는 tidy 작업을 먼저 수행하고 links 작업을 수행하도록 했다. 각각 사용된 작업은 설정 파일에 정의되어 있어야 한다.

다음 부분인 groupsHaveNoBin이라는 집단을 정의하고 있다. 이 목록은 links 부분에서 사용된다.

다음 부분은 tidy 작업으로서 Cfengine이 제거할 불필요한 파일을 지정하고 있다. 이 부분의 엔트리는 일반적으로 다음과 같은 구문을 지닌다.

start-dir [pattern=regexp] [recurse=n] options
여기서 start-dir은 검색을 시작할 디렉토리, regexp는 지우고자 하는 파일명을 지정하는 정규 표현식, n은 어디까지 검색을 할지(inf는 무제한), options는 파일을 선택할 때 사용되는 추가 옵션을 의미한다.

위 예제에서, /home 디렉토리 하위에 있는 파일로서 (마침표로 시작되지 않고) 틸드 (~) 로 끝나는 파일 (emacs 백업 파일), /tmp에 있는 파일 중에 적어도 일주일 전에 변경된 파일 등을 선택하고 있다. 여기서 age 옵션 파라미터는 maxage 변수를 사용해서 지정했다.

파일에서 마지막 부분은 links로서 Cfengine에서 유지보수 할 상징적 링크를 지정하고 있다. 여기서는 다음과 같은 형식으로 두 개의 링크를 나열했다.

link -> target
예제에서는 /var/log 디렉토리가 /logs로 연결되어 있어야 하고 /usr/bin 디렉토리가 /bin으로 링크되어 있어야 한다고 했다. 실행하면 Cfengine은 링크가 있는지 확인하고 없을 경우 만들어 준다. 그러나 후자의 링크는 HaveNoBin 목록에 있는 호스트에서만 적용된다. 이것은 클래스 지정(2개의 콜론 사용)으로 링크 정의를 앞세움으로써 가능하다. 여기서는 클래스가 호스트 집단 이름이었지만 보다 복잡한 클래스를 사용할 수도 있다.

작업에 대해서

다음 도표는 주요 Cfengine 작업을 나열한 것이다.

작업 용도
links 상징적 혹은 하드 링크를 유지, 보수
tidy 불필요한 파일 삭제
files 파일 소유자, 권한, 수정 시간 등을 점검 혹은 설정
directories 디렉토리 소유자 및 권한 설정
disks 파일 시스템을 사용할 수 있는지, 남아있는 공간이 충분한지 확인
disable 불필요한 파일을 name.cfengine으로 이름 변경
copy 로컬 또는 리모트 파일을 로컬 시스템으로 복사
editfiles 아스키 텍스트 파일 편집
binservers
mailserver
homeservers
자동 NFS 파일 시스템 마운트에 사용되는 서버를 지정
mountables NFS로 마운트 할 수 있는 로컬 파일 시스템 지정
miscmounts
unmount
Cfengine에서 마운트하거나 언마운트 할 파일 시스템 지정
processes 프로세스가 존재하는지 확인하고 제어
interfaces 네트워크 인터페이스 속성 지정
resolve /etc/resolv.conf 유지보수
defaultroute 디폴트 게이트웨이 지정
shellcommands 임의의 셸 명령어 수행
module:name 추가 모듈 사용


다음은 약간 더 복잡한 tidy 예제이다.
control:
   split = ( " " )
   dirlist = ( tmp var/tmp 1/scratch 2/scratch )
tidy:
   /$(dirlist) pattern=* age=3 recurse=inf
control 부분에서는 목록의 항목을 분리하는데 사용되는 문자를 정의하고 나서 4개의 디렉토리를 포함하고 있는 dirlist 변수를 정의한다. 이 변수는 tidy에서 사용되며 지정된 3가지 옵션은 디렉토리에 차례대로 적용된다.

files 작업은 파일의 원하는 속성과 수정 작업을 지정하는데 사용된다. 다음은 활용 예제다.
files:
   /etc/security mode=600 owner=root group=0 recurse=inf action=fixall
   /home recurse=inf include=*.dat action=compress
   /var/log/messages owner=root mode=644 action=create
첫번째 엔트리는 /etc/security 디렉토리 및 그 밑에 있는 모든 파일과 디렉토리 등의 소유자와 권한을 지정하고 있다. 디폴트로 Cfengine은 현재 설정을 점검한다. 그러나 cction=fixall 옵션을 지정하면 필요에 따라 현재 설정을 원하는 상태로 수정해준다. 두번째 엔트리는 /home 디렉토리 밑에 있는 확장자가 .dat인 파일을 압축하도록 한다. 세번째 엔트리는 /var/log/messages 파일이 없을 경우 생성하도록 한다.

files 작업은 /usr/bin 디렉토리에 있는 시스템 실행 파일의 무결성을 점검하는데 사용할 수도 있다.
control:
   ChecksumDatabase = ( /usr/local/admin/cfengine/cksums )
files:
   /usr/bin checksum=md5 exclude=*.sav action=warnall
control 부분에서는 점검할 파일의 정확한 체크썸을 저장하는데 사용될 데이터베이스를 지정하고 files 엔트리에 checksum 옵션은 파일을 체크썸을 비교하도록 한다. 체크썸이 틀렸을 경우 경고 메시지가 표시된다.

disable 작업은 시스템에 있어서는 안 되는 파일의 이름을 변경하게 한다.
disable:
   /etc/hosts.equiv 
   home/.rhosts inform=true
   /var/log/messages rotate=6
첫번째 두 엔트리는 파일이 있으면 .cfengine 확장자를 추가한 이름으로 변경해준다. 두번째 엔트리에서는 특수 디렉토리 키워드 home을 사용해서 모든 사용자 홈 디렉토리를 지칭한다. 게다가 그러한 파일이 발견되면 경고 메시지가 표시된다.

세번째 엔트리는 disable 부분에 또 다른 사용법을 보여주고 있다. 즉, 로그 파일 회전이다. 이 엔트리는 /var/log/messages 파일을 6개 유지하도록 한다. 다른 로그 회전 시설과 마찬가지로 유지되는 파일은 확장자가 .1에서 .6까지다.

마지막으로 processes 작업은 주요 프로세스가 실행중인지 점검하고 필요에 따라서 재시작하고 신호를 보낼 수 있게 해준다.
processes:
   "sendmail" restart "/usr/sbin/sendmail" useshell=false inform=true
   "inetd" signal=hup
   "kudzu" signal=kill
   "g02" matches <=2 signal=suspend action=bymatch inform=true
각 엔트리에서 첫번째 필드는 ps 명령어 출력에서 검색할 패턴을 지정하고 있다. 대개 Cfengine은 각 엔트리에 해당사항을 각각의 프로세스에 적용한다.

첫번째 엔트리는 sendmail 데몬이 실행중인지 확인하는데 사용된다. 실행중이지 않으면 지정된 명령어를 사용해서 시작하게 해준다.

그 다음 두 엔트리는 inetd, kudzu 프로세스가 실행중일 경우 보낼 신호를 지정한다.

마지막 엔트리는 "g02" 문자열을 포함하고 있는 프로세스를 검색해서 개수를 센다. 이 엔트리는 시스템에 그러한 프로세스가 3개 이상 있으면 안된다고 지정하는 것이다. action=bymatch 옵션은 다른 옵션의 지시에 따라 조건에 맞게 상황을 수정해 주도록 한다. 이 경우, 그러한 프로세스가 3개 이상 있을 경우(즉, matches=<2가 아닐 경우)에는 모든 프로세스를 일시 중단 (signal=suspend) 하고 이 사실을 알리는 메시지를 화면에 표시한다.

여러 시스템에서 설정 파일 사용: 클래스

Cfengine은 여러 시스템에 대해서 하나의 설정 파일을 사용할 수 있게 해준다. 클래스는 설정 파일의 일부를 조건적으로 Cfengine이 실행되는 환경에 따라 적용될 수 있도록 해준다.

Cfengine 클래스는 다음과 같은 콤포넌트로 구성되어 있다.
  • 운영체제 키워드: hpux, aix, solaris, freebsd, linux, osf, NT. cfanget -p -v 명령어로 키워드 확인 가능
  • 호스트명
  • 호스트 집단 이름 (groups 부분에 정의되어 있는 이름)
  • 요일
  • Hrn 형식의 시간: Hr14는 오후 2시를 뜻함
  • Minnn 형식으로 분: Min33은 33분을 의미
  • Minn_n+5 형식으로 5분 간격: Min00_05는 0-5분 사이를 의미. 여기서 n은 5의 배수
  • Qn 형식으로 15분 단위: Q2는 15분에서 30분을 의미. 시간과 함께 사용해서 보다 구체적인 시간을 지정할 수도 있다. 예: Hr02_Q3은 오후 2:30-2:44을 의미.
  • Dayn 형식으로 날짜: Day1은 1일을 의미
  • Yrnnnn 형식으로 년도: Yr2004는 2004년을 의미
  • 로컬에서 정의된 클래스 이름. 예를 들어,
    control: addclasses = ( myclass )
디폴트 클래스는 any로서 임의의 호스트, 임의의 시간을 의미한다. 시간이나 날짜를 지정하지 않았을 경우에 디폴트는 all이다. 여러 클래스는 마침표 (AND 연산), 수직바 (OR 연산) 등으로 묶어 줄 수 있으며, 괄호로 묶여 있지 않을 경우엔 AND가 OR보다 우선적으로 적용된다. 날짜 및 시간 클래스는 Cfengine이 시작된 시간에 따라서 적용된다.

다음은 예제를 보여주고 있다.

클래스 정의 의미
solaris.Monday.Hr01:: 솔라리스 시스템. 월요일 새벽 1시
aix|hp-ux:: AIX, HP-UX 시스템.
aix.!vader:: 호스트 vader를 제외한 AIX 시스템.
December.Day31.Friday:: 12월 31일이 금요일일 경우


다음은 Cfengine 클래스를 사용하는 copy 부분 예제다.
copy:
   linux:: 
      $(masteretc)/rc.config dest=/etc/rc.config o=root mode=644
   ShadowHosts::
      $(masteretc)/passwd server=$(pwdmaster) dest=/etc/passwd 
         owner=0 group=0 mode=644 trustkey=true
      $(masteretc)/shadow server=$(pwdmaster) dest=/etc/shadow 
         owner=0 group=0 mode=600 trustkey=true encrypt=true
첫번째 copy 작업은 리눅스 시스템에서만 적용되는데 masteretc 변수로 지정되어 있는 위치에 있는 rc.config 파일을 /etc로 복사하고 지정된 소유자 및 권한으로 설정해준다. (masteretc 변수는 설정 파일에 다른 부분에 정의되어 있다.)

두번째 작업은 ShadowHosts 호스트 집단에 적용되고 copy 지시문이 두 개 있다. 리모트 호스트에 있는 마스터본으로 /etc/passwd, /etc/shadow 파일 등을 업데이트하고 소유자 및 권한을 알맞게 조절해준다. 두 경우 모두 copy 작업은 신뢰되는 키 보안 방식을 사용해서 이루어지고 (데이터가 실제로 문제 없는 것인지 확인하기 위해서 그렇게 함), 쉐도우 암호 파일은 암호화 되어서 전송된다. 신뢰되는 키는 cfkey 유틸리티를 이용해서 작성할 수 있으며 이러한 기능을 사용하기 전에 우선 실행부터 해야 한다.

여기서는 Cfengine의 아주 기본적인 기능만 살펴봤다. 더 자세한 정보를 알고 싶다면 다음을 참조하기 바란다. 아일린 프리시는 VMS, 유닉스, 맥킨토시, 윈도우 시스템 등의 다양한 시스템을 20여년간 관리해 왔다. 이 기사를 재미있게 읽어보았고 무료 ESA3 전단지를 받아 보고 싶다면 http://www.aeleen.com/esa3_news.htm에서 등록하면 된다. 또한, 최근 출간된 『System Administration Pocket Reference』도 훌륭한 참고 서적이다.
TAG :
댓글 입력
자료실

최근 본 상품0