システム管理¶
Fabric¶
Fabric は、システム管理作業を簡素化するためのライブラリです。 ChefとPuppetはサーバやシステムライブラリの管理に専念する傾向がありますが、Fabricはデプロイメントなどのアプリケーションレベルのタスクにもっと重点を置いています。
Install Fabric:
$ pip install fabric
次のコードは、 memory_usage
と deploy
の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¶
課題
青写真について書く