2011年4月4日月曜日

PuppetでCentOSサーバ管理を自動化

こんにちは。ikuyamadaです。

今回は、独自のプログラミング言語を使ってサーバの状態を記述することで、サーバ管理を効率化することの出来るツール「Puppet」を使ったサーバ管理手法について紹介したいと思います。当社では、このPuppetを使うことで、かなりサーバ管理を効率的に管理することができるようになりました。皆さんもぜひ一度使ってみてください。

(この記事は2月にLinux Gazette誌に寄稿した「Automating virtual server administration using Puppet」を翻訳し編集したものです)

イントロダクション


サーバ環境をXenやKVMなどで構築すると、使用する仮想サーバの台数は多くなりがちです。用途ごとに仮想サーバを切り分けることで、サーバ資源をより有効に使用できたり、障害の原因を切り分けられるなどのメリットがありますが、反面、サーバのインストールや運用にはより多くの手間がかかるようになります。また、cronやapacheなど、複数のサーバで使用されている設定を変更するのも大変です。

そこで、今回は、弊社のサーバ環境でも広範に使用されている「Puppet」というツールを使って、自動的にサーバ環境を構築・運用できる方法を紹介したいと思います。このツールは主に大規模サーバの管理を効率化するために作られたものですが、小規模なサーバ管理にも適しています。

掲載された設定例を使うことで、数行のコマンドを打つだけで、基本的なセキュリティ設定を含めた新しいサーバを簡単にセットアップすることができます。また、Puppetは自動的に設定をサーバ間で同期するため、設定を最新のものに保つこともできます。

ここで紹介するサーバの設定はCentOS 5.5でテストを行っています。

インストール


Puppetはクライアント/サーバモデルで動作します。各クライアントは定期的にマスターサーバと設定を同期します。このため、Puppetのインストールにはマスタサーバとクライアントサーバを1台ずつ用意する必要があります。

それではPuppetをインストールします。Fedora EPELがPuppetのYumパッケージを提供しているため、まずインストールします。
$ sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
そして、puppet-serverパッケージをマスターサーバに、puppetパッケージをクライアントサーバにインストールします。

マスターサーバ:
$ sudo yum -y install puppet-server
$ sudo service puppetmaster start

クライアントサーバ:
$ sudo yum -y install puppet
$ sudo service puppet start

Puppetの簡単な紹介


Puppetでは、全ての設定を「リソース」として記述します。リソースではファイルやソフトウェア・パッケージ、サービスなど様々なものを記述できます。例えば、下記のリソースは/etc/passwdがrootによって所有され、644のパーミッションを保持していることを示しています。
file { '/etc/passwd':
    owner   => root,
    mode    => 644,
}
また、下記の設定は、openssh-serverパッケージをインストールし、sshdサービスをデフォルトで有効化することを示しています。
package { 'openssh-server':
    ensure => installed,
}

service { 'sshd':
    enable  => true,
    ensure  => running,
    require => Package['openssh-server'],
}
それでは、これらの設定を適用してみたいと思います。Puppetは、デフォルトでsite.ppというファイルを使用します。まずはsite.ppを作成しましょう。下記の内容をマスターサーバの/etc/puppet/manifests/site.ppにペーストしてください。
file { '/etc/passwd':
    owner   => root,
    mode    => 644,
}

package { 'openssh-server':
    ensure => installed,
}

service { 'sshd':
    enable  => true,
    ensure  => running,
    require => Package['openssh-server'],
}
次にクライアントサーバをマスターサーバに登録する必要があります。下記のコマンドを順にクライアントサーバとマスターサーバで実行してください。

クライアントサーバ:
$ sudo puppetd --test --waitforcert 30 --server MASTER_SERVER_ADDRESS
マスターサーバ:
$ sudo puppetca --list
(クライアントサーバのアドレスが表示されます)
$ sudo puppetca --sign CLIENT_SERVER_ADDRESS
クライアントサーバのコンソールでしばらく待つと、Puppetが設定を同期するメッセージが表示されると思います。もし表示されない場合は、一旦コマンドをCtrl-Cで終了し、下記コマンドを再度実行してみてください。
$ sudo puppetd --test --server MASTER_SERVER_ADDRESS

最後に、Puppetにマスターサーバのアドレスを登録するため、クライアントサーバの/etc/puppet/puppet.confに下記の内容を記述してください。

