Tech Info - 리눅스 관리
상태바
Tech Info - 리눅스 관리
  • 승인 2005.08.24 00:00
  • 댓글 0
이 기사를 공유합니다

저렴하고 편리한 오픈소스 툴
환경에 맞는 툴 선택이 관건 …클러스터SSH·rsync·cfengine 등 인기

리눅스 기계를 업그레이드하고 장애 관리하는 데는 큰 돈을 들일 필요가 없다. 많은 무료 오픈소스 툴들이 서버와 워크스테이션을 중앙 관리해 줄 것이기 때문이다. 열쇠는 환경에 맞는 적절한 툴을 선택하는 것이며, 이제 그 방법을 소개하기로 한다.

다중 리눅스 기계를 관리하고 있다면 새로운 애플리케이션이나 운영시스템 릴리즈를 업데이트하거나 장애관리하기가 쉽지 않을 수 있다. 하지만 적절한 툴만 있으면(간단한 렌치 같은 것이든 가상 엔진 잭이든) 리눅스 관리는 많은 수고나 예산을 들일 필요가 없다.
리눅스 기계를 업데이트하는 가장 간단하고 인기 있는 방식은 기계의 긴 체크리스트가 있는 오래된 클립보드다. 각각의 기계에 로그온해서 적절한 작업을 수행하고 이것을 목록에서 제외시키는 방식이지만 이런 방식은 시간 소모적이기도 하고 실수가 있을 가능성도 높다.
레드햇 네트워크(Red Hat Network)나 노벨의 젠웍스 리눅스 매니지먼트(ZENworks Linux Management)와 같은 상용 리눅스 관리 제품들은 한 단계 높은 수준으로, 시스템 업데이트와 구성 관리 능력을 제공한다. 이러한 툴은 이 업체의 제품들만 사용할 경우 매우 좋지만 그만한 댓가가 따른다. 레드햇 네트웍스(고급 프로비저닝 포함)는 기계당 연간 192달러가, 노벨의 젠웍스는 기계당 연간 130달러가 든다.
대신 리눅스 시스템을 중앙 관리해 주는 많은 오픈소스 솔루션들 가운데 하나를 선택할 수도 있다. 그리고 상용 툴을 사용할 경우에도 이런 제품을 편리하게 쓸 수 있다. 리눅스 서버와 워크스테이션 관리용으로 우리가 가장 좋아하는 것은 클러스터SSH와 rsync, 그리고 cfengine으로, 이들은 리눅스나 유닉스 전용이 아니며 한 콘솔에서 여러 종류의 기계를 관리할 수 있게 해준다.

SSH 클러스터링
SSH(secure shell)는 리눅스 기계의 보안 원격 관리용 표준이다. 하지만 SSH만으로는 동시에 하나의 기계에만 접속할 수 있으며, 여러 기계를 관리하기 위해서는 클러스터SSH를 사용해야 한다. 클러스터SSH는 각각의 접속용 창뿐만 아니라, 각각의 SSH 접속에서의 키 입력을 동시에 반복해 주는 마스터 리피터 창(master repeater windows)을 열어서 프로세스 속도를 높여 준다.
따라서 예를 들어 huey, dewey, louie 세 대의 기계가 있으면 다음과 같이 타이핑을 하면 된다.

cssh huey dewey louie

