ようへいの日々精進XP

よかろうもん

一応、puppet も弄った一部始終

要件

  • 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 利用時の問題点は未解決