コピペコードで快適生活

明日使えるソースを自分のために

ChefZero覚え書き

はじめてChefZeroのコード読むことになったので、調べたこと覚え書き。

インストール

ここからDL https://downloads.chef.io/products/chefdk

knife-zeroインストール

chef gem install knife-zero --no-document

node

# 対象サーバのリストを出力する
knife node list

# 環境をリスト出力する
knife environment list

# 環境(development)を作る
knife environment create development

# サーバ追加
# サーバに接続してサーバ情報をnodes/test_node.jsonに書き出す
# 情報もりもりなので、.chef/knife.rb で knife[:automatic_attribute_whitelist] を指定して書き出す属性を絞ったほうがいい
knife zero bootstrap test-server.com:<ポート> -x test_user --sudo -N test_node

# nodeに実行するrecipeを追加
knife node run_list add 'test_node' 'recipe[sample_cook::default]'

# recipe実行
# knife zero converge QUERY (options)
knife zero converge name:test_node -x test_user --sudo

.chef/knife.rb

knife[:automatic_attribute_whitelist] = %w(
  fqdn/
  os/
  os_version/
  hostname
  ipaddress/
  roles/
  recipes/
  ipaddress/
  platform/
  platform_version/
)

cookbook

# cookbook作成
chef generate cookbook cookbooks/sample_cook

# recipeを作る例
# cookbooks/sample_cook/recipes/default.rb
package 'vim' do
    action :install
end

role

Chefにおけるロールとは、同じ役割のサーバをまとめて管理するための仕組みである。 例えばWebサーバーが5台あった場合、同じ設定をサーバごとに用意しては手間が増えるしミスの可能性も高くなるが、 webというロールを用意して、webロールに対してランリストなどを記述することにより、個別のサーバーへの設定はロールを適用するだけで済むようになる。

## 作成
bundle exec knife create my_role

## 編集
bundle exec knife edit my_role

roles/my_role.json

{
  "name": "my_role",
  "description": "",
  "json_class": "Chef::Role",
  "default_attributes": {

  },
  "override_attributes": {

   },
   "chef_type": "role",
   "run_list": [
     "recipe[xxx]"
   ],
   "env_run_lists": {
     "production": [
       "recipe[yyy::zzz]"
     ]
   }
}

recipe

%w(
  bind-utils
  nagios-plugins
  nagios-plugins-all
).each { |name| package name }

include_recipe 'mackerel-agent'
include_recipe 'mackerel-agent::plugins'

package 'mackerel-check-plugins'
  • package は環境に合わせてよしなに yum installapt-get に置き換えてくれる
  • include_recipe は、recipeを取り込む。
    • 依存するrecipeは、#{COOKBOOK}/metadata.rb} に書き込む必要がある
    • 外部cookbookも使える

attribute

上書きされる順番は弱い順にAttribute→recipe→Environment→Role。
Attributeの強さは弱い順にdefault→force_default→normal→override→force_override→automatic。

Berkshelf

外部クックブックのインストール管理できるbundlerみたいなやつ。
Berksfile に参照するcookbookを書いて、以下でインストールできる。

# vendor/cookbooks ディレクトリにインストールする例
berks vendor vendor/cookbooks

外部クックブックはここにまとめてある。 https://supermarket.chef.io/

DryRun

# --why-run オプションで DryRun が実行される。
# 実行結果に Would xxxx と緑で表示されるのが、実際に実行される処理。
bundle exec knife zero converge 'name:node_name' -a ipaddress --why-run

chefのバージョンアップ

bundle exec knife zero converge 'name:#{SERVER_NAME}' -a ipaddress --why-run --client-version 13.12.14

gem install

サーバ内でChefRuby用のgemを直接インストール

sudo /opt/chef/embedded/bin/gem list | grep xxx
sudo /opt/chef/embedded/bin/gem install xxx

参考