技術の犬小屋

Webプログラミングを餌に生きる犬のメモ帳

Posts in the 環境構築 category

Gruntを使い始めてから半年経った。Gruntは主にJavascriptとCSSファイルのminifyを自動化する目的で使用している。
 

Gruntとは

Gruntとは,JavaScriptで書いたタスクを実行してくれるアプリケーション(JavaScript Task Runner)である。
面倒な作業として,以下のような作業があるが,Gruntを使うことでこれらを自動化することが出来る。

  • minify(圧縮)や結合
  • 単体テストの実行
  • JSLint(構文チェック)の実行
  • CoffeeScriptやTypeScriptを使用している場合にはコンパイル(JavaScript変換)の実行
  • SCSS(Sass)やLESSなどのCSS拡張メタ言語を使用している場合には,コンパイル(CSS変換)の実行

 

Gruntの使い方

GruntはNode.jsを使用して作られている。そのため,Gruntをインストールする際には,あらかじめhomebrewなどでNode.jsをインストールしておく必要がある。
 

Gruntのインストール

Gruntは,Grunt本体とgrunt-cliが組み合わさって動作する。そのため,Grunt本体とgrunt-cliを一緒にインストールするが,コマンドから直接インストールするのではなく,package.jsonというファイルを作成し,このファイルを介してインストールする。
package.jsonを作成し,以下のように記述する。

{
  "name": "my-project-name",
  "version": "0.1.0",
  "devDependencies": {
    "grunt": "~0.4.3",
    "grunt-cli": "~0.1.9"
  }
}

 
package.jsonが存在するディレクトリで,以下のコマンドを実行することで,package.jsonに記述したnodeモジュールをインストールすることが出来る。今回の場合は,Gruntをインストールすることが出来る。

npm install

 
このpackage.jsonというファイルは,Node.jsのプロジェクトにおいて、そのプロジェクトの名称やバージョン,依存するモジュールを書いておくためのファイルである。Grunt自体も,このpackage.jsonを使って利用するプラグインを管理し,そしてGrunt自体もこのファイルへ依存モジュールとして登録する。
Gruntが,このような回りくどい管理方法を取っている理由は,Gruntのバージョンが異なるプロジェクトを単体のGruntでは同時に管理できない為である。
例えば,プロジェクトAではバージョン0.3.1を使っているが、プロジェクトBでは0.3.16を使っていて、マシンにはGrunt 0.3.16がインストールされている……という場合,始めのプロジェクトがビルドできなくなってしまう可能性がある。
 
続いて,Gruntfile.jsというgruntの設定ファイルを作成する。
一纏めにして実行出来る個々の設定を「タスク」と呼ぶ。以下の内容でGruntfile.jsを作成する。

module.exports = function (grunt) {

  grunt.registerTask('hello', 'description here', function() {
    grunt.log.writeln('hello World!');
  });

  grunt.registerTask('default', [ 'hello' ]);

};

 
この状態で, grunt コマンドを実行し,以下のように表示されれば,タスクが成功している。

Running "hello" task
hello World!

Done, without errors.

 

JavascriptとCSSを自動的にminifyしてみる

今回,冒頭で触れたJavascriptとCSSのファイルをminifyする方法を説明する。
 

プラグインを追加インストールする
{
  "name": "my-project-name",
  "version": "0.1.0",
  "devDependencies": {
    "grunt": "~0.4.3",
    "grunt-cli": "~0.1.9",
    "grunt-contrib-cssmin": "0.4.1",
    "grunt-contrib-uglify": "~0.4.0",
    "grunt-contrib-watch": "~0.5.3"
  }
}

 
上記のようにpackage.jsonに追記し,以下のプラグインを新たにインストールする。

  • grunt-contrib-cssmin
  • CSSファイルをminifyする。

  • grunt-contrib-uglify
  • JSファイルをminifyする。

  • grunt-contrib-watch
  • ファイルの変更を監視してタスクをトリガーする。

 
おなじみのコマンドでプラグインをインストールする。

npm install

 

Gruntfile.jsを作成する

プラグインがインストール出来たので,Gruntfile.jsにタスクを記述する。

