almost 4 years ago

系統:

Mac OS X Yosemite 10.10.1
Ruby 2.1.5
Rails 4.1.8
Vagrant 1.7.1
VirtualBox 4.3.20
Virtual Machine - Ubuntu 14.04 LTS

相關連結

Chef ( https://www.chef.io/ )
Chef Documents ( http://docs.chef.io/ )
Cookbooks ( https://supermarket.chef.io/ )
knife-solo ( http://matschaffer.github.io/knife-solo/ )
Berkshelf ( http://berkshelf.com/ )

設定步驟如下

1. 模式說明

為了能同時使用 Chef 來配置 Vagrant 虛擬機器或 VPS 的基礎環境,所以,本篇文章則是說明不使用 Vagrant 本身支援 Chef 的功能,另外獨立使用 Knife Solo 來配置的方法。

2. knife-solo 安裝

藉由使用 knife-solo 來強化 Chef

安裝 Berkshelf

為了讓 knife-solo 可以智能的結合 Berkshelf 來管理 cookbooks,必須先安裝 Berkhelf。

$ gem install berkshelf
安裝 knife-solo
$ gem install knife-solo

3. 初始化 chef 專案

這時候初始化一個 chef 專案,knife-solo 就會偵測到有安裝 Berkshelf,在專案的根目錄自動生成檔案 Berksfile,本篇文章就針對 Vagrant 虛擬主機 ( 系統版本為 Ubuntu 14.04 LTS ) 來做測試。

$ knife solo init ubuntu_14.04

4. Remote 主機 ( Vagrant 虛擬主機 or VPS ) 安裝 Chef

此時,執行下面指令可以在 Remote 主機自動安裝最新版 Chef,並且在 chef 專案資料夾 nodes 底下生成一個相對應的 json 檔案。

$ knife solo prepare vagrant@10.10.10.10

備註:此時,knife-solo 是使用 ssh 連接虛擬主機,並非是如同 vagrant ssh,所以,必須輸入使用者 vagrant 的密碼 ( 預設為 vagrant )。
此時產生對應的 json 檔案內容如下:

{
  "run_list": [

  ],
  "automatic": {
    "ipaddress": "10.10.10.10"
  }
}

接下來就是要準備 cookbooks(料理書) 和 recipes(食譜) 給虛擬主機的 chef(廚師) 烹飪了!

5. cookbooks 和 recipes

在一個 cookbooks 通常會存在一個名為 default 的 recipe,當然有些 cookbooks 會有多個 recipes,讓我們針對自己的虛擬主機,在 https://supermarket.chef.io/ 找出所需的 cookbooks,本篇文章就針對 Vagrant 虛擬主機 ( 系統版本為 Ubuntu 14.04 LTS ) 做設定。

設定 Berksfile

找到所需的 cookbooks 之後,就在 Berksfile 中新增。

source "https://supermarket.chef.io"

cookbook 'apt', '~> 2.6.0'
cookbook 'curl', '~> 2.0.1'
cookbook 'git', '~> 4.0.2'
cookbook 'nginx', '~> 2.7.4'
cookbook 'postgresql', '~> 3.4.14'
cookbook 'database', '~> 2.3.1'
cookbook 'sqlite', '~> 1.1.0'
cookbook 'nodejs', '~> 2.2.0'
設定 recipes

接下來就是要告訴 remote 主機的 chef 要執行哪些 recipes,打開 nodes 中對應的 json 檔案,將 recipes 新增在 run_list 的 Array 中。

{
  "run_list": [
    "recipe[apt]",
    "recipe[curl]",
    "recipe[git]",
    "recipe[nodejs]",
    "recipe[nginx]",
    "recipe[postgresql::server]",
    "recipe[postgresql::ruby]",
    "recipe[sqlite]"
  ],
  "nginx": {
    "default_site_enabled": false
  },
  "postgresql": {
    "password": {
      "postgres": "postgres"
    }
  },
  "automatic": {
    "ipaddress": "10.10.10.10"
  }
}

備註:

1. 安裝 nginx 時,必須將 default_site_enabled 設定為 false,不然以後在新增 nginx 其他 sites 時,如果每次執行 `cook` 時,會持續啟動 nginx default site,並佔據 port 80。

2. 安裝 postgresql 時,必須設定使用者 postgres 的密碼,如無設置或是設置空白,則會導致以後使用 cookbook `database` 新增 postgresql 的使用者或是資料庫發生錯誤。

4. cook recipes (開始烹飪拉!!)

都設定好之後,我們就要執行下列指令讓 remote 主機的 chef 開始 cook recipes 了!!

knife solo cook vagrant@10.10.10.10

完成之後,一台將用來跑 rails 的 remote 主機就配置好基本環境了!!

5. knife-solo bootstrap

如果在設定 chef 專案已經很熟手了,就不需要 preparecook 指令分開執行,就可以設定好之後,針對一台乾淨的 remote 主機,直接執行以下指令來完整安裝,也就是說 bootstrap 就是 preparecook 的綜合體。

$ knife solo bootstrap user@ip_or_domain_name

6. ssh no password

如果想要在 cook 不要一直輸入密碼的話,可以執行下列指令來實現。

cat ~/.ssh/id_rsa.pub | ssh vagrant@10.10.10.10 "mkdir -p /home/vagrant/.ssh && cat >> /home/vagrant/.ssh/authorized_keys"

此時還是要輸入一次密碼唷!

← 使用 Vagrant 和 Chef 開發 Rails - Part 1 - Vagrant 使用 Vagrant 和 Chef 開發 Rails - Part 3 - Site Cookbook →
 
comments powered by Disqus