2013-05-16
■[chef]アルパカchef日記3日目 data bagについて / またはユーザ管理クックブックなど

2日目の続き。
コンセプトはこちらをご参照下さい。
3日目の目標
3日目を始める前に:data bag
ユーザ情報など、クックブックを跨るグローバルな値を
cookbookにいちいち書くのは得策ではありません。
さらに生で置いておくのも気が引けますね。
そんなご要望にお答えするために「data bag」という仕組みがあります。
databagを作成しておくと、複数のクックブックにまたがっている共通の変数などを保存しておくことができます。
シークレットキーを作成する
まずはdata bagを暗号/複合するためのシークレットキーを作成しましょう。
以下のコマンドでdata bag用の鍵ファイルを作っておきます。
openssl rand -base64 512 > data_bag_key # 「unable to write 'random state'」というエラーが出る場合はsudo実行しましょう
鍵を共通ディレクトリに置く
chef-repo毎に鍵を作ってもいいのですが、毎回作るのも面倒なので
今回は共通で参照できるHOMEディレクトリ以下に置いてしまいましょう。
mv data_bag_key ~/.chef/data_bag_key # knife.rbに「encrypted_data_bag_secret」を追加 vi <chef-repo>/.chef/knife.rb ... encrypted_data_bag_secret "#{ENV['HOME']}/.chef/data_bag_key" ...
data bagを作成/編集する
knife soloコマンドでdata bagを新規作成します。
この時「EDITOR環境変数」を予め設定しておく必要があるので
未設定の場合は .bashrc などに追記しておきましょう。
vi .bashrc ... " 以下を追加 export EDITOR=vim ... # databagの作成 # 「databags/users/alpaca3.json」が作られる knife solo data bag create users alpaca3 # 編集する場合はedit knife solo data bag edit users alpaca3
この時の注意点として
databags/users/alpaca3.jsonを直接編集することはできません。*1
データを編集したい場合は knife solo data bag edit コマンドから行う必要があります。
ユーザ作成
今回は完全オリジナルの「user-origin」クックブックを作ります。
が、その前にユーザのdata bagを作っておきましょう。
「alpaca3」というユーザを作ります。
create databag
knife solo data bag create users alpaca3
<chef-repo>/databags/users/alpaca3.json の中身
以下のように編集しましょう。
{
"id": "alpaca3",
"name": "alpaca3",
"password": "$1$xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ssh_key": "ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxx"
}
passwordについて
chefに記述するパスワード文字列はshadow passwordにする必要があるようです。
以下のコマンドで標準出力された文字列をpasswordの欄に設定しましょう。
openssl passwd -1 > input > verify input $1$xxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- これ!
※参考ドキュメント
http://docs.opscode.com/resource_user.html#password-shadow-hash
ssh_keyについて
今回はec2-userの鍵を拝借しましょう。
一度 ec2-userでログインし、以下のコマンドで表示された文字列を「ssh_key」にします。*2
cat ~/.ssh/authorized_keys
<chef-repo>/site_cookbooks/user-origin/recipes/default.rb を書く
では、レシピを書いていきます。
少し長くなりそうなので小出ししながら説明します。
# 暗号化されたデータバッグの情報を取得
user = Chef::EncryptedDataBagItem.load("users", 'alpaca3')
user_name = user['name']
password = user['password']
ssh_key = user['ssh_key']
home = "/home/#{user_name}"
# 「alpaca3」ユーザの作成
user user_name do
password password
home home
shell "/bin/bash"
supports :manage_home => true # ホームディレクトリも管理する
end
# 「alpaca3」をwheelグループに追加する
group "wheel" do
action [:modify]
members [user_name]
append true
end
まずはユーザの作成です。
1行めの Chef::EncryptedDataBagItem.load() を用いて databagのデータをロードしています。
その情報を用いて「alpaca3」ユーザを作成します。
その後に「alpaca3」ユーザをwheelグループに追加しています。
「directory」リソースを使ってディレクトリを作成した後、
「file」リソースを使ってファイルをアップロードしています。
# .sshディレクトリを作ります
directory "#{home}/.ssh" do
owner user_name
group user_name
end
# authorized_keysファイルを作ります
authorized_keys_file ="#{home}/.ssh/authorized_keys"
file authorized_keys_file do
owner user_name
mode 0600
content "#{ssh_key} #{user_name}" # ファイルの中身を直接指定
not_if { ::File.exists?("#{authorized_keys_file}")} # 既にファイルが存在していたらリソースを実行しない
end
次にbash_profileの管理です。
まずはbash_profileをどのように管理しようとしているか説明したいと思います。
<home>
├── .bash_profile # .bash_profile。.bash_profile_inc以下のファイルを読む設定を入れておく
├── .bash_profile_inc # profile include用ディレクトリ
├── base_profile.sh # 共通profile
└── ... # ミドルウェア毎にbash_profileを用意する
他の様々なリソースが .bash_profile_inc 以下に
各々のprofileを置くような運用です。
こうすることによって、.bash_profile自体をいじらなくても
リソース毎の様々なprofileを管理しようとしています。
続きのレシピは以下のようになります。
# 1. bash_profile include用のディレクトリを作ります
directory "#{home}/.bash_profile_inc" do
owner user_name
group user_name
end
# 2.「base_profile.sh(静的ファイル)」をbash_profile include用のディレクトリに配置します
cookbook_file "#{home}/.bash_profile_inc/base_profile.sh" do
source "base_profile.sh"
mode 0644
owner user_name
group user_name
end
# 3. bash_profile本体に「.bash_profile_incディレクトリ以下のファイルを読み込む」ような処理を追加しています
script "include bash_profile" do
environment 'HOME' => home
user user_name
group user_name
interpreter "bash"
not_if "grep -q 'bash_profile_include' #{home}/.bash_profile"
flags "-e"
code <<-"EOH"
cat << EOF >> #{home}/.bash_profile 2>&1
# bash_profile_include
for file in \\`find ~/.bash_profile_inc -type f\\`; do
source \\$file
done
EOF
EOH
end
また新しいリソースが出てきたので簡単に説明を。
2. の「cookbook_file」はfilesディレクトリ以下に置かれた静的ファイルをそのままサーバに転送します。
ちなみに 2. で使用している静的ファイルの中身は
現段階で以下のような内容です。
vi files/default/base_profile.sh # 今後育っていくはず export LANG="ja_JP.UTF-8" alias sl='ls' alias ll='ls -l'
3. の「script」は「code」に書かれた内容をサーバ上で実行します。
3. で行なっている処理は既存の.bash_profileに追記を行なっているので
重複して実行したくありません。
そのため not_if で 「bash_profile_include」という文字列が存在しない時だけ実行するようにしています*3。
cooking
ではnodes jsonに追加してcookしましょう。
vi nodes/ec2-chef-repo.json
{
"run_list":[
"recipe[selinux::disabled]",
"recipe[openssh]",
"recipe[ntp]",
"recipe[sysctl]",
"recipe[user-origin]"
]
}
# cook
knife solo cook ec2-chef-test
うまくいったでしょうか?
今回は利用しませんでしたが、DataBagの内容をそのままユーザ登録に使うようなレシピもあるようです。
気になる方は試してみてはいかがでしょうか。
https://github.com/opscode-cookbooks/users
sudo
sudo管理をします。
デフォルトユーザである ec2-user に管理者権限を持たせるのはちょっと嫌なので
ec2-userのsudo権限を剥奪してalpaca3ユーザにsudo権限を付けたいと思います。
sudoクックブックはopscodeのをダウンロードします。
# Berksfileに以下を追加。berks install も忘れずに。 cookbook 'sudo'
<chef-repo>/site_cookbooks/sudo/attributes/default.rb を書く
usersはalpaca3のみにしておきます。
default['authorization']['sudo']['groups'] = [] default['authorization']['sudo']['users'] = ['alpaca3'] # 心配であれば最初だけec2-userを残したままにしておいても良いです #default['authorization']['sudo']['users'] = ['ec2-user', 'alpaca3'] default['authorization']['sudo']['passwordless'] = true default['authorization']['sudo']['include_sudoers_d'] = false default['authorization']['sudo']['agent_forwarding'] = false default['authorization']['sudo']['sudoers_defaults'] = ['!lecture,tty_tickets,!fqdn']
cooking
ではnodes jsonにレシピを追加してcookしましょう。
vi nodes/ec2-chef-repo.json # sudo追記 ... # cook knife solo cook ec2-chef-test
このレシピが成功したあとは ec2-userでのsudoができなくなります。
すなわちknife soloの実行もできなくなります。
ssh/configでユーザの指定「alpaca3」に変えておきましょう。
# 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 alpaca3 Port 22
Caution!!!!
sudoクックブックはデフォルトのまま(site-cookbooksを用意しないまま)実行してしまうと
ご注意下さい。
security_limits
security_limitsもオリジナルで作成してみます。
出来上がるファイルはこんな感じ。
security_limits
├── attributes
│ └── default.rb
├── recipes
│ └── default.rb
└── templates
└── default
└── limits.conf.erb
<chef-repo>/site_cookbooks/security_limits/attributes/default.rb
# 設定したいユーザ配列 default['security_limits']['users'] = ['alpaca3', 'nobody'] # soft / hard limitの設定 default['security_limits']['soft'] = 10240 default['security_limits']['hard'] = 10240
<chef-repo>/site_cookbooks/security_limits/recipes/default.rb
# テンプレート読み込む template '/etc/security/limits.conf' do source "limits.conf.erb" mode "0644" variables( :users => node['security_limits']['users'], :hard_limit => node['security_limits']['hard'], :soft_limit => node['security_limits']['soft'] ) end
<chef-repo>/site_cookbooks/security_limits/templates/default/limits.conf.erb
# Dynamically generated file dropped off by Chef! <% @users.each do |user| %> <%= user %> hard nofile <%= @hard_limit %> <%= user %> soft nofile <%= @soft_limit %> <% end %>
cooking
ではnodes jsonにレシピを追加してcookしましょう。
vi nodes/ec2-chef-repo.json # security_limits追記 ... # cook knife solo cook ec2-chef-test
うまくいくと、サーバ上に以下のようなファイルが作成されているはずです。
$ cat /etc/security/limits.conf # Dynamically generated file dropped off by Chef! alpaca3 hard nofile 10240 alpaca3 soft nofile 10240 nobody hard nofile 10240 nobody soft nofile 10240
補足
今回、knife soloを実行するユーザもchefで設定/作成していますが、
これに関してはchef管理だと微妙かな〜と思ったりしています。*5
今回はあえてchef管理で行いましたが、
このあたりはケースバイケースで運用を変えても良いかもしれませんね。
次回アジェンダ
2013-05-14
■[chef][vim]アルパカChef日記番外編 VimでChefクックブックを編集する時に便利かもしれないプラグイン

