Skip to content

Instantly share code, notes, and snippets.

@yujiorama
Forked from dergachev/README.md
Last active December 15, 2015 01:29
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yujiorama/5180494 to your computer and use it in GitHub Desktop.
Save yujiorama/5180494 to your computer and use it in GitHub Desktop.

Vagrant Setup

このチュートリアルは初めて Vagrant のプロジェクトを作るためのものです。

普通の Ubuntu VM を作るところから始めて、プロヴィジョニングツールとして Chef を使って次のような操作を行います。

  • パッケージマネージャによる vim と git のインストール
  • JSON 設定ファイルを使ったユーザアカウントの作成
  • 特定のユーザのためのドットファイル (.bashrc、.vimrc など) を git リポジトリに作成

最後に、構築した VM 環境を新しい "Vagrant box" として簡単にパッケージングできることを説明します。 すぐにあなたのプロジェクトに配備できるし、他の人々とも共有できるものです。

Vagrant のインストール:

Vagrant の基本的な知識については次のリンクを参照してください。

VirtualBox のダウンロードとインストールは https://www.virtualbox.org/wiki/Downloads からどうぞ。 Vagrant のダウンロードとインストールは http://downloads.vagrantup.com からどうぞ。

Vagrant プロジェクトの準備:

Precise Pangolin Ubuntu 12.04 の vagrant box を使います。 http://vagrantbox.es/ を参照してください。

    vagrant box add precise64 http://files.vagrantup.com/precise64.box # 323MB, ダウンロードが早いもので

新しい Vagrant プロジェクトは ~/code/vagrant-tutorial で作ります。 今インストールしたばかりの precise64 box を雛形にします。

    mkdir -p ~/code/vagrant-tutorial/ & cd ~/code/vagrant-tutorial/
    vagrant init precise64 # Vagrantfile の雛形がカレントディレクトリに作成されます

VM の作成

Vagrant で VM を起動します。デフォルトの Vagrantfile によって設定されたものです。

  vagrant up 

VM は VirtualBox で実行しています。パスワード無しの ssh でログインできます。

  vagrant ssh # ssh in to the VM

作成した VM 上の /vagrant ディレクトリは、~/code/vagrant-tutorial と共有されていることを覚えておきましょう。

  ls /vagrant # プロジェクトのルートディレクトリが共有フォルダとしてマウントされています

それでは Vagrantfile を編集していきましょう。Vagrant に VM を再構築させる 3 つの方法があります。

  # 一番高速です。VM を止めずに provisioner (例: chef-solo) を再実行します
  vagrant provision 

  # VM を再起動してから provijion を実行します。virtualbox の設定 (共有フォルダ等) を変更した場合はこれを実行してください
  vagrant reload 

  # VM を破棄して雛形から作り直します
  # 遅いけど安全です
  vagrant destroy --force && vagrant up # deletes the VM and rebuilds 

Chef による VM の設定変更の適用

Vagrant のいいところは変更した設定を VM に適用するのが簡単なところです。 次のようなことができます。

  • パッケージのインストール (apt-get install vim)
  • 設定ファイルの更新 (/etc/apache2/httpd.conf)
  • ユーザアカウントの準備
  • スクリプトの実行

Vagrant ではこのプロセスを "provisioning" と呼びます。Puppet は Chef といったメジャーなツールをサポートしています。

このチュートリアルでは Chef-solo を使います。これは単体サーバで使う Chef です。Chef ではサーバをセットアップするスクリプトを "recipes" と呼び、関連する recipes をグループにしたものを "cookbooks" と呼びます。 (雰囲気は掴めますか?)

このチュートリアルでは chef-solo を使って次のような cookbooks を適用します。

  • vim: 基本的に sudo apt-get install vim を実行します
  • git: 基本的に sudo apt-get install git を実行します
  • users: JSON 設定ファイルからユーザアカウントを作成します
  • homesick: 公開 git リポジトリからユーザごとのドットファイル (例:.vimrc、.bashrc) をインストールします

次の cookbooks はおまけですが、ssh の公開鍵認証の必要なドットファイルリポジトリをサポートするために必要です (エージェント転送します) 。

  • homesick_agent
  • extend_lwrp
  • root_ssh_agent
  • ssh_known_hosts

カスタム cookbooks がどんな風に実行されるのかもっと知りたければ (そして私が Chef を勉強するために参考にしたのは) 次のサイトを参照してください。

cookbooks のインストールと設定

cookbooks (chef のデプロイメントスクリプト) と databags (JSON 設定ファイル) のサブディレクトリを作ります。

  mkdir ~/code/vagrant-tutorial/site-cookbooks
  mkdir ~/code/vagrant-tutorial/cookbooks
  mkdir ~/code/vagrant-tutorial/databags

