系统管理
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 是一个开源的系统管理工具。 它支持从中心节点(Master)到多个主机(从机 Minions)的远程命令执行。 它也支持系统语句,能够使用简单的模板文件配置多台服务器。
Salt 支持 Python 2.6 和 2.7,并能通过 pip 安装:
$ pip install salt
在配置好一台主服务器和任意数量的从机后,我们可以在从机上使用任意的 shell 命令或者 Salt 内置的复杂命令模块。
以下命令使用 Salt 内置的 Ping 模块来列出所有可用的从机:
$ salt '*' test.ping
过滤器通过匹配从机的 ID 或者使用颗粒系统(grains system)进行过滤。 颗粒 系统解析静态的主机信息,比如操作系统版本或者 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
Psutil 是一个获取操作系统信息的接口(比如:CPU、内存、硬盘、网络、用户和进程)。
这是一个检测服务器超载的例子,当检测项中(网络、CPU)有任何一下失败便会向管理员发送一份电子邮件。
# 获取系统值的函数:
from psutil import cpu_percent, net_io_counters
# 让任务中断的函数:
from time import sleep
# 邮件服务包:
import smtplib
import string
MAX_NET_USAGE = 400000
MAX_ATTACKS = 4
attack = 0
counter = 0
while attack <= MAX_ATTACKS:
sleep(4)
counter = counter + 1
# 检测 CPU 使用率
if cpu_percent(interval = 1) > 70:
attack = attack + 1
# 检测网络使用率
neti1 = net_io_counters()[1]
neto1 = net_io_counters()[0]
sleep(1)
neti2 = net_io_counters()[1]
neto2 = net_io_counters()[0]
# 计算每秒钟的字节
net = ((neti2+neto2) - (neti1+neto1))/2
if net > MAX_NET_USAGE:
attack = attack + 1
if counter > 25:
attack = 0
counter = 0
# 当 `attack` 变量大于 `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!"
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()
Glances 是一个基于 Psutil
开发的可替代 top
命令的终端应用程序。Glances
支持 C/S
架构,用户可以在本地终端下监控远程服务器的状态。
Ansible
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 将会 ping 所有在 hosts.yml
中列出的服务器。你可以使用 Ansible 专门针对分组的服务器进行处理。若想了解更多关于 Ansible 的信息,请阅读 Ansible 官方文档 。
Ansible 教程 也是一个很棒指南文档。
Chef
Chef 是一个系统和云基础设施自动化框架, 它可以让你轻松地部署服务器和应用到任意物理、虚拟或者云终端上。需要注意的是,如果你选择了 Chef 作为你的自动化工具,大部分时间你需要使用 ruby 来编写配置信息。
Chef 客户端运行于组成基础设施的每台服务器上,这些客户端定期检查 Chef 服务器来确保系统一致并且处于设想的状态。 由于每台服务器拥有它自己的独立的 Chef 客户端,每个服务器配置自己,这种分布式方法使得 Chef 成为一个可扩展的自动化平台。
Chef 通过使用定制的 Cookbook 来工作。Cookbook 通常作为基础设施的选择项,类似于扩展包一样存放在 Chef 服务器中。请阅读 Digital Ocean 系列教程 来学习如何创建一个简单的 Chef 服务器。
要创建一个简单的 Cookbook,请使用 knife 命令:
knife cookbook create cookbook_name
Chef 入门教程 对 Chef 初学者来说是一个好的开始点,教程中讲解了许多社区维护的 Cookbook,可以作为是一个很好的参考。更多的基础设施配置需求,请见 Chef Supermarket 。
Puppet
Puppet 是来自 Puppet Labs 的 IT 自动化和配置管理软件,Puppet 允许系统管理员使用优雅的方式来管理他们成群的物理和虚拟机器。
Puppet 有开源版和企业版两个版本。Puppet 通过模块来工作,模块是小的、可共享的代码单元,用以自动化或定义系统的状态。 Puppet Forge 是一个模块仓库,它由社区编写,面向开源和企业版的 Puppet。
Puppet 客户端需要安装在所有集群节点上。作为特定服务器的 Puppet Master 负责组织所有的客户端子节点。
子节点发送系统的基本信息到 Puppet Master,比如说操作系统、内核、架构、IP 地址、主机名等。 接着,Puppet Master 编译携带有节点生成信息的目录,告知每个节点应如何配置,并发送变更指令给子节点上的 Puppet 客户端。 客户端接收到指令后应用变化,并向 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 文档 。
Buildout
Buildout 是一个开源软件构件工具。Buildout 由 Python 语言编写。 它实现了配置和构建脚本分离的原则。Buildout 主要用于辅助开发或者部署软件的 Python egg 格式的依赖。 Recipe 可以在多种环境下被创建,并且有很多现成的 recipe 可供使用。
Shinken
Shinken 是一个使用 Python 构建的现代化并兼容 Nagios 的监控框架。其主要目标是为大型项目环境提供一个灵活的监控框架。
Shinken 向后兼容 Nagios 配置和其标准插件。它适用于任何支持 Python 的操作系统,包括Windows、GNU/Linux和FreeBSD。