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
- /tftpboot/centos5.5/pxelinux.cfg/default (default の部分をクライアントのIP or MACアドレスを16進表記で表したもの
にして保存すると、クライアントマシン毎に設定を変えられる。読み込み時には文字を最後から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
- 解凍して、coreディレクトリ内のpxelinux.0をコピー
cp pxelinux.0 /tftpboot/centos5.5/
- /etc/exportsを編集
/iso/ 192.168.147.0/255.255.255.0(ro)
/etc/init.d/portmap restart /etc/init.d/nfs restart
- ネットワークインストールでNFSインストールを選択 BootサーバのIPと/iso/を入力
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
- 署名を求めてくるので、サーバ側で署名する(取りあえず手動)
- 一旦、サーバのpuppetを止めて以下を実行(自動でなければ、一旦クライアントからアクセスを受ける必要がある)
puppetca --sign client1.test.com
- 自動で署名を行う場合は /etc/puppet 配下に「autosign.conf」というファイルを作成し、
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
404 - エラー: 404
in.tftpd(8) - Linux man page
TFTPサーバにする
unoh.github.com by unoh
しげふみメモ : PXEでネットワークブートしてLinuxをインストール(x86_64)
Red Hat Enterprise Linux - Red Hat Customer Portal
Puppet Labs: IT Automation Software for System Administrators
Puppet Labs Documentation
オープンソースなシステム自動管理ツール Puppet|gihyo.jp … 技術評論社
404 Not Found
Gosuke Miyashita