ラベル chef の投稿を表示しています。 すべての投稿を表示
ラベル chef の投稿を表示しています。 すべての投稿を表示

2016年12月27日火曜日

【Ruby2.4.0 & Rails5.0.1】 rails5.0.1で稼働中のWEBアプリをruby2.3.0からruby2.4.0にアップグレードする その1 chef-client Local modeでruby2.4.0をinstallする

記事概要

rails5.0.1で稼働中のWEBアプリをruby2.3.0からruby2.4.0にアップグレードした方法をまとめた記事です。

環境

  • centos6.5
  • rails5.0.1
  • ruby2.3.0 → ruby2.4.0
  • chef
  • rbenv
  • unicorn

工数

本番導入までの時間を含めて8hくらいです。

作業内容

ruby2.3.0からruby2.4.0のアップグレードでは、以下の作業を行いました。

  • chef-client Local modeでruby2.4.0をinstall
  • railsアプリをruby2.4.0に対応させる
  • リリース

移行用のbranchの作成

gitでruby2.4.0移行用の機能ブランチを作成します。

terminal

cd {project_folder}
git branch feature-ruby2.4.0

checkoutでブランチを切り替えます。

terminal

git checkout feature-rails5.0.1

準備完了です。

chefでruby2.4.0をinstall

まず現在のrubyのversionを確認します。

terminal

ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

rbenvでinstall可能なrubyを確認します。

terminal

rbenv install -l

2.3.0
2.3.1
2.4.0-dev
2.4.0-preview1

現在の状態ではruby2.4.0のinstallはできないので、ruby-buildを更新します。

chefのroles/web.jsonファイルを確認します

roles/web.json
    "ruby_build": {
      "upgrade": "sync"
    },
    "rbenv": {
      "rubies": ["2.2.2", "2.3.0"],
      "global" : "2.3.0",
      "gems" : {
        "2.2.2" : [
          { "name" : "bundler" }
        ],
        "2.3.0" : [
          { "name" : "bundler" }
        ]
      }      
    },

ruby_buildに"upgrade": "sync"が記載されていれば、chef-client Local modeを実行するだけでruby-buildが更新されます。
ruby-buildとrubyのインストールは同時にできないので、まずこの状態でchef-client Local modeを実行します。

terminal

// root化
su -

cd {chef-repo_base}

chef-client -z -j 192.168.33.10.json

実行完了後、rbenvでinstall可能なrubyを確認します。

terminal

rbenv install -l

  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.5.0-dev

ruby2.4.0のインストールが可能になりました。

chefのroles/web.jsonファイルを変更します

roles/web.json
    "ruby_build": {
      "upgrade": "sync"
    },
    "rbenv": {
      "rubies": ["2.2.2", "2.3.0", "2.4.0"],
      "global" : "2.3.0",
      "gems" : {
        "2.2.2" : [
          { "name" : "bundler" }
        ],
        "2.3.0" : [
          { "name" : "bundler" }
        ],
        "2.4.0" : [
          { "name" : "bundler" }
        ]
      }      
    },

ruby2.4.0を追記しました。現在動いているアプリに影響がでないように、globalは2.3.0のままにしておきます。再度chef-client Local modeで実行します。

terminal

// root化
su -

cd {chef-repo_base}

chef-client -z -j 192.168.33.10.json

実行完了後に確認します。

terminal

rbenv versions
  2.2.2
* 2.3.0 (set by /usr/local/rbenv/version)
  2.4.0

ruby2.4.0のinstallに成功しました。

まとめ

ruby2.4.0のinstallは、chefを利用していればファイルの追記とコマンドの実行だけで終了します。
次回はrailsの変更の説明をします。

以上です。

PICK UP オススメ書籍

運営サイト(railsで作成しています)


関連記事

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

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

2016年1月26日火曜日

chef chef-client Local modeを利用する chef-soloからの移行 その4. 古いchefを削除して最新のchefに入れ替える

  • 公開日:2016年01月26日

記事概要


ずっと放置していたchefの移行作業の詳細記事です。最新のchef-dkに入れ替える方法です。

環境

  • rbenv
  • chef
  • vagrant centos6.5

はじめに

前回までで、chef-client Local modeの使い方を覚えたので、実際に検証環境(vagrant)で移行します。

dd

既存のchefのバージョンチェック

既存のchefのバージョンをチェックします。

terminal

// rpm check
rpm -qa | grep chef
chefdk-0.3.2-1.x86_64

// chef version
chef -v
Chef Development Kit Version: 0.3.2

