まめ畑

ゆるゆると書いていきます

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
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

  • 証明をする際にドメインがいるので、DNSに登録するか/etc/hostsに書いておく
    • boot.test.com client1.test.comを今回使う
  • Ruby製なのでRuby入れておく
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
  • マニフェスト例(MySQLを全クライアントにインストールして、rootパスワードをtestにする)
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

最終行でリブート時に実行するようにしてる。
起動スクリプトを設定してもいい