ねこ的アルゴリズム

技術的な話メインの雑記ブログ

【初心者向けChef-Zeroの使い方】knife-zero で Chef Client Local Mode を動かしてみた

今回のテーマは Chef です。Puppet と並んで有名なサーバ構築ツールですね。

目次が表示されます

SoloからZeroへ

もう発表されてからだいぶ経っておりますが、

「Chef Solo から Chef Client Local Mode(Chef Zero)に早めに乗り換えてね」と発表されました。

詳細はこちら

そのため、本記事では Chef Client Local Mode で、 ローカルマシンからリモートサーバの管理をする knife-zero を使ってサーバ管理を行っていきます。

対象とする読者

  • Chef 初心者
  • chef-solo が簡単そうだけど、今後なくなるなら chef client local mode で構築したい
  • 自分でレシピ追加して、リモートサーバの管理を Chef でやりたい

私自身、Chef を触り始めて日も浅いのでほぼ作業記録になりますがご容赦ください。

Chef のインストール

ChefDK(Chef Development Kit)とは

ChefDK とは Chef およびポピュラーな関連ツール一式を簡単にインストールできるようにパッケージングしたソフトウェアになります。

引用先: Chefを使うのに必要な環境が一気に整う「ChefDK」レビュー

ダウンロードリンク

このインストールが済めば、もう Chef は使えるようになります。便利。

knife-zero のインストール

ローカルマシンからリモートサーバで Chef を実行するために、 knife-zero を使用するので、こちらもインストールします。

$ chef gem install knife-zero

Chef のディレクトリを作る

chef のディレクトリ作成

chef-sample ディレクトリを作ります。

$ chef generate repo chef-sample

結果、以下の構成のものが自動作成されます。

chef-sample
├── LICENSE
├── README.md
├── chefignore
├── cookbooks
│   ├── README.md
│   └── example
│       ├── attributes
│       │   └── default.rb
│       ├── metadata.rb
│       └── recipes
│           └── default.rb
├── data_bags
│   ├── README.md
│   └── example
│       └── example_item.json
├── environments
│   ├── README.md
│   └── example.json
└── roles
    ├── README.md
    └── example.json

cookbook の作成

例として vim, user, iptables の cookbook を追加します。

$ cd chef-sample
$ chef exec knife cookbook create vim -o site-cookbooks
$ chef exec knife cookbook create user -o site-cookbooks
$ chef exec knife cookbook create iptables -o site-cookbooks

補足

chef-solo では、

  • site-cookbooks ディレクトリに自分で作成した cookbook を
  • cookbooks ディレクトリに外部から取ってきた cookbook を

追加するのが作法になっていましたが、chef-zero では site-cookbooks が自動で作成されません。

以下のファイルに読み込む cookbook_path を指定することで初めて実行対象となります。

chef-sample/.chef/knife.rb

cookbook_path ["cookbooks", "site-cookbooks"]

cookbook の編集

cookbook でよく使う(編集する)のは主に recipes, attributes, templates の 3つです。

1. recipes

recipes にはレシピを記述します。

基本的に実行することはすべてここに記述します。

具体例

chef-sample/cookbooks/vim/recipes/default.rb

package 'vim' do
  action :install
end

2. attributes

attributes には変数を記述します。

環境によって変わる部分を recipe に直書きするのではなく、attributes で管理することで汎用性が増します。

具体例

chef-sample/cookbooks/user/recipes/default.rb

user 'admin' do
  username 'admin'
  password node['admin']['password']
  action :create
end

chef-sample/cookbooks/user/attributes/default.rb

default['admin']['password'] = 'password'

3. templates

templatesには設定ファイルを記述します。

recipe で 以下のように template リソースで source を指定して呼び出します。

chef-sample/cookbooks/iptables/templates/default.rb

template "/etc/sysconfig/iptables" do
  source "iptables.erb"
  owner "root"
  group "root"
  mode 0644
end

chef-sample/cookbooks/iptables/templates/default.rb

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:SERVICES -    [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport 22 -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT

role の編集

追加した cookbook を実行するために、role を編集します。

また、 run_list は上から順に実行されます。 依存関係がある場合は、先に入れる必要のあるレシピを上に持ってくるだけで OK です。

chef-sample/roles/chef-sample.json

{
    "name": "chef-sample",
    # 中略
    "run_list": [
        "recipe[vim]",
        "recipe[user]",
        "recipe[iptables]"
    ]
}

attributes (変数) の上書き

下に行くほど優先度が高いです(上書きされます)。

  1. recipes/attribute/
  2. recipes/default/
  3. environments/
  4. roles/
  5. nodes/

local mode の指定

自動的には作成されませんが、以下のディレクトリ構造のファイルを作成し、編集してください。

chef-sample/.chef/knife.rb

local_mode true

cookbook_path ["cookbooks", "site-cookbooks"]

レシピの実行

作成した chef のディレクトリで以下のように実行します。

$ chef exec knife zero bootstrap #{ip_address} -x #{execute_user} -i #{ssh_key_path} --sudo -r 'role[chef-sample]'

ssh_keyは設定していなければ -P でパスワードでも可能です。

具体例

$ chef exec knife zero bootstrap 192.168.33.10 -x vagrant -i $HOME/vagrant-sample/.vagrant/machines/vagrant-sample/virtualbox/private_key --sudo -r 'role[chef-sample]'

サードパーティレシピの利用

Berkshelf を使って、サードパーティのレシピを使ってみます。

berkshelf をインストール

$ gem install berkshelf

Berksfile を作って編集

source "https://supermarket.chef.io"

cookbook 'user'
cookbook 'sudo'

Berksfile の cookbook を cookbooks ディレクトリに適用

$ berks vendor cookbooks

仮想環境がない….

こちらを参考に仮想マシンを構築してからお試しください。

www.cat-algorithm.com

個人的に、OSの状態管理ができる sahara は入れておくことをお勧めします。

おすすめの本

色々な方がおっしゃっていますが、非常に良書ですので Chef を触るのであればオススメです。

https://www.amazon.co.jp/dp/B00BSPH158www.amazon.co.jp


SPONSORED LINK