アルパカ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-test
sysctl -a で確認すると反映しているはず!
次回
今回入れる予定だったユーザ管理の部分を書いてみようと思います。