그런 다음 클러스터SSH는 네 개의 창을 여는데, 각 호스트용으로 하나에 마지막 하나는 명령어를 입력할 수 있는 창이다. 메인 창에 입력을 하면 이 키 입력은 연결된 각각의 호스트에 자동으로 복제된다. 심지어 자신이 좋아하는 텍스트 파일 편집기를 이용해 파일을 편집하는 것 같은 복잡한 작업까지 할 수 있을 것이다.
클러스터SSH 툴은 파일 편집, 서비스 재시작, 같은 리눅스 기계 구성 등과 같은 비교적 간단한 명령어에는 매우 효과적이다. 하지만 기계에 서로 다른 구성이 있고 이것이 서로 다른 관리 작업을 필요로 할 경우에는 맞지 않을 수도 있다. 별개의 명령어를 써야 할 경우에는 키 입력을 복제할 수 없을 것이기 때문이다.
클러스터SSH는 각각의 호스트용 창을 열기 때문에, 언제건 한 번에 열 수 있는 창의 수에는 확실히 제한이 있다. 클러스터SSH는 창의 크기를 데스크톱에 맞게 조정해주지만 그 수가 많아질수록 크기는 줄어들 것이다. 한 번에 20개 이상의 컴퓨터로 클러스터SSH를 사용하자 창들의 크기는 너무 작아졌다.

rsync로 파일 동기화
동일하게 구성된 리눅스 서버와 워크스테이션이 조금 더 많을 경우에는 컴퓨터들간에 파일을 동기화해주는 rsync 같은 관리 툴을 고려해 보라.
우리는 위스콘신 매디슨의 CAE(Computer-Aided Engineering Center) 대학에 있는 기계들을 우리가 설치 이미지 서버에 저장한 공통의 이미지로 동기화를 하기 위해 rsync를 사용했다. 우리는 rsync를 이용해 /tmp, /var, 그리고 특정 커널과 장비 파일을 제외하고 명령어 랩 워크스테이션의 하드드라이브에 있는 모든 것을 동기화했다. 우리 기계는 24×7로 돌아가기 때문에 rsync는 기계 재부팅으로 사용자를 번거롭게 하지 않으면서 이들 모두의 동기성을 유지해 주고 있다.
하지만 rsync에도 몇 가지 약점은 있다. 한 서버에 대해 많은 컴퓨터가 동기화되고 있을 경우, 거의 동시에 시작되는 여러 개의 rsync 접속이 서버를 느리게 만들 수 있다. 이것은 특히 NTP(Network Time Protocol) 데몬을 이용해 모든 기계에서 시간을 동기적으로 유지할 경우 더욱 그러하다. 한 가지 신속한 처방책은 각각의 기계가 rsync 프로세스를 시작하기 전에 임의의 시간을 기다리게 하는 것이다. 예를 들어 CAE에서 우리는 자정에서 새벽 6시 사이에 rsync와 다른 밤샘 프로세스를 시작하는데, 이것은 밤시간 동안 우리 서버에서의 부하가 균등하게 되도록 보장해 준다.

