アルパカchef日記2日目 OS周りのクックブックなど

1日目の続き。
コンセプトはこちらをご参照下さい。

2日目…の前に補足など

バージョンや構成についてのメモ。

chef 11.4.0
knife solo 0.3.0-pre4
ディレクトリ構成

基本的には knife solo init で作られたものです。
/
 ▸ cookbooks/    # Berkfileで管理するcookbook。基本的には手動でいじらない。
 ▸ data_bags/    # グローバルな変数を管理したい時に使う。
 ▸ nodes/      # サーバ毎の変数やレシピを記述する
 ▸ roles/      # ロール毎の変数やレシピを記述する。
 ▸ site-cookbooks/ # site cookbook。独自のレシピを書いたり、cookbooksをオーバーライドするためのレシピを書いたりする。
 ▸ .chef/knife.rb  # knife solo init で作られた雛形。必要に応じて編集。
 ▸ Berksfile     # opscodeやgithubのcookbookを管理するためのファイル。

knife soloコマンドについて

knife soloコマンドはgithubから最新のソースコードを取ってきてインストールしましょう。
gem install knife --pre でインストールしたバージョン*1にはいくつかバグがあるようです。

knife-solo 0.2.0からknife-solo 0.3.0にアップデートする場合の注意点

元々knife-solo 0.2.0を使っていて、knife-solo 0.3.0にアップデートする場合、
必ず前のバージョンを全て削除してからインストールしましょう!
また、初期ディレクトリもコマンドで作りなおしたほうが良いです。
自分はこれで結構ハマりました…

# 前のバージョンを削除
gem uninstall knife-solo --version '= 0.2.0'
# 新しく入れなおす
git clone https://github.com/matschaffer/knife-solo.git
cd knife-solo
rake install

# chefリポジトリもinitしなおす
knife solo init new-chef-repo-name

2日目の目標

  • os周り
  • ユーザ管理*2
    • ユーザ作成
    • bash_profile管理
    • sudo
    • security_limit

リモートサーバの初期化処理(chef-soloインストール)

ssh/configの設定とknife solo prepareは実行済みでしょうか?
していなければprepareを実行してEC2にchef-soloをインストールしましょう。

# ssh config設定
vi .ssh/config
Host ec2-chef-test
   HostName     ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
   IdentityFile /path/to/private.pem
   User         ec2-user
   Port         22

# リモートサーバにchef-soloをインストールする(最初の一回のみでOK)
knife solo prepare ec2-chef-test

完了すると /nodes/ec2-chef-test.json が自動で作成されます。
このファイルに記述されたレシピがサーバ上で実行されます。



selinux

SELinuxは無効にしておきたいですよね!*3
selinuxに関してはopscodeのレシピをそのまま使えます。
また、今後epelリポジトリを使いたくなりそうなので
yumクックブックも一緒に作ってしまいます。
Berksfileに書いてクックブックをダウンロードしましょう。

selinux/yumクックブックをインストール
# vi Berksfile
site :opscode
cookbook 'selinux'
cookbook 'yum'

# Berksfileの内容をcookbooksにインストール
berks install --path cookbooks

これでselinux/yumのクックブックがcookbooksディレクトリにインストールされました。

nodes json編集

knife soloでselinuxのクックブックを実行させるため、nodes jsonファイルを編集します。
vi /nodes/ec2-chef-repo.json*4

{
    "run_list":[
        "recipe[selinux::disabled]",
        "recipe[yum::epel]"
    ]
}

これで
selinuxクックブック」の「disabledレシピ」と
yumクックブック」の「epelレシピ」を
実行させるための準備ができました。
knife soloでリモートサーバにインストールしましょう。

knife solo cook ec2-chef-test

エラーが表示されなければ成功です!



openssh

ssh周りの設定も行いたいのでレシピを書きます。
これもまずはopscodeからダウンロードしましょう。