今回は少し趣向を変えて、Vimのお話。
自分はビマーなので、ChefのクックブックをいじるのにもVimです。
そこでVimでクックブックを書く時に便利(?)
chef.vim
http://www.vim.org/scripts/script.php?script_id=3623
.vimrc
まずは以下を追記しておきます。
キーマップはお好きな様に。
nnoremap <silent> <leader>cf :ChefFindAny<CR> nnoremap <silent> <leader>cs :ChefFindAnySplit<CR> nnoremap <silent> <leader>cv :ChefFindAnyVsplit<CR> nnoremap <silent> <leader>cr :ChefFindRelated<CR>
attributeジャンプ
attributeっぽい名前の上で実行します。
# 「node['apt']['cacher_port']」のどこかにカーソルを置いて <leader>cf port = node['apt']['cacher_port']
カーソルを置いて <leader>cf を打鍵すると
attributeが定義されているファイルにジャンプしてくれます。
template / fileジャンプ
sourceのファイル名の上で実行します。
# 「01proxy.erb」のどこかにカーソルを置いて <leader>cf template '/etc/apt/apt.conf.d/01proxy' do source '01proxy.erb' mode 00644 end
レシピジャンプ
include_recipeのレシピ名の上で実行します。
# 「apt::cacher-client」のどこかにカーソルを置いて <leader>cf include_recipe "apt::cacher-client"
definitionジャンプ
definitions名の上で実行します
# 「authz_groupfile」のどこかにカーソルを置いて <leader>cf apache_module "authz_groupfile"
relatedジャンプ
relatedは「対になっているっぽいファイル間」を移動します。
たとえば
「recipes/default.rb」⇔「attributes/default.rb」
などです。
recipes/default.rbを開いている時に
<leader>cr を打鍵すると
attributes/default.rb へ移動します。
ドキュメントを見たい時
chefのリソースドキュメントを見たい時、いちいちWebで検索するのダルいので
ページヘ直接ジャンブ出来るようなVimスクリプト書いてみました。
かなり適当。
" jump chef doc "let g:chef_doc_browser = 'open -a Firefox' let g:chef_doc_browser = 'open -a /Applications/Google\ Chrome.app' let g:chef_doc_site = 'http://docs.opscode.com' function! ChefDocJump() let s:keyword = expand("<cword>") if s:keyword != "" let s:site_path = g:chef_doc_site .'/resource_'. s:keyword .'.html' let s:ret = system(g:chef_doc_browser. ' '. s:site_path) else echoh None endif return 1 endfunc nmap <Leader>cj :call ChefDocJump()<CR>
例:templateリソースのドキュメント見たい時
以下の場合、「template」の上にカーソルを置き
<Leader>cj を打鍵すると
指定したブラウザでopscodeのtemplateページを開きます。
template '/etc/apt/apt.conf.d/01proxy' do source '01proxy.erb' mode 00644 end
ref.vimを使う方法も
こんなのを.vimrcに追記しておいて、
let g:ref_source_webdict_sites = {
\ 'chef': {
\ 'url': 'http://docs.opscode.com/resource_%s.html',
\ },
\ }
以下のコマンドを実行するとVim上でそれなりなドキュメントが見れます。
:Ref webdict chef <リソース名>
もっと使えるものにしたいなー。。。
では、良いChefライフを。
2013-05-09
■[chef]アルパカchef日記2日目 OS周りのクックブックなど