コミュニティでメンテンンスしている cookbooks を cookbooks に配置します。

  cd ~/code/vagrant-tutorial/cookbooks
  git clone git://github.com/fnichol/chef-homesick.git homesick
  git clone git://github.com/opscode-cookbooks/ssh_known_hosts.git
  git clone git://github.com/opscode-cookbooks/vim.git
  git clone git://github.com/opscode-cookbooks/git.git

このチュートリアルのためにカスタム cookbooks を作ったので site-cookbooks に配置します。

  cd ~/code/vagrant-tutorial/site-cookbooks
  git clone git://github.com/dergachev/chef_homesick_agent.git homesick_agent
  git clone git://github.com/dergachev/chef_root_ssh_agent.git root_ssh_agent
  git clone git://github.com/dergachev/chef_users.git users
  git clone git://github.com/dergachev/chef_extend_lwrp.git extend_lwrp

cookbooks を配置したら cookbooks のディレクトリ名と cookbook の名前が一致しているかよく確かめてください。

  • 間違い: git clone git://github.com/dergachev/chef_users.git
  • 正解: clone git://github.com/dergachev/chef_users.git users

databags の配置

usershomesickssh_known_hosts の cookbooks には、次のサブディレクトリに配置された JSON 設定ファイルが必要になります。

  mkdir -p ~/code/vagrant-tutorial/databags/users
  mkdir -p ~/code/vagrant-tutorial/databags/ssh_known_hosts

作成するユーザごとに、databags/users/USERNAME.json という形式で配置した設定ファイルが必要です。ユーザにドットファイル用のディレクトリがある場合はそれも配置しなければなりません (homesick ではそれを calstels と呼びます) 。後で 'homesick_castles` プロパティを追加することになります。

サンプル databags/users/testuser.json

例として次の内容を databags/users/testuser.json に保存してください。次のフィールドの値を変えないといけないので注意してください。

  • id : ユーザ名。json ファイル名と同じでなければなりません。
  • password: パスワードハッシュ。openssl passwd -1 "password123" で生成してください
    • セキュリティを気にしているなら openssl passwd -1 を実行してからパスワードをタイプしてください
  • ssh_keys: SSH 公開鍵の中身です
  • homesick_castles: git clone することになるドットファイルのための git リポジトリです
    • ドットファイルリポジトリは homesick と互換性が無ければなりません。https://github.com/technicalpickles/homesick#readme を参照してください
    • 読み込み専用 (HTTP) の clone をするなら "git://github.com/technicalpickles/dotpickles.git" としてください
    • 読み書き可能 (SSH) の clone をするなら "git@github.com:technicalpickles/dotpickles.git" としてください
{
  "groups": [
    "sysadmin"
  ],
  "comment": "Test User Name",
  "password": "$6$BcvQ4/W1iMlP9S33$k4RmfftqRi1I5T.z113L1VrXX0K78Uwii8Ot4WC1p74m2agZHYqfp9eNYG10B6adrQIEJ4jQyagJiMt7q9MiF.",
  "ssh_keys": [
    "ssh-rsa AAA456...uvw== testuser@testdomain.com"
  ],
  "id": "alex",
  "homesick_castles": [
    {
      "name": "dotfiles",
      "source": "git://github.com/technicalpickles/dotpickles.git"
    }
  ],
  "shell": "/bin/bash",
  "email": "testuser@testdomain.com"
}

それぞれの databag の書式については次の URL を参照してください。

サンプル databags/ssh_known_hosts/github.json

いずれかの homesick_castle プロパティに SSH 形式の git URL (読み書き可能にするためのもので、普通は git@github.com:technicalpickles/dotpickles.git のような形式) が含まれるなら、databags/ssh_known_hosts/hostname.json プロパティにホストキー書名を追加しなければなりません。

もし github を使っているなら databags/ssh_known_hosts/github.json を次のようにしてください。

{
"id": "github",
"fqdn": "github.com",
"rsa": "AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==",
"ipaddress": "207.97.227.239"
}

git サーバが git.mycompany.com とかだったら、git-mycompany.jsoncat ~/.ssh/known_hosts | grep git.mycompany.com の出力を書きこんでください。詳細は https://github.com/dergachev/chef_homesick_agent#install-ssh_known_hosts-cookbook を参照してください。

Vagrantfile の配置

ここまでできたら、Vagrant が chef-solo provisioner を介してどの cookbooks や recipes を配置するのか教えてあげましょう。雛形ファイルを次のように編集します。

