시스템 관리¶
Fabric¶
Fabric 는 시스템 관리 작업을 단순화하기 위한 라이브러리입니다. Chef와 Puppet이 서버와 시스템 라이브러리 관리에 초점을 맞추는 경향이 있는 반면, Fabric은 배포와 같은 응용 수준의 작업에 더 초점을 맞춥니다.
Fabric 설치:
$ pip install fabric
다음 코드는 우리가 사용할 두 가지 태스크, 즉 memory_usage 와 deploy 를 만듭니다. 전자는 각 머신의 메모리 사용량을 출력합니다. 후자는 각 서버에 SSH로 접속하여 프로젝트 디렉토리로 이동한 다음, 가상 환경을 활성화하고, 최신 코드베이스를 가져오고, 응용 서버를 재시작합니다.
from fabric.api import cd, env, prefix, run, task
env.hosts = ['my_server1', 'my_server2']
@task
def memory_usage():
run('free -m')
@task
def deploy():
with cd('/var/www/project-env/project'):
with prefix('. ../bin/activate'):
run('git pull')
run('touch app.wsgi')
위 코드를 fabfile.py 라는 이름의 파일에 저장하면, 다음과 같이 메모리 사용량을 확인할 수 있습니다:
$ fab memory_usage
[my_server1] Executing task 'memory'
[my_server1] run: free -m
[my_server1] out: total used free shared buffers cached
[my_server1] out: Mem: 6964 1897 5067 0 166 222
[my_server1] out: -/+ buffers/cache: 1509 5455
[my_server1] out: Swap: 0 0 0
[my_server2] Executing task 'memory'
[my_server2] run: free -m
[my_server2] out: total used free shared buffers cached
[my_server2] out: Mem: 1666 902 764 0 180 572
[my_server2] out: -/+ buffers/cache: 148 1517
[my_server2] out: Swap: 895 1 894
그리고 다음과 같이 배포할 수 있습니다:
$ fab deploy
추가 기능으로 병렬 실행, 원격 프로그램과의 상호작용, 호스트 그룹화가 있습니다.
Salt¶
Salt 는 오픈 소스 인프라 관리 도구입니다. 중앙 지점(마스터 호스트)에서 여러 호스트(미니언)로의 원격 명령 실행을 지원합니다. 또한 간단한 템플릿 파일로 여러 서버를 설정하는 데 사용할 수 있는 시스템 상태(state)도 지원합니다.
Salt는 파이썬 2.6과 2.7 버전을 지원하며 pip으로 설치할 수 있습니다:
$ pip install salt
마스터 서버와 임의의 개수의 미니언 호스트를 설정한 후에는, 미니언에 대해 임의의 쉘 명령어를 실행하거나, 복잡한 명령어로 미리 만들어진 모듈을 사용할 수 있습니다.
다음 명령어는 ping 모듈을 사용해 사용 가능한 모든 미니언 호스트를 나열합니다.
$ salt '*' test.ping
호스트 필터링은 미니언 ID를 매칭하거나 grains 시스템을 사용하여 이루어집니다. grains 시스템은 운영체제 버전이나 CPU 아키텍처 같은 정적인 호스트 정보를 사용하여 Salt 모듈을 위한 호스트 분류 체계를 제공합니다.
다음 명령어는 grains 시스템을 사용하여 CentOS에서 실행 중인 사용 가능한 모든 미니언을 나열합니다:
$ salt -G 'os:CentOS' test.ping
Salt는 상태(state) 시스템도 제공합니다. 상태는 미니언 호스트를 설정하는 데 사용할 수 있습니다.
예를 들어, 미니언 호스트가 다음 상태 파일을 읽도록 지시받으면, Apache 서버를 설치하고 시작합니다:
apache:
pkg:
- installed
service:
- running
- enable: True
- require:
- pkg: apache
상태 파일은 YAML, Jinja2 템플릿 시스템, 또는 순수 파이썬으로 작성할 수 있습니다.
Psutil¶
Psutil 는 다양한 시스템 정보(예: CPU, 메모리, 디스크, 네트워크, 사용자, 프로세스)에 대한 인터페이스입니다.
다음은 서버 과부하를 감지하기 위한 예시입니다. 검사(net, CPU) 중 하나라도 실패하면 이메일을 보냅니다.
# Functions to get system values:
from psutil import cpu_percent, net_io_counters
# Functions to take a break:
from time import sleep
# Package for email services:
import smtplib
import string
MAX_NET_USAGE = 400000 # bytes per seconds
MAX_ATTACKS = 4
attack = 0
while attack <= MAX_ATTACKS:
sleep(4)
# Check the net usage wit named tuples
neti1 = net_io_counters().bytes_recv
neto1 = net_io_counters().bytes_sent
sleep(1)
neti2 = net_io_counters().bytes_recv
neto2 = net_io_counters().bytes_sent
# Calculate the bytes per second
net = ((neti2+neto2) - (neti1+neto1))/2
# Check the net and cpu usage
if (net > MAX_NET_USAGE) or (cpu_percent(interval = 1) > 70):
attack+=1
elif attack > 1:
attack-=1
# Write a very important email if attack is higher than 4
TO = "you@your_email.com"
FROM = "webmaster@your_domain.com"
SUBJECT = "Your domain is out of system resources!"
text = "Go and fix your server!"
string="\r\n"
BODY = string.join(("From: %s" %FROM,"To: %s" %TO,
"Subject: %s" %SUBJECT, "",text))
server = smtplib.SMTP('127.0.0.1')
server.sendmail(FROM, [TO], BODY)
server.quit()
광범위하게 확장된 top과 같은 완전한 터미널 응용으로는 Glance 가 있으며, psutil을 기반으로 하고 클라이언트-서버 모니터링 기능을 갖추고 있습니다.
Ansible¶
Ansible 는 오픈 소스 시스템 자동화 도구입니다. Puppet이나 Chef에 비해 가장 큰 장점은 클라이언트 머신에 에이전트가 필요 없다는 점입니다. 플레이북(Playbook)은 Ansible의 설정, 배포, 오케스트레이션 언어로, 템플릿팅을 위한 Jinja2와 함께 YAML로 작성됩니다.
Ansible은 파이썬 2.6과 2.7 버전을 지원하며 pip으로 설치할 수 있습니다:
$ pip install ansible
Ansible은 접근할 호스트들을 기술한 인벤토리 파일이 필요합니다. 아래는 인벤토리 파일의 모든 호스트에 ping을 보내는 호스트와 플레이북의 예시입니다.
다음은 인벤토리 파일 예시입니다: hosts.yml
[server_name]
127.0.0.1
다음은 플레이북 예시입니다: ping.yml
---
- hosts: all
tasks:
- name: ping
action: ping
플레이북을 실행하려면:
$ ansible-playbook ping.yml -i hosts.yml --ask-pass
Ansible 플레이북은 hosts.yml 파일의 모든 서버에 ping을 보냅니다. Ansible로 서버 그룹을 선택할 수도 있습니다. Ansible에 대한 더 많은 정보는 Ansible 문서 를 참고하세요.
Ansible 튜토리얼 도 Ansible 입문을 위한 훌륭하고 자세한 소개입니다.
Chef¶
Chef 는 시스템 및 클라우드 인프라 자동화 프레임워크로, 어떤 물리적, 가상, 클라우드 위치에도 서버와 응용을 쉽게 배포할 수 있게 해줍니다. 설정 관리 도구로 Chef를 선택한다면, 인프라 코드를 주로 Ruby로 작성하게 됩니다.
Chef 클라이언트는 인프라에 속한 모든 서버에서 실행되며, Chef 서버에 정기적으로 확인하여 시스템이 항상 일관되고 원하는 상태를 나타내도록 합니다. 각 서버가 자신만의 별도의 Chef 클라이언트를 가지고 있기 때문에 각 서버가 스스로를 설정하며, 이러한 분산 접근 방식 덕분에 Chef는 확장 가능한 자동화 플랫폼이 됩니다.
Chef는 쿡북(cookbook)에 구현된 사용자 정의 레시피(설정 요소)를 사용하여 동작합니다. 쿡북은 기본적으로 인프라 선택 사항을 위한 패키지이며, 보통 Chef 서버에 저장됩니다. 간단한 Chef 서버를 만드는 방법을 배우려면 Chef에 대한 DigitalOcean 튜토리얼 시리즈 를 읽어보세요.
간단한 쿡북을 만들 때는 knife 명령어를 사용합니다:
knife cookbook create cookbook_name
Getting started with Chef 는 Chef 초보자를 위한 좋은 출발점이며, 좋은 참고가 되거나 인프라 설정 필요에 맞게 다듬어 쓸 수 있는 커뮤니티가 유지하는 많은 쿡북은 Chef Supermarket 에서 찾을 수 있습니다.
Puppet¶
Puppet 은 Puppet Labs의 IT 자동화 및 설정 관리 소프트웨어로, 시스템 관리자가 IT 인프라의 상태를 정의할 수 있게 해주어 물리적 및 가상 머신 군을 우아하게 관리할 수 있는 방법을 제공합니다.
Puppet은 오픈 소스 및 엔터프라이즈 변형으로 모두 제공됩니다. 모듈은 시스템의 상태를 자동화하거나 정의하기 위해 작성된 작고 공유 가능한 코드 단위입니다. Puppet Forge 는 커뮤니티가 오픈 소스 및 엔터프라이즈 Puppet을 위해 작성한 모듈의 저장소입니다.
Puppet 에이전트는 상태를 모니터링하거나 변경해야 하는 노드에 설치됩니다. Puppet 마스터로 알려진 지정된 서버가 에이전트 노드를 오케스트레이션합니다.
에이전트 노드는 운영체제, 커널, 아키텍처, IP 주소, 호스트명 등 시스템에 대한 기본 팩트(fact)를 Puppet 마스터로 보냅니다. 그러면 Puppet 마스터는 에이전트가 제공한 정보를 바탕으로 각 노드가 어떻게 설정되어야 하는지에 대한 카탈로그를 컴파일하여 에이전트에게 보냅니다. 에이전트는 카탈로그에 명시된 대로 변경을 적용하고 Puppet 마스터에게 보고를 보냅니다.
Facter는 Puppet과 함께 제공되는 흥미로운 도구로, 시스템에 대한 기본 팩트를 가져옵니다. 이 팩트들은 Puppet 모듈을 작성할 때 변수로 참조할 수 있습니다.
$ facter kernel
Linux
$ facter operatingsystem
Ubuntu
Puppet에서 모듈을 작성하는 일은 꽤 단순합니다. Puppet 매니페스트가 모여 Puppet 모듈을 이룹니다. Puppet 매니페스트는 .pp 확장자로 끝납니다. 다음은 Puppet으로 작성한 ‘Hello World’ 예시입니다.
notify { 'This message is getting logged into the agent node':
#As nothing is specified in the body the resource title
#the notification message by default.
}
다음은 시스템 기반 로직을 사용한 또 다른 예시입니다. 운영체제 팩트가 $ 기호가 앞에 붙은 변수로 사용되는 방식을 눈여겨보세요. 마찬가지로 호스트명 같은 다른 팩트도 $hostname 으로 참조할 수 있습니다.
notify{ 'Mac Warning':
message => $operatingsystem ? {
'Darwin' => 'This seems to be a Mac.',
default => 'I am a PC.',
},
}
Puppet에는 여러 가지 리소스 타입이 있지만, 설정 관리의 대부분을 수행하는 데에는 package-file-service 패러다임 하나면 충분합니다. 다음 Puppet 코드는 시스템에 OpenSSH-Server 패키지가 설치되어 있는지 확인하고, sshd 설정 파일이 변경될 때마다 sshd 서비스가 재시작되도록 알립니다.
package { 'openssh-server':
ensure => installed,
}
file { '/etc/ssh/sshd_config':
source => 'puppet:///modules/sshd/sshd_config',
owner => 'root',
group => 'root',
mode => '640',
notify => Service['sshd'], # sshd will restart
# whenever you edit this
# file
require => Package['openssh-server'],
}
service { 'sshd':
ensure => running,
enable => true,
hasstatus => true,
hasrestart=> true,
}
더 자세한 내용은 Puppet Labs 문서 를 참고하세요.
Blueprint¶
할 일
Blueprint에 대해 작성하기
Buildout¶
Buildout 은 오픈 소스 소프트웨어 빌드 도구입니다. Buildout은 파이썬 프로그래밍 언어로 만들어졌습니다. 설정과 설정을 수행하는 스크립트의 분리 원칙을 구현합니다. Buildout은 주로 개발 또는 배포되는 소프트웨어의 파이썬 egg 포맷으로 의존성을 다운로드하고 설정하는 데 사용됩니다. 어떤 환경에서든 빌드 작업을 위한 레시피를 만들 수 있으며, 이미 많은 것들이 사용 가능합니다.
