2010-06-11 PXEBootとKickstartとPuppetで自動化してみる
■[Server][PXEBoot][Kickstart][Puppet]PXEBootとKickstartとPuppetで自動化してみる

PXEBootとPuppetでOSのインストールといろんな設定を自動化・省力化しようと思って試行錯誤中です。
試行錯誤のメモ
やること
PXE Boot+Kickstart+Puppetを使用してサーバの自動設定
PXE Boot (CentOS5.5)
yum install tftp tftp-server
- /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -c -u root -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
only_from = 192.168.147.0/24,127.0.0.1
}
sudo /etc/init.d/xinetd restart
インストールするOSのISOを用意(今回はCentOS5.5)
以下、ISOを「/iso/」に、マウント先を「/pxeiso/centos5.5」
sudo mkdir /pxeiso sudo mkdir /pxeiso/centos5.5 sudo mount -t iso9660 -o loop /iso/CentOS-5.5-i386-bin-DVD.iso /pxeiso/centos5.5
- syslinuxがインストールされているか確認
- いなかったら
sudo yum install syslinux
- ブートイメージの保存先の作成とデータのコピー
mkdir /tftpboot/centos5.5 cd /pxeiso/centos5.5/images/pxeboot sudo cp vmlinuz /tftpboot/centos5.5/ sudo cp initrd.img /tftpboot/centos5.5/
- pxeブートの設定ファイル作る
mkdir /tftpboot/centos5.5/pxelinux.cfg
にして保存すると、クライアントマシン毎に設定を変えられる。読み込み時には文字を最後から1字ずつ削りマッチさせていくので、
レンジの指定も可能。最後にdefault)
default centos5 label centos5 prompt 1 timeout 100 kernel vmlinuz append load initrd=initrd.img devfs=nomoun
- DHCP入れる
sudo yum install dhcp sudo cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
- /etc/dhcpd.conf
ddns-update-style interim;
ignore client-updates;
subnet 192.168.147.0 netmask 255.255.255.0 { #自分の環境に合わせる
# --- default gateway
option routers 192.168.147.2;
option subnet-mask 255.255.255.0;
# option nis-domain "domain.org";
# option domain-name "domain.org";
option domain-name-servers 192.168.147.2;
option time-offset -18000; # Eastern Standard Time
filename "/centos5.5/pxelinux.0"; #追加
next-server 192.168.147.129; #PXEブートサーバのIPアドレス
# option ntp-servers 192.168.10.1;
# option netbios-name-servers 192.168.10.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;
range dynamic-bootp 192.168.147.128 192.168.147.254;
default-lease-time 21600;
max-lease-time 43200;
# we want the nameserver to appear at a fixed address
# host ns {
# next-server marvin.redhat.com;
# hardware ethernet 12:34:56:78:AB:CD;
# fixed-address 207.175.42.254;
# }
}
sudo /etc/init.d/dhcpd restart
- pxelinux.0がみつからんかったので
wget ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.86.tar.gz
cp pxelinux.0 /tftpboot/centos5.5/
- /etc/exportsを編集
/etc/init.d/portmap restart /etc/init.d/nfs restart
kickstart
- /ks/ に ks.cfgを作成して以下を記述
- /etc/exportsを編集
/ks/ 192.168.147.0/255.255.255.0(ro)
/etc/init.d/portmap restart /etc/init.d/nfs restart
- /root/anaconda-ks.cfgにインストール時に選択した物が書き込まれているので、コピーしてお好みに編集する
- %postセクションの後に書いた処理がインストール後に実行される(ユーザの作成や必要なパッケージの作成など)
例:
install
text
nfs --server=192.168.147.129 --dir=/iso/
lang ja_JP.UTF-8
keyboard jp106
xconfig --startxonboot
network --device eth0 --bootproto=static --ip=192.168.147.11 --netmask=255.255.255.0 --gateway=192.168.147.2 --nameserver=192.168.147.2 --hostname pxe.test.com
rootpw --iscrypted **********************
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --disable
timezone Asia/Tokyo
reboot
bootloader --location=mbr --driveorder=sda --append="rhgb quiet"
autopart
clearpart --all --initlabel
%packages
@base
@core
@development-libs
@development-tools
@editors
@japanese-support
@ruby
keyutils
trousers
fipscheck
device-mapper-multipath
imake
- /tftpboot/centos5.5/pxelinux.cfg/default を変更
append ks=nfs:192.168.147.129:/ks/ks.cfg load initrd=initrd.img devfs=nomount
Puppet
wget http://reductivelabs.com/downloads/facter/facter-latest.tgz gzip -d -c facter-latest.tgz | tar xf - cd facter-* sudo ruby install.rb wget http://reductivelabs.com/downloads/puppet/puppet-latest.tgz gzip -d -c puppet-latest.tgz | tar xf - cd puppet-* sudo ruby install.rb
- マニフェストファイル置き場を作る
sudo mkdir -p /etc/puppet/manifests sudo touch /etc/puppet/manifests/site.pp
class mysql-server {
$password = 'test'
package { 'mysql-server': ensure => installed }
service { 'mysqld':
ensure => running,
subscribe => Package['mysql-server'],
}
exec { 'Set MySQL server root password':
subscribe => Package['mysql-server'],
require => Service['mysqld'],
refreshonly => true,
unless => "mysqladmin -uroot -p$password status",
path => '/bin:/usr/bin',
command => "mysqladmin -uroot password $password",
}
}
node default {
include 'mysql-server'
}
- 初回起動だけ --mkuserをつける
sudo puppetmasterd --verbose --mkusers
puppetd --server boot.test.com --verbose
puppetca --sign client1.test.com
client1.test.com とか *.test.com
のように記述しておけばいい
(もし、クライアント側で署名のエラーが出たら、puppetサーバの /etc/puppet/ssl/ca/signed 中にあるクライアントの証明ファイルを消してみるとかいいかも)
- サーバ起動
kickstartでPuppetも入れる
- %postに以下を記述
%post --log=root/anaconda-post.log --erroronfail echo "192.168.147.129 boot.test.com" >> /etc/hosts wget http://reductivelabs.com/downloads/facter/facter-latest.tgz gzip -d -c facter-latest.tgz | tar xf - cd facter-* ruby install.rb wget http://reductivelabs.com/downloads/puppet/puppet-latest.tgz gzip -d -c puppet-latest.tgz | tar xf - cd puppet-* ruby install.rb mkdir -p /etc/puppet/manifests touch /etc/puppet/manifests/site.pp echo "@reboot /usr/sbin/puppetd --server boot.test.com --verbose" >> /var/spool/cron/root
最終行でリブート時に実行するようにしてる。
起動スクリプトを設定してもいい
参考にしたサイト
VirtualBoxの仮想マシンをディスクレス化させる - 酔いどれコード
CentOS で tftp を使う - ~fumi/ChangeLog
ウノウラボ by Zynga Japan: Linuxをネットワーク経由で自動インストールする方法(後編)
しげふみメモ : PXEでネットワークブートしてLinuxをインストール(x86_64)
Puppet Labs: IT Automation Software for System Administrators
Documentation | Puppet Labs - Puppet Labs Documentation

大変素晴らしい記事だと思いますが、kickstart の部分は cobbler を使うともっと手軽に設定することができます。
詳しは、僕のブログの cobbler タグのエントリをチェックしてみてください!
確かに、簡単に設定することができますね。
ありがとうございます!