こんにちは。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」にもより詳しい情報があります。