Vagrant::Config.run do |config|
  config.vm.box = "precise64"

  # Necessary for homesick_agent::data_bag
  config.ssh.forward_agent = true

  config.vm.provision :chef_solo do |chef|

    # contains "users" and "ssh_known_hosts" databags
    chef.data_bags_path = "databags"

    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]

    # stuff that should be in base box
    chef.add_recipe "vim"
    chef.add_recipe "git"
    
    # setup users (from data_bags/users/*.json)
    chef.add_recipe "users::ruby_shadow" # necessary for password shadow support
    chef.add_recipe "users::sysadmins" # creates users and sysadmin group
    chef.add_recipe "users::sysadmin_sudo" # adds %sysadmin group to sudoers

    # homesick_agent and its dependencies
    chef.add_recipe "root_ssh_agent::ppid" # maintains agent during 'sudo su root'
    chef.add_recipe "ssh_known_hosts" # populates /etc/ssh/ssh_known_hosts from data_bags/ssh_known_hosts/*.json
    chef.add_recipe "homesick_agent::data_bag" # includes homesick::data_bag
    
    # instruct "homesick::data_bag" to install dotfiles for the user 'testuser'
    chef.json = {
       :users => ['testuser']
    }

    # chef.log_level = :debug

  end
end

あなたが書いた databags のユーザと合うよう、chef.json[:users] を適切に編集してください。

VM の起動

全部できたら VM を起動する準備は完了です!

  vagrant destroy --force && vagrant up

VM の起動には少し時間がかかりますが、Vagrantfile に書いた cookbooks や recipes を chef-solo で配置するのにはそれよりも時間がかかります。

何かが間違っているかもしれません。chef の吐き出すエラーに注意しましょう。どの段階で間違えたのかを見極めるためです。行き詰まってしまったら、Vagrantfile の次の行をコメントアウトすることも検討してみてください。

  chef.log_level = :debug

普通は何かいじるたびにエラーが解消されたことを確認するため vagrant provision を再実行しなければならないでしょう。chef は最初にエラーを検出した段階で停止するということを覚えておいてください。つまり、1 つエラーを直したとしてもその次のエラーが起きるだけなのかもしれないのです。ほとんどの場合完全に最初からやり直すには vagrant destroy --force ; vagrant up しなければならないのです。

Good luck!

Connect to VM

chef のエラーを解決できたなら、新しく作ったユーザとして ssh で VM にログインしましょう。

  vagrant ssh -p -- -l testuser   #  'testuser' はあなたが作ったユーザ名で置き換えてください
  ls -al ~ # ドットファイルが .homesick へのシンボリックリンクになっていなければなりません

vagrant が localhost:8080vagrant:80 にポート転送することは覚えておきましょう。VM 上に web サーバを構築したなら http://127.0.0.1:8080 からアクセスできます。

カスタマイズ Vagrant box のパッケージング

ここまでくれば雛形 Vagrant box の precise64 をカスタマイズした結果を precise64-customized としてパッケージングできます。これは雛形として今後別のプロジェクトで利用できます。 次のステップは Vagrant のパッケージングチュートリアルをなぞっています。 http://vagrantup.com/v1/docs/getting-started/packaging.html

注:次回にこれを試す前に、次のコマンドで前回作成した boxes を削除しなければなりません

  cd ~/code/vagrant-tutorial
  rm ~/code/vagrant-tutorial/package.box
  vagrant box remove precise64-customized

最初に ~/code/vagrant-tutorial/Vagrantfile.pkg を作りましょう。

Vagrant::Config.run do |config|
  config.vm.forward_port 80, 8080
  config.ssh.forward_agent = true # important for recipe[homesick_agent::data_bag]
end

それから現在実行している VM を Vagrantfile.pkg に従ってエクスポートします。

  vagrant package --vagrantfile Vagrantfile.pkg #creates ~/code/vagrant-tutorial/package.box

そして利用可能な雛形セット (~/.vagrant.d/boxes/ に格納されています) に precise64-customized を追加します。

  vagrant box add precise64-customized ~/code/vagrant-tutorial/package.box

うまくいったら新しいプロジェクトでテストできます。

  mkdir -p ~/code/new-vagrant-project ; cd ~/code/new-vagrant-project
  # generate a Vagrantfile that includes config.vm.box="precise64-customized"
  vagrant init precise64-customized 
  vagrant up

ユーザアカウントの作成も含めて全てうまくいきます。

  cd ~/code/new-vagrant-project
  vagrant ssh -p -- -l testuser # replace 'testuser' with your username
  ls -al ~    # various dotfiles should be symlinked to ~/.homesick

やりましたね! (運が良ければ)

Vagrantfiles のバンドル化と Vagrantfile の上書きについて詳しくは次の URL を参照してください。 http://vagrantup.com/v1/docs/vagrantfile.html#vagrantfile_load_order

新規に雛形 box を構築する

雛形 box を新規に構築したかったら次の URL を参照してください。

もしくは VeeWee (ディストリビューションの ISO イメージから Vagrant の雛形 box を作成するツール) をチェックアウトしてください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment