2016年1月23日土曜日

chef chef-client Local modeを利用する chef-soloからの移行 その1. chef-client Local modeを使ってみる

  • 公開日:2016年01月23日
  • 最終更新日:2016年01月26日

記事概要


ずっと放置していたchefの移行作業の詳細記事です。
動画で実際の動きも確認できます。

環境

  • ruby
  • rbenv
  • mysql
  • vagrant centos6.5

はじめに

chef-soloが非推奨になってから1年くらい経過しました。
rubyを最新のバージョンにするついでにchefの調査をしたところ、そろそろ仕様的にも落ち着いてきているようなのでchef-clientのLocal modeに移行することにしました。

chef-soloはあくまでchefを利用するとっかかりにすぎないと言われています(その割に思い出すのも嫌になるくらい苦戦しましたけど)。 今回移行するWEBアプリの環境は小中規模。なので、chefのLocal modeで動作させるよう修正することにしました。

chef Local modeについて

あたかもChef server上で動いているかのように、ローカルマシン上のchef-repoに対してchef-clientを動かす方法です。
Local modeは、chef-zeroに依存します。chef-zeroは、Chef serverのとても軽量なインスタンスとして動きます。

つまり、ローカルのNodeを管理するだけならLocal modeで十分といえると思います。

移行の手順

しばらくchefの操作から離れていたので、以下のようにステップを踏んでいきます。

  • 新しい開発環境を用意してchefをinstall
  • 新しい開発環境で既存のBerkshelfを利用してサーバーを構築
  • 更新、削除、追加の動作を確認
  • 既存chef-soloをLocal modeに変更
  • 既存環境のchefを、最新のchefに入れかえる
  • 本番に適用

結構手間はかかりますが、仕方ないですね。技術的負債をこれ以上ためるわけにはいきません。
なおこの記事は、chef-soloを多少なりとも利用したことがある前提となっています。
では、はじめていきましょう。

chefのインストール

vagrantでcentos65を起動します。
初期状態のcentos65を利用して学習していきます。

terminal

vagrant up

// wget導入
sudo yum install wget

chefをinstallします

terminal

// chefdk rpmを取得
wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.10.0-1.el6.x86_64.rpm

// chefdk rpm install
sudo rpm -Uvh chefdk-0.10.0-1.el6.x86_64.rpm

// install確認
chef -v
Chef Development Kit Version: 0.10.0
chef-client version: 12.5.1
berks version: 4.0.1
kitchen version: 1.4.2

レポジトリを作成します

terminal

cd {project_folder}

// レポジトリの作成
chef generate repo chef-repo

準備は完了です、次にBerksfileを利用してミドルウェアを導入していきます。

Berksfileの導入

まずはBerksfileから動作を確認します。既存のBerksfileをchef-repo配下に配置します。

terminal

cd {project_folder}/chef-repo

// create Berksfile
touch Berksfile

source "https://api.berkshelf.com"
cookbook 'yum'
cookbook 'ruby_build'
cookbook 'ruby_rbenv'
cookbook 'mysql', '~> 5.6.1'

// 実行
berks vendor cookbooks
/opt/chefdk/embedded/lib/ruby/gems/2.1.0/gems/httpclient-2.6.0.1/lib/httpclient/webagent-cookie.rb:458: warning: already initialized constant HTTPClient::CookieManager
/opt/chefdk/embedded/lib/ruby/gems/2.1.0/gems/httpclient-2.6.0.1/lib/httpclient/cookie.rb:8: warning: previous definition of CookieManager was here
Resolving cookbook dependencies...
Fetching 'ruby_rbenv' from git://github.com/fnichol/chef-rbenv.git (at master)
Fetching cookbook index from https://api.berkshelf.com...
Installing apt (2.9.2) from https://api.berkshelf.com ([opscode] https://supermarket.chef.io:443/api/v1)
Installing java (1.39.0) from https://api.berkshelf.com ([opscode] https://supermarket.chef.io:443/api/v1)
Installing mysql (5.6.3) from https://api.berkshelf.com ([opscode] https://supermarket.chef.io:443/api/v1)
Installing ruby_build (0.8.0) from https://api.berkshelf.com ([opscode] https://supermarket.chef.io:443/api/v1)
Using ruby_rbenv (1.0.1) from git://github.com/fnichol/chef-rbenv.git (at master)
Installing yum (3.9.0) from https://api.berkshelf.com ([opscode] https://supermarket.chef.io:443/api/v1)
Installing yum-mysql-community (0.1.21) from https://api.berkshelf.com ([opscode] https://supermarket.chef.io:443/api/v1)
Vendoring apt (2.9.2) to cookbooks/apt
Vendoring java (1.39.0) to cookbooks/java
Vendoring mysql (5.6.3) to cookbooks/mysql
Vendoring ruby_build (0.8.0) to cookbooks/ruby_build
Vendoring ruby_rbenv (1.0.1) to cookbooks/ruby_rbenv
Vendoring yum (3.9.0) to cookbooks/yum
Vendoring yum-mysql-community (0.1.21) to cookbooks/yum-mysql-community

cookbooksフォルダが作成され、フォルダ内に各種レシピがインストールされています。

terminal

cd {project_folder}/chef-repo/cookbooks

ls -l
total 20
drwxrwxr-x 6 vagrant vagrant 4096 Jan 20 07:20 mysql
drwxrwxr-x 7 vagrant vagrant 4096 Jan 20 07:20 ruby_build
drwxrwxr-x 8 vagrant vagrant 4096 Jan 20 07:20 ruby_rbenv
drwxrwxr-x 8 vagrant vagrant 4096 Jan 20 07:20 yum
drwxrwxr-x 5 vagrant vagrant 4096 Jan 20 07:20 yum-mysql-community

roles/***.jsonを作成します。

terminal

cd {project_folder}/chef-repo/roles

// webアプリの構成を設定するjson
touch web.json

{
  "name":"web",
  "chef_type": "role",
  "json_class":"Chef::Role",
  "description":"web server  role",
  "run_list": [
    "recipe[yum]",
    "recipe[ruby_build]",
    "recipe[ruby_rbenv::system_install]",
    "recipe[mysql::server]"
  ],
  "default_attributes": {
    "ruby_build": {
      "upgrade": "sync"
    },
    "mysql": {
      "version":"5.6",
      "port":"3306",
      "server_root_password":"mysql56",
      "remove_anonymous_users":false,
      "remove_test_database":false
    }
  }
}

nodes/xxx.xxx.xxx.xxx.jsonを作成します。

terminal

cd {project_folder}/chef-repo/nodes

touch 192.168.33.10.json

{
  "run_list": [
    "role[web]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  }
}

以上で準備完了です。

chefをLocal modeで実行

以下のコマンドを実行します。当然、実行はrootで行います。

terminal

// rootになる
su -

cd {project_folder}/chef-repo

// Local modeで実行
chef-client -z -j nodes/192.168.33.23.json

上記を実行すると、正常に処理が終了するはずです。
試しにmysqlのバージョンを確認してみましょう。

terminal

mysql --version
mysql  Ver 14.14 Distrib 5.6.28, for Linux (x86_64) using  EditLine wrapper

正常にmysqlがinstallされています。

まとめ

Berksfileを使った実行の場合、ほとんどchef-soloとやり方が変わりませんでした。
ただし、cookbookのrbenvが大きく変わっていて苦戦したので、次回はrbenvのcookbookについて理解したことをまとめたいと思います。

以上

動画

How to use chef Tutorial 1
PICK UP
関連記事

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...