1日目の続き。
コンセプトはこちらをご参照下さい。
2日目…の前に補足など
バージョンや構成についてのメモ。
| chef | 11.4.0 |
| knife solo | 0.3.0-pre4 |
ディレクトリ構成
基本的には knife solo init で作られたものです。
▾ <chef-repo>/
▸ cookbooks/ # Berkfileで管理するcookbook。基本的には手動でいじらない。
▸ data_bags/ # グローバルな変数を管理したい時に使う。
▸ 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日目の目標
リモートサーバの初期化処理(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
完了すると <chef-repo>/nodes/ec2-chef-test.json が自動で作成されます。
このファイルに記述されたレシピがサーバ上で実行されます。
selinux
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 <chef-repo>/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を直接編集するのはよろしくないので、普通は以下のような方法で実現します。
今回はsite_cookbooksを使う方法を選択します。
<chef-repo>/site_cookbooks/openssh/attributes/default.rb を書く
site_cookbooks以下にファイルを追加します。
knife createコマンドでクックブックを作っても良いですが、
余計なディレクトリが出来てしまうのでファイルを直接作ってもOKです。
mkdir site_cookbooks/openssh/attributes vi site_cookbooks/openssh/attributes/default.rb
このファイルの内容は
<chef-repo>/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'
<chef-repo>/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'
<chef-repo>/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'が入ってなくてゲンナリすることが多い。
2013-04-26
■[chef]アルパカchef日記 1日目

1日目:chefを使うための前準備
今回はchefを使える状態になるまでの前準備とします。
chef自体の説明ですが
「chefとは何か?」「chef-serverとchef-soloの違いは?」
といった説明は省略します。
また chef-solo / knife-soloを使うための環境準備についても
既にたくさんの参考記事がありますのでそちらをご参照下さい。
開発サーバに chef を入れるときの 11の方法 - Hack like a rolling stone
開発メモ#5 : Amazon Linux で knife-solo を使って chef-solo 実行 - naoyaのはてなダイアリー
さらにnaoyaさんのchef本を読んでおくとなお良いですね。
本気で勉強したいのであれば必須かと思います。
軽くポイントだけ箇条書き
- chef-soloは「サーバ上でクックブックを用い、サーバ構築を実行するコマンド」です
- knife soloは「クライアントからサーバにsshログインし、chef-soloをリモートから実行させるコマンド」です
- Opscodeとは汎用的なcookbookの集まっているサイトです
アルパカ日記での前提/進め方
アルパカchef日記は以下のような思想で進めていく予定です。
- chef-soloを用いてサーバ単体でchef実行をする方式で進めます
- リモート実行ツールには knife solo を使います
- Opscodeに登録し、鍵は頂いておきます
- インストールしたいパッケージを決定し、必要に応じてcookbookを編集します。
- cookbookのカスタマイズは「cookbooksをsite-cookbooksでオーバーライドする」方式で進めます
- cookbook自体の管理にはBerkshelfを使います
- 環境別/ロール別の管理は「roles/<role>_<env>.json」で管理します
- cookbookの使い方などを日々綴っていきます
chef-soloを用いてサーバ単体でchef実行 / リモート実行ツールは knife solo
chef-soloについては意識する必要はありません。
ほぼ全て「クライアントから knife solo コマンド」で操作します。
補足ですが、リモートからchef-soloを実行する方法としては
capistoranoやcinnamonなどを使う方法もあります。
Opscodeの鍵をもらう
Opscodeの鍵を持っているとopscodeのクックブックを
コマンドラインで簡単にインストールできるようになります。
インストールしたいパッケージを決定し、必要に応じてcookbookを編集
実は、この辺りが今後の日記のメインになる予定です。
まず兎にも角にも、インストールしたいパッケージやミドルウェアを決めます。
そしてopscodeからクックブックをダウンロードしたり、
クックブックをカスタマイズしたりしていく様を
メモしていく予定です。
cookbookのカスタマイズは「cookbooksをsite-cookbooksでオーバーライドする」方式
この辺り、いくつか管理する方法があるようですが
今回はオリジナルのクックブックを「cookbooksディレクトリ」へ置き、
カスタマイズしたクックブックは
「site-cookbooksディレクトリ」へ同名のクックブックを作成して上書きするという
オーバーライド方式で進めたいと思います。
cookbook自体の管理にはBerkshelfを使う
Berkshelfを使うとBerkfileにクックブック名を書くだけで
opscodeやgithub上にあるクックブックを
自分用にお手軽に管理できるようになります。
似たようなツールとしてはlibrarian-chefというツールもあります。
環境別/ロール別の管理は「roles/<role>_<env>.json」で管理
日記の中でこの話をするかどうかは未定なのですが、
「web」「db」などのロールや
「dev」「stage」「production」などの環境別設定について
rolesを用いて管理してますよー、
という話も書くかも。書かないかも。
vagrantについて
vagrantはコマンドラインから簡単にVMを作れるソリューションです。
今回はEC2メインなのでvagrantについての詳細な説明は端折ります。
ただ、実際chefを使うのであれば必須なのは間違いありません。
というか試しでchefを使いたい場合はvagrantでVMを作成し、
その上でテストしたほうが良いでしょう。
詳細は参考リンクをご参照下さい。
Vagrantとchef-soloでお気楽環境構築 | KRAY Inc
knife / knife solo /berks 基本コマンド
最後に、自分がよく使うコマンドを説明します。
knife cookbook
ローカルにcookbookを作成する
# application_base クックブックを新規作成 knife cookbook create application_base -o site-cookbooks
knife solo prepare
# オプション指定バージョン knife solo prepare ec2-user@xxx.xxx.xxx.xxx -i /path/to/private.key # .ssh/configを設定しておくと捗ります(knife solo共通) knife solo prepare server_name
knife solo cook
knife solo cook server_name
berks install
Berksfileに記述されたcookbookをダウンロードする
berks install --path cookbooks
次回
次回はいよいよサーバ構築を進めて行きます!





