アルパカchef日記2日目 OS周りのクックブックなど
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
リモートサーバの初期化処理(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
完了すると
このファイルに記述されたレシピがサーバ上で実行されます。
selinux
SELinuxは無効にしておきたいですよね!*3
selinuxに関してはopscodeのレシピをそのまま使えます。
また、今後epelリポジトリを使いたくなりそうなので
yumクックブックも一緒に作ってしまいます。
Berksfileに書いてクックブックをダウンロードしましょう。
selinux/yumクックブックをインストール
# vi Berksfile site :opscode cookbook 'selinux' cookbook 'yum' # Berksfileの内容をcookbooksにインストール berks install --path cookbooks
nodes json編集
knife soloでselinuxのクックブックを実行させるため、nodes jsonファイルを編集します。
vi
{
"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のレシピをコピペして編集します。
今回は以下のような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-testsysctl -a で確認すると反映しているはず!
次回
今回入れる予定だったユーザ管理の部分を書いてみようと思います。