cfengines 사용 방법
secure sehll, clusterssh, 그리고 rsync는 동일하게, 혹은 거의 동일하게 구성된 많은 수의 워크스테이션이 있을 때는 아주 멋지다. 하지만 리눅스 기계의 구성이 매우 다를 경우에는 오픈소스 cfengine과 같은 보다 강력한 관리 툴이 필요하다. 불행히도 더 강력하다는 것은 곧 그만큼 더 복잡하다는 뜻이기도 하다. 자동차 기계공이 가게에서 사용할 도구의 작동법을 익히느라 시간을 투자하는 것과 마찬가지로, cfengine을 배우는 데는 최소한 한 두 주의 시간을 투자해야 한다. 하지만 cfengine 관련 문서에도 나와 있듯이 일단 이것을 사용하기 시작하면 어떻게 이것이 없이 살아왔는지 상상이 되지 않을 것이다.
cfengine은 다양한 작업을 수행하는 몇 가지 프로그램들로 구성돼 있다. 우선 cfagent는 하나의 기계를 구성하는 메인 대행자로서, 파일을 바꾸고 서비스를 재시작하고 쉘 스크립트를 돌리는 등의 일을 한다. cfservd는 네트워크를 듣고 파일(cfagent와 공유하는 구성 파일 등의 파일들)을 공유할 수 있는 프로그램이다. cfexecd는 돌아갈 작업을 스케줄링하며, cfrun은 cfagent를 바로 돌리기 위해 기계 하나를 찍을 수 있다. 마지막으로 cfkey는 cfagent와 cfservd가 서로를 인증하기 위해 사용하는 공개 및 비밀키를 만들며, cfenvd는 프로세스, 네트워크 접속, 메모리, 스왑 등과 같은 이 컴퓨터의 속성들을 지속적으로 추적해 준다.
cfengine의 구성 파일에서는 매우 수준 높은 언어를 사용한다. cfagent가 취하게 될 작동을 구성하려면 기계가 구성돼야 할 방식을 리스팅하라. 예를 들어 cfengine으로 하여금 ntp 데몬 구성 파일인 ntp.conf를 관리하도록 하는 방법은 다음과 같다: 우선 nrp.conf 파일을 관리하도록 cfagent를 구성한다. ntp.conf 파일이 바뀌면 데몬을 재시작해야 하는데, 이는 cfagent가 파일을 변경시킬 경우 ntpd가 재시작돼야 하기 때문이다. cfagent는 돌아갈 때마다 ntp.conf 파일이 마스터 카피와 일치하는지 여부를 확인하며, 그렇지 않을 경우에는 마스터 카피로 로컬 카피를 덮어쓴 다음 ntp 데몬을 재시작한다.
cfengine의 모든 행동은 반복이 가능하다. 각각의 단계는 중단되거나 나중에 다시 하거나, 혹은 여러 번 반복할 수 있다. 나아가 cfengine이 취하는 각각의 행동은 다른 cfengine 행동을 트리거링할 수 있다. 이 툴은 인간의 개입이 없이 작업을 주문할 수 있으며, 시간이 흐르면 cfengine의 저작자인 마그 버기스(Gurgees)가 ‘컨버전스(convergence)’라고 부르는 상태, 즉 이상적인 실행 구성 상태에 컴퓨터가 도달하게 될 것이다. cfengine이 관리하는 기계가 최적 상태에서 벗어나게 되면 이 툴은 사용자가 지정한 교정 작업을 수행할 것이다.
cfengine은 앞에서 설명한 것처럼 중앙 저장소에서 파일을 카피하고, 쉘 스크립트를 돌리고, 심지어 파일의 MD 5 체크섬이 바뀔 때 관리자에게 경고를 보낼 수도 있다. 여기에는 스크립트 가능한 파일 편집 기능이 함께 하며, CommentLinesMatching, CommentLinesStarting, HashCommentLinesContaining, ReplaceAll 등과 같은 명령어들을 쓸 수 있다. 나아가 cfengine의 구성 옵션 대부분은 정규 표기법을 수용하고 있다.
파일 편집은 파일의 일부를 바꾸고 싶은 인스턴스에서 편리하지만 나머지 하나는 남겨 둔다. 예를 들어 특정 파일에서 192.168.42.2의 모든 인스턴스를 192.168.42.1로 바꾸고 싶을 때는 다음 명령어를 사용해야 할 것이다:

ReplaceAll “192.168.42.2” with “192.168.42.1”
코멘트라인스타팅(CommentLinesStarting)도 또한 매우 강력하며, 아마도 telnetd와 같이 보통 때는 포함시키지 않는 모든 항목들도 inetd.conf(인터넷 수퍼서버의 구성 파일) 내에 포함시키고 싶을 것이다.