module.exports = function(grunt) {
  grunt.initConfig({
    cssmin : {
      pc : {
        src : ['css/reset.css', 'css/styles.css'],
        dest : 'css/pc.min.css'
      },
      mobile : {
        src : ['css/reset.css', 'css/styles.css', 'css/mediaqueries.css'],
        dest : 'css/mobile.min.css'
      }
    },
    uglify : {
      build : {
        options : {
          banner : grunt.file.read('js/License.js'),
        },
        src : ['js/BitmapData.js', 'js/GlowFilter.js'],
        dest : 'js/all.min.js'
      }
    },
    watch : {
      css_pc : {
        files : ['css/reset.css', 'css/styles.css'],
        tasks : ['cssmin', 'copy:css']
      },
      css_mobile : {
        files : ['css/mediaqueries.css'],
        tasks : ['cssmin:mobile', 'copy:css']
      },
      js : {
        files : ['js/BitmapData.js', 'js/GlowFilter.js', 'js/License.js'],
        tasks : ['uglify', 'copy:js']
      }
    },
  });

  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-watch');
};

 
各プラグイン毎の設定方法は以下のページに詳しく載っていた。
Plugins – Grunt: The JavaScript Task Runner
 
 
以上
 
 
参考
現場で使えるGrunt入門 – Gruntを試そう | CodeGrid
「今どきのGruntを使ったフロントエンド開発(HTML/CSS編)」HTML5 Conference 2013 セッションレポート | HTML5Experts.jp
Gruntで始めるWeb開発爆速自動化入門(1):ブラックなWeb開発現場の救世主、Gruntのインストールと使い方 (1/2) – @IT

GitHubとJenkinsを組み合わせて,ユニットテストが成功しているかを常にJenkinsに確認させている。Jenkinsを使い始めてから半年経ったので,そろそろ使い方や導入方法をメモしておく。
 

継続的インテグレーションとは

継続的インテグレーション,CI(continuous integration)とは,主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。エクストリーム・プログラミング(XP)のプラクティスの一つで,狭義にはビルドやテスト,インスペクションなどを継続的に実行していくことを意味する。
 

Jenkinsとは

Jenkinsとは,Javaで書かれたオープンソース継続的インテグレーションツールである。Jenkinsには,2つの主要な機能がある。
1つ目は,継続的なソフトウェアのビルドとテストを行うことが出来る機能である。Jenkinsは「継続インテグレーションシステム」を提供し,開発者が変更をプロジェクトに統合でき,ユーザーがより新しいビルドを容易に取得できるようにする。自動化された継続的なビルドは,生産性を大いに向上させる。
2つ目は,外部で起動するジョブの実行を監視することが出来る機能である。cronによるジョブやprocmailのジョブで,リモートマシンで動作するものが含まれる。例えば,cronについて言えば,出力をキャプチャーした定期的なメールを受信し,それを監視するようなことが出来る。
 

Jenkinsの使い方

今回はCentOSにJenkinsをインストールして使用する。JenkinsはJavaで実装されているので,あらかじめJavaをインストールしておく必要がある。
 

Jenkinsをインストールする

インストールする前に,yumリポジトリを追加する必要がある。

wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

 
リポジトリが追加出来たら,yumコマンドでJenkinsのインストールを行う。

yum install jenkins

 
インストールが完了すると,以下の主要なファイルが作成される。

  • /usr/lib/jenkins/jenkins.war : Jenkins本体
  • /etc/sysconfig/jenkins : 設定ファイル
  • /etc/rc.d/init.d/jenkins : 起動スクリプト

 
Jenkinsはデフォルトで8080ポートでアクセスを受け付けるが,Tomcatを8080ポートで動かしているなどでポート番号を変更する必要がある場合は,設定ファイル /etc/sysconfig/jenkins にある変数 JENKINS_PORT の設定を変更する。

JENKINS_PORT="8008"

 

Jenkinsを起動する

Jenkinsを起動するには以下のコマンドを実行する。

service jenkins start

 
Jenkinsを停止するには以下のコマンドを実行する。

