はじめに
ソフトウェア開発には特別なソフトウェアのインストールと設定が必要になることがよくあります。チームの開発環境の統一はどのように行っているでしょうか?
解決方法はいろいろがありますが、今回はVagrantとchef soloを紹介いたします。Vagrantとchef soloを使用すると、仮想マシンの立ち上げ、OSや各種ソフトウェアのインストール、アプリケーションのビルドなどを自動化できます。
Vagrantとは?
仮想マシンを作るためのツールです。
インストールはこちらを参照してください。
ーVagrantで基本的なコマンド:
vagrant up
->仮想マシンを起動します。
起動した後でプロビジョンをしたい場合は「vagrant up –provision」が使用できます。
✳︎サーバーを選定したりOSやソフトウェアをインストールするなどして、サーバーがサービスを提供できるようにするまでの一連の作業をプロビジョニングと言います。
vagrant provision
->Vagrantが管理する仮想マシンに対して、設定されたprovisionersを実行します。
chef soloを使う場合は仮想マシンにクックブックを実施します。
vagrant ssh
->仮想マシンにsshします。
vagrant reload
->仮想マシンをリロードします。
リロードしたあとでプロピジョンをしたい場合は「vagrant reload –provision」を使えます。
vagrant halt
->仮想マシンをシャットダウンします。
chef soloとは?
各種設定作業を Ruby のコードで自動化するツールです。
インストール:
1 |
$ curl -L https://www.opscode.com/chef/install.sh | bash |
これから環境設定を共有するためのクックブックの作り方を紹介いたします。
それでは自分のクックブックを作って見ましょう。knife cookbookコマンドを使用して、クックブックに必要なファイルを作成します。
1 2 3 4 5 |
$ knife cookbook create my_cookbook ** Creating cookbook my_cookbook ** Creating README for cookbook: my_cookbook ** Creating CHANGELOG for cookbook: my_cookbook ** Creating metadata for cookbook: my_cookbook |
このコマンドを実施するとcookbooksフォルダーに必要なファイルが作成されます。site-cookbooksフォルダーに作成したい場合は以下のパラメーターを追加してください。
1 |
$ knife cookbook create my_cookbook -o site-cookbooks/ |
作成されたcookbooks/my_cookbook(site-cookbooks/my_cookbook)の中身を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
my_cookbook ├── CHANGELOG.md ├── README.md ├── attributes ├── definitions ├── files │ └── default ├── libraries ├── metadata.rb ├── providers ├── recipes │ └── default.rb ├── resources └── templates └── default |
クックブックで色々な設定が出来ます。今回は例としてnginxのインストールと設定のクックブックの作り方を紹介いたします。
まずはrecipes/default.rbに以下のコードを記述します。
1 2 3 |
package 'nginx' do action :install end |
一番上の行はリソースのタイプ(package)とリソースの名前を指定します。
次はインストールアクションを指定します。
packageリソースを使用すると、以下のアクションが使用できます:
ー:install
ー:purge
ー:reconfig
ー:remove
ー:upgrade
ここまでの作業でnginxをインストールするクックブックの作成は終わりました。次はVagrantのprovisionを実施する時に作ったクックブックを適用します。Vagrantfileファイル(Vagrantの設定ファイル)を修正します。
Vagrantfile
1 2 3 4 5 6 7 8 9 |
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # 他の設定 config.vm.provision :chef_solo do |chef| //provisionerはchef solo chef.cookbooks_path = ["site-cookbooks", "cookbooks"] //作成したクックブックのパス # 他の設定 chef.add_recipe ‘my_cookbook' //新しいクックブックを追加する end # 他の設定 end |
以上で設定は終了です。Vagrantの仮想マシンを再起動してプロビジョンするとnginxが仮想マシンにインストールされます。
1 |
$vagrant reload —provision |
(起動していない場合は起動コマンドを使います:$vagrant up –provision)
よく使うクックブックリソース
クックブックでは色々なリソースを使用する事ができます。次に代表的なリソースを紹介します。
packageリソース:
例:wgetパッケージをインストールする
1 2 3 |
package 'wget' do //パッケージ名を指定する action :install //アクションを指定する end |
bashリソース:
例:コマンドコードを実施する
1 2 3 4 5 6 7 8 9 10 11 12 |
bash 'install_something' do //任意のbash名 user 'root' //rootとしてコマンドを実施する cwd '/tmp' //パスを指定する code <<-EOH //コマンドブロックの始め wget http://www.example.com/tarball.tar.gz tar -zxf tarball.tar.gz cd tarball ./configure make make install EOH end //コマンドブロックの終わり |
templateリソース:
例:テンプレートファイルを仮想マシンにコピーする
1 2 3 4 5 |
template '/tmp/somefile' do //仮想マシンのパスの指定 mode 00644 source 'somefile.erb' //cookbookであるファイル(templates/default/) not_if {File.exists?('/etc/passwd')} end |
cookbook_fileリソース:
例:ファイルを仮想マシンにコピーする
1 2 3 4 |
cookbook_file "#{Chef::Config[:file_cache_path]}/remi-release-6.rpm" do //仮想マシンのパスの指定 source "remi-release-6.rpm" //cookbookであるファイル(files/default/) mode "0644" //仮想で作成されるファイルのパーミッション end |
rpm_packageリソース:
例:rpmファイルからインストールする (仮想マシンで実施すること:rpm -Uvh remi-release-6.rpm)
1 2 3 4 5 |
rpm_package "remi-release" do options "-Uvh" source "#{Chef::Config[:file_cache_path]}/remi-release-6.rpm" //仮想マシンにアップしたファイル action :install end |
serviceリソース:
例: service nginx start
1 2 3 |
service "nginx" do action :start end |
供給されるアクション:
:disable
:enable
:nothing
:reload
:start
:stop
最後に
以上、初めての方へchef soloとvagrantの基本的な概念と作り方を紹介いたしました。
vagrantとchef soloを使用して、開発環境を共有する際の参考にして頂ければ幸いです。
また、Chef Supermarketなどにchefのクックブックが多くアップされていますので、参考にしてみてはいかがでしょうか?
ぜひ皆さんも参考にして、自分の開発環境に適用してみてください。
こんにちは!トゥンと申します。開発しながら学んだことを共有していこうと思います。