だいぶ古いです。一年半くらいにinstallしたchefです。
まずはsoloで動かして、動作することを確認します。

terminal

cd {chef-repo_base}

knife solo cook 192.168.33.12

問題なく動作することを確認しました。

既存のchefを削除

terminal

// 削除します。
yum remove chefdk-0.3.2-1.x86_64

// 削除を確認します。
rpm -qa | grep chef

正常に削除しました。

最新の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

設定ファイルknife.rbの変更

設定ファイルknife.rbを修正します。pathを変更します。

{chef-repo_base}/.chef/knife.rb

cookbook_path    ["/home/vagrant/chef-solo-repo/cookbooks", "/home/vagrant/chef-solo-repo/site-cookbooks"]
node_path        "/home/vagrant/chef-solo-repo/nodes"
role_path        "/home/vagrant/chef-solo-repo/roles"
environment_path "/home/vagrant/chef-solo-repo/environments"
data_bag_path    "/home/vagrant/chef-solo-repo/data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "/home/vagrant/chef-solo-repo/cookbooks"

これで設定完了です。

chef-client Local mode

chef-client Local modeで実行します。

terminal

// root化
su -

cd {chef-repo_base}

chef-client -z -j 192.168.33.12.json

正常に実行できます。

まとめ

rpmで導入している場合は、chefの削除はremoveコマンドで可能なので、あっさりと移植することが可能だと思います。

さて、これでchef-soloからchef Local modeへの移行は終了になります。
chefは癖のあるるツールですが、1,2年前と比べると飛躍的に使いやすくなっていると思います。

昔挫折した人や、見切りをつけた人ももう一度試してみてはいかかでしょうか。

以上です。

動画

How to use chef Tutorial 3
PICK UP
関連記事
参考サイト

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

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

2016年1月25日月曜日

chef chef-client Local modeを利用する chef-soloからの移行 その3. 既存のchef-soloをchef-client Local modeで実行

  • 公開日:2016年01月25日

記事概要


ずっと放置していたchefの移行作業の詳細記事です。chef-soloで利用していたレシピをchef-client Local modeで動作させます。

環境

  • rbenv
  • chef
  • vagrant centos6.5

はじめに

前回と前々回ではchefのchef-client Local modeを利用する方法を覚えました。
今回はいよいよchef-soloリポジトリをchef-client Local modeで動作させます。

chefのバージョン

terminal

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

chef-soloリポジトリの配置

既存のchef-soloリポジトリをLocal modeで動作させるために、/home/vagrant/配下にコピーします。

terminal

// sync directory
cd /vagrant_data/data

// chef-solo-repoをコピー
cp -pa chef-solo-repo /home/vagrant/

// chef-solo-repoに移動
cd /home/vagrant/chef-solo-repo

// ファイルを確認
ls -l
total 13
-rwxrwxrwx 1 vagrant vagrant  153 Jan 20 01:52 Berksfile
-rwxrwxrwx 1 vagrant vagrant  424 Jan 20 02:29 Berksfile.lock
drwxrwxrwx 1 vagrant vagrant 4096 Jan 21 07:16 cookbooks
drwxrwxrwx 1 vagrant vagrant    0 Jan 21 07:16 data_bags
drwxrwxrwx 1 vagrant vagrant    0 Jan 21 07:16 environments
drwxrwxrwx 1 vagrant vagrant 4096 Jan 21 07:16 nodes
drwxrwxrwx 1 vagrant vagrant    0 Jan 21 07:16 roles
drwxrwxrwx 1 vagrant vagrant 4096 Jan 21 07:16 site-cookbooks

knife.rbの修正

設定ファイルknife.rbを修正します。

■Before■

{chef-repo_base}/.chef/knife.rb

cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"

■After■

{chef-repo_base}/.chef/knife.rb

cookbook_path    ["/home/vagrant/chef-solo-repo/cookbooks", "/home/vagrant/chef-solo-repo/site-cookbooks"]
node_path        "/home/vagrant/chef-solo-repo/nodes"
role_path        "/home/vagrant/chef-solo-repo/roles"
environment_path "/home/vagrant/chef-solo-repo/environments"
data_bag_path    "/home/vagrant/chef-solo-repo/data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "/home/vagrant/chef-solo-repo/cookbooks"

パスをフルパスにします。

chef-client Local modeで実行

chef-solo(knife solo)コマンドでなく、chef-client Local modeで実行します。

■Before■

terminal

cd {chef-repo_base}

knife solo cook 192.168.33.44

■After■

terminal

