Fabric 是一個簡化系統管理任務的庫。 Chef和Puppet傾向于關注管理服務器和系統庫,而Fabric更加關注應用級別的任務,比如說部署。
安裝Fabric:
$ pip install fabric
下面的代碼將會創建我們可以使用的兩個任務: memory_usage
和 deploy
。
前者將會在每臺機器上輸出內存使用情況。后者將會SSH到每臺服務器,cd到我們的工程目錄,
激活虛擬環境,拉取最新的代碼庫,以及重啟應用服務器。
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
and we can deploy with:
$ fab deploy
額外的特性包括并行執行、和遠程程序交互、以及主機分組。
Salt 是一個開源的基礎管理工具。 它支持從中心節點(主要的主機)到多個主機(指從機)的遠程命令執行。 它也支持系統語句,能夠使用簡單的模板文件配置多臺服務器。
Salt支持Python 2.6和2.7,并能通過pip安裝:
$ pip install salt
在配置好一臺主服務器和任意數量的從機后,我們可以在從機上使用任意的shell命令或者預制的復雜命令的模塊。
下面的命令使用ping模塊列出所有可用的從機:
$ salt '*' test.ping
主機過濾是通過匹配從機id或者使用顆粒系統(grains system)。 顆粒(grains) 系統使用靜態的主機信息,比如操作系統版本或者CPU架構,來為Salt模塊提供主機分類內容。
下列命令行使用顆粒系統列舉了所有可用的運行CentOS的從機:
$ salt -G 'os:CentOS' test.ping
Salt也提供狀態系統。狀態能夠用來配置從機。
例如,當一個從機接受讀取下列狀態文件的指令,他將會安裝和啟動Apache服務器:
apache:
pkg:
- installed
service:
- running
- enable: True
- require:
- pkg: apache
狀態文件可以使用YAML、Jinja2模板系統或者純Python編寫。
Psutil 是獲取不同系統信息 (比如CPU、內存、硬盤、網絡、用戶、進程)的接口。
下面是一個關注一些服務器過載的例子。如果任意一個測試(網絡、CPU)失敗,它將會發送一封郵件。
# 獲取系統變量的函數:
from psutil import cpu_percent, net_io_counters
# 休眠函數:
from time import sleep
# 用于email服務的包:
import smtplib
import string
MAX_NET_USAGE = 400000
MAX_ATTACKS = 4
attack = 0
counter = 0
while attack <= MAX_ATTACKS:
sleep(4)
counter = counter + 1
# Check the cpu usage
if cpu_percent(interval = 1) > 70:
attack = attack + 1
# Check the net usage
neti1 = net_io_counters()[1]
neto1 = net_io_counters()[0]
sleep(1)
neti2 = net_io_counters()[1]
neto2 = net_io_counters()[0]
# Calculate the bytes per second
net = ((neti2+neto2) - (neti1+neto1))/2
if net > MAX_NET_USAGE:
attack = attack + 1
if counter > 25:
attack = 0
counter = 0
# 如果attack大于4,就編寫一封十分重要的email
TO = "you@your_email.com"
FROM = "webmaster@your_domain.com"
SUBJECT = "Your domain is out of system resources!"
text = "Go and fix your server!"
BODY = string.join(("From: %s" %FROM,"To: %s" %TO,"Subject: %s" %SUBJECT, "",text), "\r\n")
server = smtplib.SMTP('127.0.0.1')
server.sendmail(FROM, [TO], BODY)
server.quit()
一個類似于基于psutil并廣泛擴展的top,并擁有客服端-服務端監控能力的完全終端應用叫做 glance 。
Ansible 是一個開源系統自動化工具。 相比于Puppet或者Chef最大的優點是它不需要客戶機上的代理。 Playbooks是Ansible的配置、部署和編排語言,它用YAML格式編寫,使用Jinja2作為模板。
Ansible支持Python 2.6和2.7,并能使用pip安裝:
$ pip install ansible
Ansible需要一個清單文件,來描述主機經過何處。以下是一個主機和playbook的例子, 在清單文件中將會ping所有主機。
清單文件示例如下:
hosts.yml
[server_name]
127.0.0.1
playbook示例如下:
ping.yml
---
- hosts: all
tasks:
- name: ping
action: ping
要運行playbook:
$ ansible-playbook ping.yml -i hosts.yml --ask-pass
Ansible playbook在 hosts.yml
中將會ping所有的服務器。您也可以選擇成組的服務器使用Ansible。
了解更多關于Ansible的信息,請閱讀 Ansible Docs 。
Ansible教程 也是一個很棒的且詳細的指引來開始熟悉Ansible。
Chef 是一個系統的云基礎設施自動化框架, 它使部署服務器和應用到任何物理、虛擬或者云終端上變得簡單。您可以選擇進行配置管理,那將主要使用Ruby去編寫您的基礎設施代碼。
Chef客戶端運行于組成您的基礎設施的每臺服務器上,這些客戶端定期檢查Chef服務器來確保系統是均衡并且處于設想的狀態。 由于每臺服務器擁有它自己的獨立的Chef客戶端,每個服務器配置自己,這種分布式方法使得Chef成為一個可擴展的自動化平臺。
Chef通過使用定制的在cookbook中實現的食譜(配置元素)來工作。Cookbook通常作為基礎設施的選擇項, 作為包存放在Chef服務器中。請閱讀 數字海洋教程系列 關于Chef的部分來學習如何創建一個簡單的Chef服務器。
要創建一個簡單的cookbook,使用 knife 命令:
knife cookbook create cookbook_name
Getting started with Chef 對Chef初學者來說是一個好的開始點,許多社區維護著cookbook,可以作為是一個好的參考。要服務自己的基礎設施配置需求, 請見 Chef Supermarket 。
Puppet 是來自Puppet Labs的IT自動化和配置管理軟件,允許系統管理員定義他們的IT基礎設施狀態, 這樣就能夠提供一種優雅的方式管理他們成群的物理和虛擬機器。
Puppet均可作為開源版和企業版獲取到。其模塊是小的、可共享的代碼單元,用以自動化或定義系統的狀態。 Puppet Forge 是一個模塊倉庫,它由社區編寫,面向開源和企業版的Puppet。
Puppet代理安裝于其狀態需要被監控或者修改的節點上。作為特定服務器的Puppet Master負責組織代理節點。
代理節點發送系統的基本信息到Puppet Master,比如說操作系統、內核、架構、IP地址、主機名等。 接著,Puppet Master編譯攜帶有節點生成信息的目錄,告知每個節點應如何配置,并發送給代理。 代理便會執行前述目錄中的變化,并向Puppet Master發送回一份報告。
Facter是一個有趣的工具,它用來傳遞Puppet獲取到的基本系統信息。這些信息可以在編寫Puppet模塊的時候作為變量來引用。
$ facter kernel
Linux
$ facter operatingsystem
Ubuntu
在Puppet中編寫模塊十分直截了當。Puppet清單(manifest)組成了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 文檔 。
Todo
Write about Blueprint
Buildout 是一個開源軟件構件工具。Buildout由Python編寫。 它實現了配置和構建腳本分離的原則。Buildout主要用于下載和設置正在開發或部署軟件的 Python eggs <https://stackoverflow.com/questions/2051192/what-is-a-python-egg> 格式的依賴。 在任何環境中構建任務的指南(recipe,原意為“食譜”,引申為“指南”)能被創建,許多早已可用。
Shinken 是一個使用Python編寫的現代化的兼容Nagios的監控框架。 其主要目標是為用戶的設計成可擴展到大型環境的監控系統提供靈活的框架。
Shinken與Nagios配置標準和插件向后兼容。它適用于任何支持Python的操作系統和架構,包括Windows、Linux和FreeBSD。