# vi Berksfile
site :opscode
cookbook 'selinux'
cookbook 'yum'
cookbook 'sysctl'

# install
berks install --path cookbooks

これでcookbooksはダウンロードされました。
が、opensshに渡すパラメータを編集したいですよね。
cookbooksを直接編集するのはよろしくないので、普通は以下のような方法で実現します。

  • nodes jsonにパラメータを書く
  • site_cookbooksでattributesをオーバーライドする

今回はsite_cookbooksを使う方法を選択します。

/site_cookbooks/openssh/attributes/default.rb を書く

site_cookbooks以下にファイルを追加します。
knife createコマンドでクックブックを作っても良いですが、
余計なディレクトリが出来てしまうのでファイルを直接作ってもOKです。

mkdir site_cookbooks/openssh/attributes
vi site_cookbooks/openssh/attributes/default.rb

このファイルの内容は
/cookbooks/openssh/attributes/default.rb
をオーバーライドする形となりますので、
cookbooksのレシピをコピペして編集します。
今回は以下のようなattributesにしました。

default['openssh']['package_name'] = case node['platform_family']
                                     when "rhel", "fedora"
                                       %w{openssh-clients openssh}
                                     when "arch","suse"
                                       %w{openssh}
                                     else
                                       %w{openssh-client openssh-server}
                                     end

default['openssh']['service_name'] = case node['platform_family']
                                     when "rhel", "fedora","suse"
                                       "sshd"
                                     else
                                       "ssh"
                                     end

# ssh config group(default)
default['openssh']['client']['host'] = "*"
default['openssh']['server']['authorized_keys_file'] = "%h/.ssh/authorized_keys"
default['openssh']['server']['challenge_response_authentication'] = "no"
default['openssh']['server']['use_p_a_m'] = "yes"

# 以下の項目をカスタマイズ
default['openssh']['server']['permit_root_login'] = "no"
default['openssh']['server']['password_authentication'] = "no"

cooking

ではnodes jsonに追加してcookしましょう。

vi <chef-repo>/nodes/ec2-chef-repo.json
{
    "run_list":[
        "recipe[selinux::disabled]",
        "recipe[yum::epel]",
        "recipe[openssh]"
    ]
}

# cook
knife solo cook ec2-chef-test

問題なく正常終了したでしょうか?
心配であればサーバにログインして /etc/ssh/sshd_config の内容を確認してみましょう。
attributesで記述した内容が反映しているはずです。



ntp

上記と同じようにopscodeからダウンロードしてberks installします。

Berksfile編集/インストール
# Berksfileに以下を追加。berks install も忘れずに。
cookbook 'ntp'
/site_cookbooks/ntp/attributes/default.rb を書く

opensshと同じように、cookbooksからコピペしてオーバーライドします。

# 変えたのは servers のみ。他のはcookbooksと同じもの。
default['ntp']['servers']   = %w{ ntp.nict.jp ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp }
default['ntp']['peers'] = Array.new
default['ntp']['restrictions'] = Array.new

default['ntp']['packages'] = %w{ ntp ntpdate }
default['ntp']['service'] = "ntp"
default['ntp']['varlibdir'] = "/var/lib/ntp"
default['ntp']['driftfile'] = "#{node['ntp']['varlibdir']}/ntp.drift"
default['ntp']['statsdir'] = "/var/log/ntpstats/"
default['ntp']['conf_owner'] = "root"
default['ntp']['conf_group'] = "root"
default['ntp']['var_owner'] = "ntp"
default['ntp']['var_group'] = "ntp"
default['ntp']['leapfile'] = "/etc/ntp.leapseconds"

# overrides on a platform-by-platform basis
case platform
when "redhat","centos","fedora","scientific","amazon","oracle"
  default['ntp']['service'] = "ntpd"
  default['ntp']['packages'] = %w{ ntp }
  if node['platform_version'].to_i >= 6
    default['ntp']['packages'] = %w{ ntp ntpdate } 
  end