chef-client -z -j 192.168.33.44.json

cookbookにエラーがなければ正常に実行できます。
実行に失敗した場合は以下のコマンドでcookbookとroleを確認してください

terminal

cd {chef-repo_base}

// cookbook
sudo knife cookbook list -z
mysql                 5.6.3
nginx                 0.1.0
php-fpm               0.1.0
php55                 0.1.0
ruby_build            0.8.0
ruby_rbenv            1.0.1
webconfiguration      0.1.0
yum                   3.9.0
yum-add               0.1.0
yum-mysql-community   0.1.21

// role
sudo knife role list -z
web

上記のように表示されればcookbookとroleの設定は正常です。

まとめ

chef-soloとchef-client Local modeに違いはほとんどありません。
なので、なるべく非推奨のchef-soloを止め、chef-client Local modeに移行しましょう。

以上です。

chefのオススメの本


関連記事

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

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

2016年1月24日日曜日

chef chef-client Local modeを利用する chef-soloからの移行 その2. rbenv cookbookの変更

  • 公開日:2016年01月24日
  • 最終公開日:2016年01月26日

記事概要


ずっと放置していたchefの移行作業の詳細記事です。今回はrbenvのcookbookについて記述しています。
動画で実際の動きも確認できます。

環境

  • rbenv
  • chef
  • vagrant centos6.5

はじめに

chefで構成管理をしている開発者は、Ruby on RailsでWEBアプリを構築している人が多いと思います。 私もWEBアプリは、よほどの理由がない限りはRuby on Railsを利用しています。

また、Ruby on Rails開発者のrubyのバージョン管理は、rbenvを使用している人が多いと思います。私もrbenvを使用していて、サーバーにはBerksfileのcookbookを利用してrbenvを導入しています。

しかし、これまでchef-soloで利用していたrbenvのcookbook仕様が大きく変更されたようです。
そのため、色々とはまってしまいました。
動作確認をしながら確認したので、まとめて記事にしました。

chefのバージョン

terminal

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

cookbook nameの変更

Berksfileのcookbookの名称が変更になりました。

■Before■

{chef-repo_base}/Berksfile

source "https://api.berkshelf.com"
cookbook 'rbenv', github: "fnichol/chef-rbenv"

■After■

{chef-repo_base}/Berksfile

source "https://api.berkshelf.com"
cookbook 'ruby_rbenv'

rbenvがruby_rbenvに変更されました。

ruby install方法の変更

rbenvを使ってrubyをinstallする方法も変更されました。以前は以下のように属性を設定することでrubyが導入できました。

■Before■

{chef-repo_base}/roles/xxx.json

  "run_list": [
    "recipe[ruby_build]",
    "recipe[rbenv::system]"
  ],
  "default_attributes": {
    "rbenv": {
      "rubies": "2.2.2",
      "global" : "2.2.2",
      "gems" : {
        "2.2.2" : [
          { "name" : "bundler" }
        ]
      }
    }
  }

■After■

{chef-repo_base}/roles/xxx.json

  "run_list": [
    "recipe[ruby_build]",
    "recipe[ruby_rbenv::system_install]",
    "recipe[ruby_rbenv::system]"
  ],
  "default_attributes": {
    "rbenv": {
      "rubies": "2.2.2",
      "global" : "2.2.2",
      "gems" : {
        "2.2.2" : [
          { "name" : "bundler" }
        ]
      }
    }
  }

recipeのsystem.rbを利用する必要があります。

ruby install

chefをLocal modeで実行してrubyをinstallします。当然、実行はrootで行います。

terminal

// rootになる
su -

cd {project_folder}/chef-repo

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

導入したrubyの確認

terminal

// global ruby version confirm
rbenv global
2.2.2

// gem version confirm
rbenv exec gem --version
2.4.5

// installed gem list confirm
rbenv exec gem list

*** LOCAL GEMS ***

bigdecimal (1.2.6)
bundler (1.11.2)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

まとめ

chefを利用してミドルウェアをインストールする場合は、極力Berksfileのcookbookを利用するべきだと思います。
今回のrbenvのように大きめの変更が入る場合もあるのですが、コードを読む手間を考慮しても実績のあるcookbookを使うべきです。
使うことでchefの理解も、利用するミドルウェアやサーバーの力も高めることができます。

ただし、十分に開発環境で検証しておきましょう。

以上です。

動画

How to use chef Tutorial 2. install ruby via rbenv.
PICK UP
関連記事
参考サイト

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

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

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
関連記事

参考サイト

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

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...