系统管理

../_images/34435690580_3afec7d4cd_k_d.jpg

Fabric

Fabric 是用于简化系统管理任务的库。尽管Chef和Puppet倾向于管理服务器和系统库,但Fabric更关注应用程序级任务,如部署。

安装Fabric:

$ pip install fabric

以下代码将创建两个我们可以使用的任务: memory_usagedeploy .前者将输出每台机器上的内存使用情况。后者会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

我们可以使用:

$ fab deploy

其他特性包括并行执行、与远程程序的交互和主机分组。

Salt

Salt 是一个开源基础设施管理工具。它支持从一个中心点(主主机)到多个主机(小主机)的远程命令执行。它还支持使用简单模板文件配置多个服务器的系统状态。

Salt支持python版本2.6和2.7,可以通过pip安装:

$ pip install salt

在配置了主服务器和任意数量的小型主机之后,我们可以运行任意shell命令,或者在小型机上使用复杂命令的预构建模块。

以下命令列出了使用ping模块的所有可用的迷你主机。

$ salt '*' test.ping

主机过滤是通过匹配迷你ID或使用颗粒系统来完成的。这个 grains 系统使用静态主机信息(如操作系统版本或CPU体系结构)为salt模块提供主机分类。

以下命令列出了使用谷物系统运行CentOS的所有可用的仆人:

$ salt -G 'os:CentOS' test.ping

Salt还提供了一个状态系统。状态可用于配置迷你主机。

例如,当一个小型主机被命令读取以下状态文件时,它将安装并启动Apache服务器:

apache:
  pkg:
    - installed
  service:
    - running
    - enable: True
    - require:
      - pkg: apache

状态文件可以使用YAML、 Jinja2模板系统或pure Python编写。

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相比,它最大的优势是不需要客户端计算机上的代理。攻略是Ansible的配置、部署和编排语言,使用YAML和JJA2编写,用于模板化。

Ansible支持Python版本2.6和2.7,可以通过pip安装:

$ pip install ansible

Ansible需要一个清单文件来描述它可以访问的主机。下面是一个主机和Playbook的示例,它将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 Playbook将ping中的所有服务器 hosts.yml 文件。您还可以使用ansible选择服务器组。有关Ansible的更多信息,请阅读 Ansible Docs

An Ansible tutorial 也是一个很好的详细介绍开始与Ansible。

Chef

Chef 是一个系统和云基础设施自动化框架,使其易于将服务器和应用程序部署到任何物理、虚拟或云位置。如果这是您对配置管理的选择,那么您将主要使用Ruby编写基础结构代码。

Chef客户机在基础结构中的每台服务器上运行,这些服务器定期与Chef服务器进行检查,以确保系统始终保持一致并表示所需的状态。由于每个服务器都有自己独特的Chef客户机,所以每个服务器都配置自己,这种分布式方法使Chef成为一个可扩展的自动化平台。

Chef通过使用定制食谱(配置元素)工作,在食谱中实现。烹饪书,基本上是基础设施选择的包,通常存储在您的Chef服务器中。阅读 DigitalOcean tutorial series 在Chef上学习如何创建一个简单的Chef服务器。

创建一个简单的食谱 knife 使用命令:

knife cookbook create cookbook_name

Getting started with Chef 对于厨师初学者来说是一个很好的起点,许多社区维护的食谱可以作为一个很好的参考,也可以在 Chef Supermarket .

Puppet

Puppet Puppet实验室的IT自动化和配置管理软件是否允许系统管理员定义其IT基础设施的状态,从而提供一种优雅的方式来管理物理和虚拟机。

Puppet既可以作为开放源代码,也可以作为企业变体。模块是为自动化或定义系统状态而编写的小型、可共享的代码单元。 Puppet Forge 是由社区为开源和企业木偶编写的模块的存储库。

Puppet代理安装在需要监视或更改其状态的节点上。一个名为puppet master的指定服务器负责协调代理节点。

代理节点向Puppet Master发送有关系统的基本信息,如操作系统、内核、体系结构、IP地址、主机名等。然后,Puppet Master会编译一个目录,其中包含代理提供的有关如何配置每个节点的信息,并将其发送给代理。代理执行目录中规定的更改,并将报告发送回Puppet Master。

Factor是一个有趣的工具,它与Puppet一起提供关于系统的基本事实。这些事实可以在编写Puppet模块时作为变量引用。

$ facter kernel
Linux
$ facter operatingsystem
Ubuntu

在Puppet中编写模块非常直接。木偶显现一起形成木偶模块。木偶宣言以扩展 .pp。下面是木偶中“你好世界”的一个例子。

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有几种资源类型,但是包文件服务范式是您进行大多数配置管理所需要的。下面的Puppet代码确保OpenSSH-服务器包安装在系统中,并在每次更改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 Documentation

蓝图

待处理

写蓝图

Buildout

Buildout 是一个开源软件构建工具。构建是使用Python编程语言创建的。它实现了配置与执行设置的脚本分离的原则。buildout主要用于下载和设置 Python eggs 正在开发或部署的软件的格式。在任何环境中都可以创建构建任务的配方,其中许多已经可用。

Shinken

Shinken 是一个用python编写的、与nagios兼容的现代监控框架。其主要目标是为用户的监控系统提供一个灵活的体系结构,该体系结构旨在扩展到大型环境中。

Shinken向后兼容Nagios配置标准和插件。它适用于任何支持python的操作系统和体系结构,包括windows、linux和freebsd。