Hatena::ブログ(Diary)

アルパカDiary このページをアンテナに追加 RSSフィード

Perl用ブログも始めましたPerl勉強メモ

2013-05-16

[]アルパカchef日記3日目 data bagについて / またはユーザ管理クックブックなど 01:40 アルパカchef日記3日目 data bagについて / またはユーザ管理クックブックなど - アルパカDiary を含むブックマーク アルパカchef日記3日目 data bagについて / またはユーザ管理クックブックなど - アルパカDiary のブックマークコメント

2日目の続き。

コンセプトはこちらをご参照下さい。


3日目の目標

  • ユーザ管理(data bag)
    • ユーザ作成
    • bash_profile管理
    • sudo
      • ここの段階で ec2-userのsudo権限を剥奪し、新ユーザにsudo権限を付与
    • security_limit

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グループに追加しています。


次にssh用のディレクトリkeyを設定します。

「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を用意しないまま)実行してしまうと

誰もsudoできなくなってしまいます!*4

ご注意下さい。




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管理で行いましたが、

このあたりはケースバイケースで運用を変えても良いかもしれませんね。



次回アジェンダ

共通で使うようなパッケージやミドルウェアインストールしてみたいと思います。

*1:直接表示してもencryptされたデータが表示されます

*2:あえてdatabagを使用していますが、ログインさせたいだけであれば /home/ec2-user/.ssh/authorized_keys を /home/alpaca3/.ssh/authorized_keys にコピーするだけでも良いですね

*3:んー、微妙

*4デフォルトは ['sudo']['users']=[] のため

*5:予め作っておいたほうがいいのでは、というお話

2013-05-14

[][]アルパカChef日記番外編 VimでChefクックブックを編集する時に便利かもしれないプラグイン 00:23 アルパカChef日記番外編 VimでChefクックブックを編集する時に便利かもしれないプラグイン - アルパカDiary を含むブックマーク アルパカChef日記番外編 VimでChefクックブックを編集する時に便利かもしれないプラグイン - アルパカDiary のブックマークコメント

今回は少し趣向を変えて、Vimのお話。


自分はビマーなので、ChefのクックブックをいじるのにもVimです。

そこでVimでクックブックを書く時に便利(?)

かもしれないプラグインScriptを紹介してみます。




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を使う方法も

もちろんref.vimインストールが前提ですが。

こんなのを.vimrcに追記しておいて、

let g:ref_source_webdict_sites = {
\   'chef': {
\     'url': 'http://docs.opscode.com/resource_%s.html',
\   },
\ }

以下のコマンドを実行するとVim上でそれなりなドキュメントが見れます。

:Ref webdict chef <リソース名>

この辺り、もう少しきちんとVimスクリプト書いて

もっと使えるものにしたいなー。。。


では、良いChefライフを。

2013-05-09

[]アルパカchef日記2日目 OS周りのクックブックなど 22:57 アルパカchef日記2日目 OS周りのクックブックなど - アルパカDiary を含むブックマーク アルパカchef日記2日目 OS周りのクックブックなど - アルパカDiary のブックマークコメント

1日目の続き。

コンセプトはこちらをご参照下さい。


2日目…の前に補足など

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

chef11.4.0
knife solo0.3.0-pre4
ディレクトリ構成

基本的には knife solo init で作られたものです。

▾ <chef-repo>/

 ▸ 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

完了すると <chef-repo>/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 soloselinuxのクックブックを実行させるため、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を直接編集するのはよろしくないので、普通は以下のような方法で実現します。

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

今回は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'が入ってなくてゲンナリすることが多い。

rhelcentosと一緒にamazonも書いて欲しい…

*1:knife-pre3

*2:3日目に後回し…

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

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

2013-04-26

[]アルパカchef日記 1日目 03:50 アルパカchef日記 1日目 - アルパカDiary を含むブックマーク アルパカchef日記 1日目 - アルパカDiary のブックマークコメント

1日目:chefを使うための前準備

今回はchefを使える状態になるまでの前準備とします。

chef自体の説明ですが

「chefとは何か?」「chef-serverとchef-soloの違いは?」

といった説明は省略します。

また chef-solo / knife-soloを使うための環境準備についても

既にたくさんの参考記事がありますのでそちらをご参照下さい。

vs Chef 第1回戦 - m0t0k1ch1st0ry

開発サーバに chef を入れるときの 11の方法 - Hack like a rolling stone

開発メモ#5 : Amazon Linux で knife-solo を使って chef-solo 実行 - naoyaのはてなダイアリー


さらにnaoyaさんのchef本を読んでおくとなお良いですね。

本気で勉強したいのであれば必須かと思います。

入門Chef Solo - Infrastructure as Code



軽くポイントだけ箇条書き

  • 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を実行する方法としては

capistoranocinnamonなどを使う方法もあります。

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

Vagrant - naoyaのはてなダイアリー



knife / knife solo /berks 基本コマンド

最後に、自分がよく使うコマンドを説明します。

knife cookbook

ローカルにcookbookを作成する

# application_base クックブックを新規作成
knife cookbook create application_base -o site-cookbooks 
knife solo prepare

リモートサーバにchef-soloインストールする

# オプション指定バージョン
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

リモートサーバでchef-soloを実行する

knife solo cook server_name
berks install

Berksfileに記述されたcookbookをダウンロードする

berks install --path cookbooks

次回

次回はいよいよサーバ構築を進めて行きます!

2013-04-25

[]アルパカchef日記 0日目 02:11 アルパカchef日記 0日目 - アルパカDiary を含むブックマーク アルパカchef日記 0日目 - アルパカDiary のブックマークコメント

0日目:概要

日々、chefと戯れる様子を淡々と綴ってみるよ。


アルパカchef日記のゴール

knife soloを用い、EC2の生AMIに対して

以下の作業を一切サーバログインせずに 全て達成すること

を目標にしたいと思います。

  • ユーザ設定
  • ミドルウェアインストール
    • supervisor
    • xbuild
    • perl-build
    • python-build
    • nginx
    • nginx(source)
    • td-agent
    • mysql
    • postgresql
    • redis
    • memcache
    • munin
    • nagios
    • jenkins
    • growthforecast
    • Redmine
    • Gitlab
    • etc...
  • AWSの設定
    • タグ設定

基本は opscode からインストールしてみて

カスタマイズが必要ならレシピいじって再挑戦、といったメモ書きになると思います。

がんばろー