when "freebsd"
  default['ntp']['service'] = "ntpd"
  default['ntp']['varlibdir'] = "/var/db"
  default['ntp']['driftfile'] = "#{node['ntp']['varlibdir']}/ntpd.drift"
  default['ntp']['statsdir'] = "#{node['ntp']['varlibdir']}/ntpstats"
  default['ntp']['packages'] = %w{ ntp }
  default['ntp']['conf_group'] = "wheel"
  default['ntp']['var_group'] = "wheel" 
end

cooking

ではnodes jsonに追加してcookしましょう。

vi <chef-repo>/nodes/ec2-chef-repo.json
{
    "run_list":[
        "recipe[selinux::disabled]",
        "recipe[yum::epel]",
        "recipe[openssh]",
        "recipe[ntp]"
    ]
}

# cook
knife solo cook ec2-chef-test

バッチリntpが動くはず!いえーい



sysctl

sysctlクックブックでカーネルパラメータのチューニングを行います。

Berksfile編集 / インストール
# Berksfileに以下を追加。berks install も忘れずに。
cookbook 'sysctl'
/site_cookbooks/sysctl/attributes/default.rb を書く
case platform_family
# amazon を追加
when 'debian', 'rhel', 'amazon'
  # ここの下にchef用のinclude sysctl.confがインストールされる
  default['sysctl']['conf_dir'] = '/etc/sysctl.d'
else
  default['sysctl']['conf_dir'] = nil
end
default['sysctl']['params'] = {}
default['sysctl']['allow_sysctl_conf'] = false

# base
default['sysctl']['params']['fs']['file-max'] = 100000
default['sysctl']['params']['net']['ipv4']['netfilter']['ip_conntrack_max'] = 1000000
default['sysctl']['params']['net']['ipv4']['ip_local_port_range'] = "1024 65535"
default['sysctl']['params']['net']['core']['somaxconn'] = 40960

# for redis
default['sysctl']['params']['vm']['overcommit_memory'] = 1

# network
default['sysctl']['params']['net']['core']['rmem_default'] = 8388608
default['sysctl']['params']['net']['core']['rmem_max'] = 8388608
default['sysctl']['params']['net']['core']['wmem_default'] = 8388608
default['sysctl']['params']['net']['core']['wmem_max'] = 8388608
default['sysctl']['params']['net']['core']['netdev_max_backlog'] = 10000

# 必要に応じて
#default['sysctl']['params']['vm']['swappiness'] = 0
#default['sysctl']['params']['net']['ipv4']['tcp_max_syn_backlog'] = 40000
#default['sysctl']['params']['net']['ipv4']['tcp_timestamps'] = 0
#default['sysctl']['params']['net']['ipv4']['tcp_window_scaling'] = 1
#default['sysctl']['params']['net']['ipv4']['tcp_fin_timeout'] = 15
#default['sysctl']['params']['net']['ipv4']['tcp_keepalive_intvl'] = 30
#default['sysctl']['params']['net']['ipv4']['tcp_tw_reuse'] = 1

cooking

ではnodes jsonに追加してcookしましょう。

vi <chef-repo>/nodes/ec2-chef-repo.json
{
    "run_list":[
        "recipe[selinux::disabled]",
        "recipe[yum::epel]",
        "recipe[openssh]",
        "recipe[ntp]",
        "recipe[sysctl]"
    ]
}

# cook
knife solo cook ec2-chef-test

sysctl -a で確認すると反映しているはず!



次回

今回入れる予定だったユーザ管理の部分を書いてみようと思います。

余談

platformの
「when .. case」に'amazon'が入ってなくてゲンナリすることが多い。
rhelcentosと一緒にamazonも書いて欲しい…

*1:knife-pre3

*2:3日目に後回し…

*3:実はAmazonLinuxはデフォルトで無効なのですが^^

*4:ご自分の環境によってファイル名が異なるかもしれません