要件
- OS インストール以降の手順を自動化したい
- とりあえず puppet?
- chef とどっちにするか悩んだ結果 puppet 採用(当時)
- puppet の詳細についてはググって下さいませ...
実装
puppet master のインストール
パッケージのインストール
# yum install ruby # yum install ruby-shadow # yum install puppet puppet-server facter
autosign.conf の設定
- 自動で署名するドメインを記載する
*.example.jp
master の起動
chkconfig --level 3 puppet-master on /sbin/service puppet-master start
puppet agent のインストール
パッケージのインストール
sudo yum install ruby sudo yum install ruby-shadow -y sudo yum install puppet facter -y
agent のテスト起動
sudo puppet agent --server=puppet.example.jp --no-daemonize --verbose
簡単なマニフェスト例
ファイル作成
/tmp/ 以下に hoge.txt というテキストファイルがパーミッション 644 オーナー root:root で作成する。
/etc/puppet/manifests/site.pp を下記のように記載
import 'nodes.pp' $puppetserver = 'master.example.com'
/etc/puppet/manifests/nodes.pp を下記のように記載
node 'agent.example.com' { include check_file_hoge }
必要なディレクトリを作成する
sudo mkdir /etc/puppet/modules/check_file_hoge/{files,templates,manifests}
/etc/puppet/modules/check_file_hoge/manifests/init.pp を下記のように記載
class check_file_hoge { file { "/tmp/hoge.txt": owner => "root", group => "root", source => "puppet://$puppetserver/modules/check_file_hoge/tmp/hoge.txt", } }
設置するファイルを作成する
sudo mkdir /etc/puppet/modules/check_file_hoge/files/tmp sudo touch /etc/puppet/modules/check_file_hoge/files/tmp/hoge.txt
パッケージインストール
/etc/puppet/manifests/nodes.pp を下記のように記載
node 'agent.example.com' { include package_setting }
必要なディレクトリを作成する
sudo mkdir /etc/puppet/modules/package_setting sudo mkdir /etc/puppet/modules/package_setting/{files,templates,manifests}
マニフェストを下記のように記載する
class package_setting { package { httpd: ensure => latest, } package { php: ensure => installed, require=> Package['httpd'], } service { httpd: ensure => running, enable => true, require=> Package['httpd'], } package { mysql-server: ensure => latest, } service { mysqld: ensure => running, enable => true, require=> Package['mysql-server'] } }
悩んだ点
署名の自動化
/etc/puppet/autosign.conf を設定する
*.example.jp
自動署名を行う agent のドメインを記載する。
yum リポジトリの設定
リソースタイプ exec を利用する
class yum_setting { file { "/etc/yum.repos.d/CentOS-Base.repo": owner => "root", group => "root", mode => 644, source => "puppet://$puppetserver/modules/yum_baseline/etc/yum.repos.d/CentOS-Base.repo", } $rpmforge_url = 'http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm' exec { "wget $rpmforge_url": creates => '/tmp/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm', cwd => '/tmp', path => [ '/usr/bin','/usr/sbin' ], } exec { 'rpm -Uvh /tmp/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm': cwd => '/tmp', path => [ '/bin','/usr/bin','/usr/sbin' ], require => Exec["wget $rpmforge_url"], } }
リソースタイプ exec はあまり使うものではないらしいけど、他に解決策が思いつかなかった。初回実行時には問題無いけど、二回目以降の実行では、
err: /Stage[main]/Yum_setting/Exec[rpm -Uvh /tmp/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm]/returns: change from notrun to 0 failed: rpm -Uvh /tmp/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm returned 1 instead of one of [0] at /etc/puppet/modules/yum_setting/manifests/init.pp:32
のようなエラーが出力されてしまう。これは、既にインストール済みの rpm パッケージをインストールしようとした際に、下記のように already installed となりステータスコードが 1 となる為、puppet 側で正常終了(主に 0)と判断されないことが原因。
# rpm -Uvh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm Preparing... ########################################### [100%] package rpmforge-release-0.5.2-2.el5.rf.x86_64 is already installed
一応、該当のマニフェストに下記を記載して回避はできるようだが、これだと初回実行時にエラーとなってしまうのでどうしたもんだか。
returns => ['1']
まとめ
- puppet を使って従来 30 分程度掛かっていたサーバーセットアップが OS のインストールを含めて 20 分以下になった
- 世の中のトレンド的には chef のようだけど構成管理ツールの素晴らしさを気づかせてくれた puppet でした
- リソースタイプの package のサブオプションによって常に最新版をインストールするか否かが異なる
- installed
- latst
- リソースタイプの exec 利用時の問題点は未解決