ようへいの日々精進XP

よかろうもん

chef-solo と knife を組み合わせてリモートの CentOS サーバーをとりあえず使える状態にするまでの一部始終

要件

  • CentOS サーバーであること
  • バージョンは 5 系で 64 bit 版
  • 不要なサービスは停止すること
  • SELinux は停止すること
  • root アカウントでの ssh ログインは停止すること
  • グループ serveradmin とユーザー hoge の作成すること
  • yum のリポジトリ設定に関しては priority の設定を行うこと
  • 追加リポジトリは rpmforge のみ設定を行うこと
  • パッケージは下記をインストールすること
    • vim-enhanced
    • screen

謝辞

環境

準備

  • 要件を整理して recipe に落とし込む
  • cookbook は少ない方が良いらしいけど、今回はお試しということで要件ごとに cookbook を用意することにする
要件 リソース cookbook
不要なサービス停止 service def_setting
SELinux 停止 template def_setting
root アカウントによる ssh ログイン停止 template def_setting
グループ serveradmin とユーザー hoge の作成すること group + user create_user
yum のプラグインとして yum-fastestmirror と yum-priorities をインストール package yum_setting
追加リポジトリは rpmforge を追加 cookbook_file + package yum_setting
パッケージは vim-enhanced と screen package packages_install

手順

対象 node

  • 対象 node 上で chef-solo を実行するユーザーを作成
  • 上記のユーザーは管理ワークステーションからパスワード無しにてログイン出来るようにしておく
  • 上記のユーザーは対象 node にてパスワード無しで sudo が利用出来るようにしておく

管理用ワークステーション

1. chef-solo が利用出来るようにする(こちらを参考)
2. knife-solo のインストール

sudo gem install knife-solo

3. ~/.chef/knife.rb を設定する

knife[:solo_path] = '/tmp/chef-solo'

4. 新規 chef リポジトリの作成

cd ~
knife solo init chef-repo

5. 対象 node にて chef が利用出来るようにする

knife solo prepare chefsolo@${対象node}

それぞれの cookbook の recipe

  • resource の template と cookbook_file をゴッチャにしてしまっているので注意
cookbook を作成する
cd chef-repo/site-cookbooks/
knife cookbook create create_user -o ./
knife cookbook create def_setting -o ./
knife cookbook create yum_setting -o ./
knife cookbook create app_setting -o ./
def_setting
# sshd の root ログインの停止
service "sshd" do
        supports :status => true, :restart => true, :reload => true
        action [:enable, :start]
end
template '/etc/ssh/sshd_config' do
        source  'ssh/sshd_config.erb'
        owner   'root'
        group   'root'
        mode    '0600'
        notifies :reload, 'service[sshd]'
end

# SELinux を無効化
template '/etc/selinux/config' do
        source  'selinux/config'
        owner   'root'
        group   'root'
        mode    '0644'
end

# 不要なサービスの停止
%w{cpid apmd atd auditd autofs avahi-daemon avahi-dnsconfd bluetooth cups dhcdbd firstboot gpm hidd ip6tables iptables isdn mcstrans mdmonitor netfs nfslock pand pcscd portmap readahead_early restorecond rpcgssd rpcidmapd yum-updatesd xfs}.each do |service_name|
        service service_name do
                action [:disable, :stop]
        end
end
create_user
# serveradmin グループを作成
group "serveradmin" do
        gid 1001
end
# hoge ユーザーを作成
user "hoge" do
        comment "Test User"
        uid 1002
        gid 1002
        home "/home/hoge"
        shell "/bin/bash"
        password "$1$Icg/iil8$DOq45aRmvzrSjwdrZOYuC."
end
  • password は下記のコマンドにて作成する
openssl passwd -1
yum_setting
  • 昨日の Chef ハンズオンで質問する前に書いたレシピなので rpmforge の RPM を cookbook_file で転送してインストールしている...
# yum-fastestmirror yum-priorities のインストール
%w{yum-fastestmirror yum-priorities}.each do |package_name|
        package package_name do
                action [:install]
        end
end
# CentOS-Base.repo の設定
template "/etc/yum.repos.d/CentOS-Base.repo" do
        source  'yum.repos.d/CentOS-Base.repo.erb'
        owner   'root'
        group   'root'
        mode    '0644'
end

# rpmforge リポジトリのインストール
rpmforgefile="rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm"
cookbook_file "/tmp/#{rpmforgefile}" do
        mode 0644
        checksum "2df746e6fa066607c3a177578472f6dbb1a7fc6b8e53b79a2373d6ce9774da17"
end
package "rpmforge" do
        action :install
        source "/tmp/#{rpmforgefile}"
        provider Chef::Provider::Package::Rpm
end

# rpmforge の設定
template "/etc/yum.repos.d/rpmforge.repo" do
        source  'yum.repos.d/rpmforge.repo.erb'
        owner   'root'
        group   'root'
        mode    '0644'
end
  • checksum は下記のようにして取得する
sha256sum rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
packages_install
# パッケージのインストール
%w{vim-enhanced screen}.each do |package_name|
  package package_name do
    action :install
  end
end

レッツ cooking

knife solo cook で対象 node に各 cookbook を反映
knife solo cook chefsolo@${対象node}
対象 node にて設定の反映を行う
  • root ユーザーで対象 node に ssh でログインしてみる(ログイン出来ないはず...)
  • SELinux が disabled になってるかを確認する(要 node 再起動)
  • 等など

まとめ

  • knife-solo を使って OS をインストールしたてのサーバー(対象 node)を chef で設定出来る
  • knife solo prepare で対象 node にて chef が利用出来るようにする
  • あとは cookbook 作って recipe 書いて適用
  • 対象 node で chef を実行するユーザーに対してパスワード無しで sudo が使える権限を与える必要がある
  • 今後はサーバーを手動で設定するのは禁止だなと...
  • 昨日のハンズオンで質問した内容を生かして recipe を修正したい
    • template を file へ
    • cookbook_file を http_request に