service jenkins stop

 
OS起動時にJenkinsを自動起動するようにするには以下のコマンドを実行する。

chkconfig jenkins on

 

Githubと連携してユニットテストを継続的インテグレーションする

ローカルから確認するのであれば,http://localhost:8080 にアクセスすることでJenkinsのトップページを確認出来る。グローバルIPアドレスを割り当てている場合は http://[IPアドレス]:8080 にアクセスすることでトップページを確認出来る。
 
デフォルトの状態では,バージョン管理システムとしてGitとGitHubを対象にすることが出来ないので,プラグインをインストールして追加する必要がある。
 

Gitプラグインをインストールする

[Jenkinsの管理] -> [プラグインの管理] -> [利用可能タブ] -> [GIT Plugin] を選択して,インストールする。
 

GitHubプラグインをインストールする

[Jenkinsの管理] -> [プラグインの管理] -> [利用可能タブ] -> [GitHub Plugin] を選択して,インストールする。
 

Phingプラグインをインストールする

今回はPHPを対象にしてビルドするので,Phingをインストールする。
[Jenkinsの管理] -> [プラグインの管理] -> [利用可能タブ] -> [Phing Plugin] を選択して,インストールする。
 

ジョブを作成する

トップページから [新規ジョブ作成] を選択する。今回はジョブ名を Hello として, フリースタイル・プロジェクトのビルド を選択し,OKボタンを押下する。
 
続いて,ジョブの詳細設定に入る。
 
[GitHub project] にGitHub上のプロジェクトURLを入力する。


https://github.com/whohu/smokydog/

 
[ソースコード管理] にて, [Git] を選択後, [Repository URL] にリポジトリのURLを入力する。

git@github.com:whohu/smokydog.git

 
[Branches to build] に origin/master と入力する。

origin/master

 
[ビルド・トリガ] にて [SCMをポーリング] にチェックを付ける。 [SCMをポーリング] ではGitリポジトリに変化があった場合に自動的にビルドを行ってくれる。 [スケジュール] を以下のように入力する。

H/3 * * * *

 
上記では,3分毎にSCM(software configuration management,バージョン管理システム)からブランチを取得するように設定している。
 
[ビルド] ではPhingの呼び出しを選択する。 [ターゲット] には unit_test と記述する。
 

build.xmlを記述する

これでGitからブランチを取得する設定は出来たので,続いて,自動でテストを実行する設定を記述する。今回はビルドツールとしてPhingを使っているので, build.xml というファイルを作成し,その中に設定を記述する。
 

<?xml version="1.0" encoding="utf-8" ?>
<project name="Hello" basedir="/var/lib/jenkins/workspace/Hello" default="unit_test">
  <target name="unit_test">
    <exec command="cakerunner --cakephp-app-path app -R app/tests/cases" />
  </target>
</project>

 
1行目では,バージョンとエンコーディングの宣言を行っている。
2行目では, project name がプロジェクト名, basedir が実行のベースとするディレクトリ, default がデフォルトで実行するターゲット名である。
3行目では, target name にてターゲット名を設定している。
4行目では,テストを実行する際のコマンドを設定している。
 
ちなみに4行目ではPHPのSimpleTestを使って,テストを実行することを想定して記述している。
 

まとめ

Jenkinsでは,非常に簡単な設定でユニットテストを継続的インテグレーションすることが出来る。今回紹介した範疇からは外れるが,追加でプラグインを入れることで,ビルド時にシェルスクリプトを実行したり,ビルド失敗時にメールを送ったりすることも出来たりと,更に応用的な使い方も出来る。
 
 
以上
 
 
参考
継続的インテグレーション – Wikipedia
Jenkins – Wikipedia
Meet Jenkins – 日本語 – Jenkins Wiki
CentOS/RedHatにJenkinsをインストールする手順 (yum, RPM) | OSCALOG
Jenkinsを使ってみよう(Mac OS X&Linux)[Ruby、Rails] – Build Insider
Jenkins で PHP_CodeSniffer と PHPUnit を動かすまで vol.1 – Qiita
build.xmlの作成と説明 | Jenkins で PHP_CodeSniffer と PHPUnit を動かすまで vol.2 – Qiita