성능에 대한 열망
cfengine에서 한 가지 한계는 cfagent가 이미 작업을 수행하고 있는지를 알려줄 수 있어야 한다는 것이며, 이는 특히 파일을 편집하고 있을 때 중요하다. 예를 들어 cfengine 구성 라인, ReplaceAll “server 192.168.*” with “server 192.168.42.1” 는 작동하지 않을 것이다. 문제는 정규 표기법인 “server 192.168.*”가 cfagent가 발견과 교체를 시도하고 있다는 두 가지 문자열과 다 맞기 때문에 cfengine은 행동을 거부할 것이다.
cfengine은 동시에 같은 작업을 수행하는 다중 기계들이 서버에 피해를 입힐 수 있는 방법에 민감하기 때문에 SplayTime이라는 구성 옵션을 갖고 있다(디폴트로는 꺼져 있지만 대부분의 경우 켜두고 싶을 것이다). SplayTime은 cfengine에게 임의의 시간 동안 기다린 후에 작동을 시작하도록 지시한다. 게다가 cfagent는 반복을 피할 수 있도록 분당 한 번 이상은 재시작이 안 되도록 디폴트로 지정돼 있다.
보안은 cfengine에서 중요한 요소다. 적절한 공개 키 상호교환을 구성할 때까지는 어떠한 통신도 발생하지 않으며, cfagent는 ‘풀(pull)’ 모드에서만 작동 가능하다. 클라이언트 cfengine은 cfrun 명령어인 ‘do some work’에만 반응할 수 있으며, 클라이언트와 서버가 정확한 암호화 키를 교환할 경우에만 가능하다.
초기 구성 작업은 처음 해보는 사람에게는 어려울 수 있다. 그리고 cfengine이 명령어에 반응을 하고 있는지 여부를 확인하는 일 또한 쉽지 않을 것이다.
일단 cfengine이 돌아가게 하고 나면 쉽게 호스트를 추가할 수 있다. 새로운 호스트의 공개 키를 cfengine 서버에 있는 cfengine ppkeys 디렉토리로, cfengine 서버의 공개 키는 호스트의 ppkey 디렉토리로 추가하기만 하면 된다.
cfengine의 버전 2에는 소프트웨어 패키지가 포함돼 있는데, 이것은 예를 들어 cfagent가 웹 서버에 있는 이미지 조작 프로그램인 이미지매직(ImageMagick)의 가장 최신 버전을 설치할 수 있게 해준다. 새 웹 서버가 등장할 경우 cfengine은 자동으로 소프트웨어 패키지를 설치해 줄 것이다.
마지막으로 cfengine의 환경 모니터링 능력은 cfengine의 cfenvd가 루트 프로세스의 수에서부터 HTTP와 같이 유명한 서비스에 있는 접속 수에 이르기까지 시스템의 서로 다른 면면들을 검토할 수 있게 해준다. 이것은 또한 각 단계의 시간이 경과하는 동안의 평균과 표준 편차를 관찰한다. 표준편차가 서너 번 이상 비정상적으로 판단되면 다음 번에 이것이 실행될 때 cfagent로 보고가 된다. 예를 들어 웹 서버로 HTTP 접속이 엄청나게 밀려오면 cfagent에게 이메일 경보를 보내거나, 이 데이터를 시스로그(syslog)에 기록하거나, 웹 서버를 억압하거나, 혹은 부하가 감소할 때까지 백업을 중단시키도록 시킬 수 있다.
cfengine은 분명 리눅스 기계를 중앙 관리할 수 있는 오픈소스 툴 가운데 가장 정교한 툴이다. 성공의 열쇠는 환경에 맞는 적절한 툴을 선택해서 이것을 최대한으로 잘 사용하는 것이다.

Step by Step

cfengine 배치 방법

cfservd -v -F를 이용해 cfengine 서버를 처음 가동시키라. 이것은 cfengine에게 전면에서 버보스(verbose) 모드로 이 서버 데몬을 가동시키라고 알리며, 부딪치는 문제에 대해 어떤 것이든 그 소스를 파악할 수 있게 도와준다.

보안을 적절하게 구성하라. 공개/비밀 키 상호교환에서 보통 가장 처음 문제에 부딪친다.

디버그 모드(-d 추가)에서 다른 프로그램을 실행시키라. 이것이 cfengine이 원하는 대로 실행되지 않는 이유을 찾을 수 있는 유일한 수단일 때가 많다.

테스트를 하는 동안 IfElapsed = ( 0 )을 cfagent의 구성 파일 중 제어 섹션에 추가하라. 이것은 테스트를 하는 동안에는 필요하지 않는 행동 반복간 분당 1회의 기본 시간을 오버라이딩해 줄 것이다.


댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 0
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.