システム管理

Fabric

Fabric は、システム管理作業を簡素化するためのライブラリです。 ChefとPuppetはサーバやシステムライブラリの管理に専念する傾向がありますが、Fabricはデプロイメントなどのアプリケーションレベルのタスクにもっと重点を置いています。

Install Fabric:

$ pip install fabric

次のコードは、 memory_usagedeploy の2つのタスクを作成します。 前者は各マシンでメモリ使用量を出力します。 後者は各サーバに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

マスターサーバーと任意の数のminionホストを設定したら、任意のシェルコマンドを実行するか、複雑なコマンドの既成モジュールをminionで使用できます。

次のコマンドは、pingモジュールを使用して利用可能なすべてのminionホストを一覧表示します。

$ salt '*' test.ping

ホストフィルタリングは、minion idを一致させるか、またはgrainシステムを使用して行います。 grains システムは、オペレーティングシステムのバージョンまたはCPUアーキテクチャのような静的ホスト情報を使用して、Saltモジュールのホスト分類を提供します。

次のコマンドは、grainsシステムを使用してCentOSを実行している利用可能なすべてのminionを一覧表示します。

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

Saltはまた、状態システムを提供する。 状態を使用してminionホストを構成することができます。

たとえば、minionホストが次の状態ファイルを読み込むように指示されると、Apacheサーバーがインストールされ、起動されます。

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

状態ファイルは、YAML、Jinja2テンプレートシステムまたは純粋なPythonを使用して記述することができます。

Psutil

Psutil は、異なるシステム情報(例えば、CPU、メモリ、ディスク、ネットワーク、ユーザ、プロセス)へのインタフェースです。

ここでは、サーバーの過負荷を認識するための例を示します。 いずれかのテスト(ネット、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
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
# 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!"
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

Ansible はオープンソースのシステム自動化ツールです。 Puppet や Chef に比べて最大の利点は、クライアントマシンにエージェントを必要としないことです。 PlayBook は Ansible の設定、デプロイメント、オーケストレーション言語であり、YAMLでJinja2でテンプレート化されています。

AnsibleはPythonバージョン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のplaybookは hosts.yml ファイル内のすべてのサーバにpingを実行します。また、Ansibleを使用してサーバーのグループを選択することもできます。 Ansibleの詳細については、 Ansible Docs を参照してください。

An Ansible tutorial も、Ansibleを使い始める上で非常に詳細な紹介です。

Chef

Chef は、サーバーやアプリケーションを物理的、仮想的、またはクラウドの場所に簡単に展開できるシステムとクラウドインフラストラクチャの自動化フレームワークです。 これが設定管理のための選択である場合、主にRubyを使用してインフラストラクチャコードを記述します。

Chefのクライアントは、インフラストラクチャの一部であるすべてのサーバー上で実行され、Chefサーバーと定期的にチェックして、システムが常に整列し、望ましい状態を表していることを確認します。 個々のサーバーにはそれぞれ独自のChefクライアントがあるため、各サーバーが構成され、この分散型アプローチによりシェフはスケーラブルな自動化プラットフォームになります。

Chefは、クックブックで実装されたカスタムレシピ(構成要素)を使用して動作します。基本的にインフラストラクチャーの選択肢のパッケージであるクックブックは、通常Chefサーバーに保存されます。 Digital Oceanチュートリアルシリーズ Chefの簡単なChefサーバーの作成方法を学びましょう。

シンプルなクックブックを作成するには、 knife コマンドを使用します:

knife cookbook create cookbook_name

Getting started with Chef は、Chefの初心者のための良い出発点であり、あなたのインフラストラクチャ構成のニーズを満たすために調整された良いリファレンスとして役立つことができる多くのコミュニティ管理された料理ブックは、Chef Supermarket で見つけることができます。

Puppet

Puppet は、システム管理者がITインフラストラクチャの状態を定義できるようにする、PuppetラボのIT自動化および構成管理ソフトウェアであり、物理マシンと仮想マシンを管理するエレガントな方法を提供します。

Puppetはオープンソースとエンタープライズの両方で利用可能です。 モジュールは、システムの状態を自動化または定義するために書かれた、小さな、共有可能なコード単位です。 Puppet Forge は、オープンソースとエンタープライズPuppetのためにコミュニティによって書かれたモジュールのリポジトリです。

Puppetエージェントは、状態を監視または変更する必要があるノードにインストールされます。 Puppetマスターと呼ばれる指定されたサーバーは、エージェントノードの編成を担当します。

エージェントノードは、オペレーティングシステム、カーネル、アーキテクチャ、IPアドレス、ホスト名などの基本的な事実をPuppet Masterに送信します。 Puppet Masterは、エージェントが提供する情報でカタログをコンパイルし、各ノードをどのように設定してエージェントに送信するかを決定します。 エージェントは、カタログに記載されている変更を適用し、レポートをPuppet Masterに送り返します。

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にはいくつかのリソースタイプがありますが、パッケージファイルサービスのパラダイムは、構成管理の大部分を行うために必要なものです。 次の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

課題

青写真について書く

Buildout

Buildout はオープンソースのソフトウェアビルドツールです。 Buildoutは、Pythonプログラミング言語を使用して作成されます。 設定を行うスクリプトと設定の分離の原則を実装しています。 Buildoutは主に、開発またはデプロイされるソフトウェアの Python eggs 形式で依存関係をダウンロードして設定するために使用されます。 どのような環境でもビルドタスクのためのレシピを作成することができ、すでに多数のレシピが利用可能です。

Shinken

Shinken は、Pythonで書かれたモダンなNagios互換モニタリングフレームワークです。 その主な目的は、大規模な環境に合わせて設計された監視システムの柔軟なアーキテクチャをユーザに提供することです。

Shinkenは、Nagiosの設定標準とプラグインとの下位互換性があります。これは、Windows、GNU / Linux、FreeBSDを含むPythonをサポートする任意のオペレーティングシステムとアーキテクチャで動作します。