仕事でCapistranoを使っている。使い始めて半年経ったので,そろそろ使い方をまとめておく。
 

Capistranoとは

Capistranoは,複数のサーバー上でスクリプトを実行するためのオープンソースのツールであり,その主な用途は,ウェブアプリケーションのソフトウェアデプロイメントである。1つ以上のWebサーバ上のアプリケーションを新しいバージョンにする作業を自動化でき,データベースを変更するといった作業もできる。
 

Capistranoの使い方

Capistranoをインストールする

Capistranoはrubyで書かれているので,インストールするにはRubyとRubygemsとBundlerが必要である。
Gemfileという名前のファイルを作成し,以下の記述を追加して bundle install を実行することでインストールすることが出来る。

gem 'capistrano', '~> 3.0.1'

 

Capistranoの設定ファイルを作成する

Capistranoのインストールが終わったら,Capistranoの設定ファイルを作成する。以下のコマンドを実行する。

bundle exec cap install

 
実行すると,Capfile,configディレクトリ,libディレクトリが作成される。
 

config/deploy/ステージ名.rbを記述する方法

ステージ名.rbには、ステージ毎の設定を書くことが出来る。ステージ名.rbには以下のような内容を記述する。

  • ホスト名
  • ログインユーザ
  • サーバロール
  • SSH設定
  • その他、そのサーバに紐づく任意の設定

 
ファイル内では,次のような対応でルールを記述する。

  • server ホスト名
  • user: ログインユーザ名
  • roles: %{サーバロール}
  • その他の設定: 値

 
今回はtest.rbという名前で簡単な例を作成する。

server 'localhost', user: 'vagrant', roles: %w{web}

 
上記の一行には以下の設定情報が含まれている。

  • localhost(Capistranoを実行したホスト)を対象にする
  • そのサーバへはvagrantというユーザでログインする
  • そのサーバに「Webサーバ」というロールを与える

 

config/deploy.rbを記述する方法

config/deploy.rbにはステージ間で共通の設定を記述する。よくあるのは以下のような設定である。

  • アプリケーション名
  • レポジトリ名
  • 利用するSCM
  • タスク
  • それぞれのタスクで実行するコマンド

 
上記のような設定をDSLで記述する。DSLには以下を定義するための文法と語彙が存在する。

  • 設定値の変更と取得
  • これを定義するとグローバル変数のようにdeploy.rbやステージ.rbの全域で設定値を取り出すことが出来る。

  • タスクの定義
  • 実行したいコマンドなどをタスクとして定義することが出来る。

 

設定値の変更と取得
set :repo_url, 'git@github.com:whohu/sample_app'
fetch :repo_url
#=> "git@github.com:whohu/sample_app"

 
上記は set :名前, 値 で設定し, fetch :名前 で設定を取り出している。
 

タスクの定義
task :uptime do
  ここにタスクの内容
end

 
上記は,task :タスク名 do; … endのブロックでタスクを設定している。
 
taskブロックの中には run_locally do; … end ,もしくは on 対象サーバ do; … end ブロックを記述する。前者の run_locally ブロック内にはローカルマシン上で実行するコマンドについて記述する。また,後者の on ブロック内にはサーバ上で実行するコマンドについて記述する。
 

task :uptime do
  run_locally do
    #ここにローカルマシン上で実行するコマンド
  end
  on roles(:web) do
    #ここにサーバ上で実行するコマンド
  end
end

 
上記の on ブロックでは,Webサーバ(:web)のロールが与えられているサーバのみを作業対象とするような記述を行っている。
 

主なコマンド

run_locally と on ブロックで使用することが出来る主なコマンドとして以下の3つがある。

  • execute
  • コマンドを実行することが出来る。

    task :uptime do
      run_locally do
        execute "uptime"
      end
      on roles(:web) do
        execute "uptime"
      end
    end
    
  • capture
  • 標準出力の内容を受け取ることが出来る。

    task :uptime do
      run_locally do
        output = capture "uptime"
      end
      on roles(:web) do
        output = capture "uptime"
      end
    end
    

    上記では, output に標準出力の内容が代入される。

  • info
  • ログを出力することが出来る。

    task :uptime do
      run_locally do
        output = capture "uptime"
        info output
      end
      on roles(:web) do
        output = capture "uptime"
        info output
      end
    end
    

    上記では,標準出力を受け取ってログに出力している。
    ログレベルに応じて debug,info,warn,error,fatal など文法を使うことが出来る。

 