クライアントサーバ:
[main]
server = MASTER_SERVER_ADDRESS
設定後、Puppetは30分ごとに自動的に設定を同期します。設定が成功していれば、/var/log/messagesでログを確認することができるはずです。
$ sudo tail /var/log/messages

設定例


この節では、いくつかの基本的な設定例を記述します。site.ppに記述することで使用することができます。

管理ユーザの追加

Puppetはユーザアカウントの管理を行えるuserリソースを提供しています。下記の設定で、サーバにadminユーザを追加します。
# Add "admin" account
user { 'admin':
     # home directory is /home/admin
    home       => '/home/admin',
    # manage the home directory by Puppet
    managehome => true,
    # the user belongs to wheel group
    groups     => ['wheel'],
    # hashed password text
    password   => 'PASSWORD_HASH',
}
PASSWORD_HASH/etc/shadow等で使われている基本的なパスワードハッシュです。Perl等で簡単に生成することが出来ます。
$ perl -wle 'print crypt "PASSWORD", "SALT"'
sudo

下記の設定はsudoパッケージをインストールし、augeasを使ってwheelユーザにsudoの実行権限を付与します。
# Install sudo package
package { 'sudo':
    ensure => installed,
}

# Allow users belonging wheel group to use sudo
augeas { 'sudowheel':
    context => '/files/etc/sudoers',
    changes => [
        'set spec[user = "%wheel"]/user %wheel',
        'set spec[user = "%wheel"]/host_group/host ALL',
        'set spec[user = "%wheel"]/host_group/command ALL',
        'set spec[user = "%wheel"]/host_group/command/runas_user ALL',
    ]
}
SSH

下記の設定はsshをサーバで有効化し、ssh経由でのrootログイン及び空パスワードでのログインを抑制します。
# Install openssh-server package
package { 'openssh-server':
    ensure => installed,
}

# Enable sshd service
service { 'sshd':
    # execute sshd on startup
    enable  => true,
    # ensure sshd running
    ensure  => running, 
    # require openssh-server before applying this config
    require => Package['openssh-server'],
}

# Change sshd configuration
augeas { 'sshd_config':
    context => '/files/etc/ssh/sshd_config',
    # restart sshd after applying this config
    notify  => Service['sshd'],
    changes => [
        # deny root logins and logins with empty passwords
        'set PermitRootLogin no',
        'set PermitEmptyPasswords no',
    ],
}
iptables

Puppetでiptablesを管理するにはpuppet-iptablesという外部モジュールをインストールする必要があります。下記のコマンドでGitHubからインストールします。(gitがない場合はインストールしてください)
$ cd /tmp
$ git clone https://github.com/kbarber/puppet-iptables.git
$ sudo mkdir -p /etc/puppet/modules
$ sudo mv puppet-iptables /etc/puppet/modules/
また、プラグインを追加するため、下記の設定をマスターサーバ・クライアントサーバ双方の/etc/puppet/puppet.confに追加する必要があります。
[main]
    libdir = /var/lib/puppet/lib

[puppetd]
    pluginsync=true
    plugindest=/var/lib/puppet/lib
これでiptablesリソースが使えるようになったはずです。

下記の設定は、内側からの接続、localhost、及びSSHのパケット以外を全てドロップする基本的なiptablesの設定を記述しています。
# Allow packets that belong to or related to an existing connection
iptables { 'allow established, related':
    state => ['ESTABLISHED', 'RELATED'],
    proto => 'all',
    jump  => 'ACCEPT',
}

# Allow all packets from localhost
iptables { 'allow localhost':
    source => '127.0.0.1',
    proto  => 'all',
    jump   => 'ACCEPT',
}

# Allow all packets to SSH
iptables { 'allow ssh':
    proto => 'tcp',
    dport => 22,
    jump  => 'ACCEPT',
}

# Drop all incoming packets by default
iptables { 'drop incoming packets':
    chain => 'INPUT',
    proto => 'all',
    jump  => 'DROP',
}

最後に


この記事では非常に基本的なPuppetの使用法及び設定例を紹介しました。もしPuppetにご興味を持たれた場合は、Puppetのオフィシャルドキュメントを参照してください。日本語のリソースでは、「オープンソースなシステム自動管理ツール Puppet」にもより詳しい情報があります。

0 コメント:

コメントを投稿