実際にレシピを書いてみる

実際に,config/deploy/test.rbとconfig/deploy.rbに設定を記述してみる。
 

server 'localhost', user: 'vagrant', roles: %w{web}

 

set :application, 'finalge_sample_app'
set :repo_url, 'git@github.com:whohu/sample_app.git'

#Gitからソースコードを取得する。
task :update do
  run_locally do
    application = fetch :application
    if test "[ -d #{application} ]"
#test.rbで記述した環境下にfinalge_sample_appディレクトリがあれば,ディレクトリ内に移動して git pull する。
      execute "cd #{application}; git pull"
    else
#test.rbで記述した環境下にfinalge_sample_appディレクトリが無ければ, git clone する。
      execute "git clone #{fetch :repo_url} #{application}"
    end
  end
end

#上記のタスク update が終わった後に archive が実行される。
task :archive => :update do
  run_locally do
#sbtコマンドでビルドする(sbtはScalaのビルドコマンド)。
    sbt_output = capture "cd #{fetch :application}; sbt pack-archive"
#パスを取得する処理が続く…。
    sbt_output_without_escape_sequences = sbt_output.lines.map { |line| line.gsub(/\e\[\d{1,2}m/, '') }.join
    archive_relative_path = sbt_output_without_escape_sequences.match(/\[info\] Generating (?<archive_path>.+\.tar\.gz)\s*$/)[:archive_path]
    archive_name = archive_relative_path.match(/(?<archive_name>[^\/]+\.tar\.gz)$/)[:archive_name]
    archive_absolute_path = File.join(capture("cd #{fetch(:application)}; pwd").chomp, archive_relative_path)

    info archive_absolute_path
    info archive_name

    set :archive_absolute_path, archive_absolute_path
    set :archive_name, archive_name
  end
end

#上記のタスク archive が終わった後に deploy が実行される。
task :deploy => :archive do
#archive タスクで設定したパスを取得する。
  archive_path = fetch :archive_absolute_path
  archive_name = fetch :archive_name
  release_path = File.join(fetch(:deploy_to), fetch(:application))

  on roles(:web) do
#前回デプロイした際に実行したアプリケーションのプロセスをkillする(2回目以降のデプロイを考慮)
    begin
      old_project_dir = File.join(release_path, capture("cd #{release_path}; ls -d */").chomp)
      if test "[ -d #{old_project_dir} ]"
        running_pid = capture("cd #{old_project_dir}; cat RUNNING_PID")
        execute "kill #{running_pid}"
      end
    rescue => e
      info "No previous release directory exists"
    end

    unless test "[ -d #{release_path} ]"
#test.rbで記述した環境下に release_path に格納したパスが存在しない場合は新しくディレクトリを作成する。
      execute "mkdir -p #{release_path}"
    end
#archive_path変数が参照しているディレクトリをrelease_path変数が参照しているディレクトリへコピーする。
    upload! archive_path, release_path
#release_path変数が参照しているディレクトリへ移動し,tarコマンドでアーカイブを作成する。
    execute "cd #{release_path}; tar -zxvf #{archive_name}"

    project_dir = File.join(release_path, capture("cd #{release_path}; ls -d */").chomp)

    launch = capture("cd #{project_dir}; ls bin/*").chomp
#nohupコマンドで起動スクリプトを実行する。
    execute "cd #{project_dir}; ( ( nohup #{launch} &>/dev/null ) & echo $! > RUNNING_PID)"
  end
end

 

capコマンドでタスクを実行する

必要な設定が記述し終わったら,capコマンドによってタスクを実行する。
capコマンドの第1引数がconfig/deploy/test.rbのtestの部分に対応する。第2引数がタスク名で,task :deployのdeployの部分に対応する。

bundle exec cap test deploy

 
 
以上
 
 
参考
capistrano/capistrano
Capistrano – Wikipedia
入門 Capistrano 3 ~ 全ての手作業を生まれる前に消し去りたい | GREE Engineers’Blog
【入門】Capistrano3で自動デプロイ – Qiita
capistrano 3 をできるだけシンプルにサーバーにコマンドを流し込むツールとして使いこなす – Qiita

Puppetを使い始めて半年経つので,そろそろ使い方をブログにまとめておく。
 

VagrantとPuppet

Vagrantについての説明を省きたいので,Vagrantの概要や使い方についてはこちらの記事をご閲覧いただきたい。
今回は,VagrantとPuppetを組み合わせて使用する。
 

Puppetとは

Puppetはオープンソースの構成管理ツールである。Rubyで書かれており2.7.0まではGPL,それ以降はAPLライセンスとなっている。
PuppetはUnix系やWindowsの設定を管理するようデザインされている。ユーザーはシステムリソース及び状態をPuppetによる表現もしくはRubyのDSLで表現する。この情報はmanifestと呼ばれるファイルに保存される。
 

仮想マシン上でPuppetを使ってみる

Vagrantで仮想マシンを構築する際には,予めRubyとPuppetがインストールされているBoxを使用する。その理由は,PuppetはPuppet自身を用意(構成管理)することが出来ない為だ。
 

ちなみに…

ちなみに,手動でPuppetをインストールするには以下のようなコマンドを使用する。

gem install puppet --no-rdoc --no-ri

 

manifestを準備する

manifestとは

manifestとは,サーバのあるべき状態を記述することができる設定ファイルである。
Puppetでは,サーバー設定を記述したファイルを「manifest(マニフェスト)」と呼び,設定すべき項目を「リソース」と呼ぶ。扱えるリソースの種類(リソースタイプ)にはユーザーの管理を行うための「user」やサービスの管理を行うための「service」,ソフトウェアパッケージの管理を行う「package」など様々なものが用意されており,これらリソースに対し設定すべき項目とその値をmanifestに記述していく。
 

manifestを書いてみる

以下のような内容のファイルを作成し,ファイル名をhello_world.ppとして保存する。

notice("Hello, World!")

 

manifestをどこに設置するか

先ほど作成したhello_world.ppを,Vagrantfileと同じディレクトリに設置する。
このようにすることで,仮想マシン内にマウントされた共有フォルダ上でhello_world.ppを扱うことが出来るようになる。
vagrant sshコマンドで仮想マシンにログインし,/vagrantディレクトリに移動すると,hello_world.ppが存在することが確認出来るはずだ。
 

manifestを適用する

manifestを適用するには,仮想マシン内の/vagrantディレクトリに移動し,以下のコマンドを実行する。

puppet apply hello_world.pp

 
Hello, World!と出力されれば,適用が成功している。
 

実際にpuppetでパッケージをインストールしてみる

実際にzshのパッケージをインストールする際の設定を書いてみる。
先ほどのhello_world.ppと同じ階層に,以下の内容でzsh.ppというファイルを作成する。

package { 'zsh':
  ensure => installed,
}

 
今度は,ログの表示だけではなく,システムへの変更も行うので,仮想マシン内の/vagrantディレクトリに移動し,sudo権限でmanifestを適用する。

sudo puppet apply zsh.pp

 
Finished catalog runと出力されれば,適用が成功している。
 
zshがインストールされていることを,以下のコマンドで確認してみると良いだろう。

which zsh

 

モジュールを使ってみる

Puppetが標準で扱うことが出来るリソース型はType Referenceで確認できるが,「モジュール」と呼ばれる機能拡張をインストールすることで,これ以外のリソースを扱うことも可能になる。モジュールはPuppetの開発元であるPuppet Labsだけでなく,サードパーティからも公開されており,Puppet Forgeというサイトにまとめられている。
 
試しに,以下のコマンドでmysqlモジュールをインストールしてみる。

puppet module install puppetlabs/mysql

 
モジュールをインストールすることで,そのモジュールで提供される機能がマニフェスト内で利用可能になる。例えば,mysqlモジュールを使ってMySQLクライアントをインストールするには,以下をmanifestに書き加えるだけでよい。

class { “mysql”: }

 

VagrantからPuppetを操ってプロビジョニングする

Vagrantfileにmanifestのパスやモジュールのパスを書いておくことで,VagrantからPuppetを利用してプロビジョニング(構成管理)を行うことが出来るようになる。
以下をVagrantfileに記述する。

config.vm.provision :puppet do |puppet|
  puppet.manifests_path = 'puppet/manifests'
  puppet.manifest_file  = 'default.pp'
  puppet.module_path    = 'puppet/modules'
end

 
仮想マシン起動中にVagrantからプロビジョニングするには,以下のコマンドを実行する。

vagrant provision

 
また,以下のコマンドでは仮想マシンの起動時にVagrantからプロビジョニングをすることも出来る。

vagrant up --provision

 
 
以上
 
 
参考
Puppet (ソフトウェア) – Wikipedia
Rubyist Magazine – 入門 Puppet ダイジェスト
Puppetを使ったLinuxシステムの設定自動管理 – さくらのナレッジ

Vagrantを使い始めて半年経つので,そろそろ使い方をブログにまとめておく。
 

Vagrantとは

仮想環境の雛形を作成し,どこでも簡単に同じ環境を再現できるようにするソフトウェア。
コンピュータ上にVirtualBoxで仮想マシンを起動し,その上でLinuxやWindows,Mac OS Xなどを動作させることができる。Vagrantでは仮想マシンやOSの設定をテキストファイルで与えることで特定の状態に初期化することができ,この設定ファイルをコピーすることでどこでも簡単に同じ仮想環境を再現することができる。
 

Vagrantのセットアップ

上記の通り,VagrantはVirtualBoxと連携して動作するので,両方をインストールする必要がある。
今回はHomebrewとhomebrew-caskを使ってVirtualBoxとVagrantをインストールする。
Homebrewとhomebrew-caskの使い方については,説明を省きたいので,こちらの記事をご閲覧いただきたい。
 

brew cask install virtualbox
brew cask install vagrant

 

Boxとは

BoxとはVagrant用に調整されたOSが格納されたファイルである。以下のページから様々なBoxをダウンロードすることが出来る。
 
A list of base boxes for Vagrant – Vagrantbox.es
 

Boxを追加する

仮想環境を構築するにはOSが必要なので,以下のコマンドでVagrantにBoxを追加する。

vagrant box add precise64 http://files.vagrantup.com/precise64.box

 

Boxが追加されたことを確認する

VagrantにBoxが追加されたことを確認するには,以下のコマンドを実行する。

vagrant box list

 
precise64と表示されればBoxの追加が成功している。precise64というのは,先ほどBoxに付けた名前である。
 

Vagrantの初期設定を行う

任意のディレクトリを作成し,仮想マシンを初期化・セットアップする。

mkdir test #任意のディレクトリを作成
cd test
vagrant init precise64

 
vagrant initを行うと,Vagrantfileというファイルが生成される。このファイルには,ベースとしたイメージファイルや,作成された仮想マシンのIPなどが記録されている。
 

Vagrantの使い方

仮想マシンを起動する。

vagrant up

 
仮想マシンをシャットダウンする。

vagrant halt

 
Vagrantfileの再読み込みする。

vagrant reload

 
仮想マシンの状態を確認する。

vagrant status

 
仮想マシンを除去する。

vagrant destroy

 
仮想マシンにssh接続する。

vagrant ssh

 
ChefやPuppet,Ansibleなどと連携して仮想マシンに対してプロビジョニングを行う。

vagrant provision

 
Vagrantを起動しつつ,プロビジョニングする。

vagrant up --provision

 
 
以上
 
 
参考
Vagrantとは – 意味/解説/説明/定義 : IT用語辞典
Vagrant セットアップ (Mac) – Qiita
Vagrantの使い方 ~仮想マシンを簡単に作成しよう。 – (゚∀゚)o彡 sasata299’s blog