OpsWork / Terraform / Vagrant 小感

Vagrant 其實不太能拿來跟 OpsWork 或 Terraform 相比,不過有了 push 之後,算是有個堪用的 deploy 方法…

前一陣子看到 Terraform ,只要寫好腳本(或者該說是計劃),這工具就會自動幫你把環境佈署到雲端,比如說,你有 Web application、Web Server、Database、HAProxy … 等等,在腳本描述好關係之後,Terraform 可以自動幫你佈署到 AWS 、DigitalOcean、CloudStack、Docker、Google cloud 、OpenStack、Heroku … 等地方,非常的方便。但如果要用在內部的環境,可能就沒辦法 (除非內部自架了 CloudStack 或 OpenStack)。

OpsWorks 是在 DevOps gitter 裡看到的,Google 了一下,這是 Amazon 提供的服務,做的事情其實跟 Terraform 蠻相近的,跟 Amazon 的服務整合度更高。我是還沒試用過,不知道好不好用。

Vagrant 本身是操作虛擬機器的好幫手,在 Google Altas 時,看到 Vagrant 有提供 push 這子指令,這可以用來做 deploy 。比如說,你在 Vagrantfile 裡描述了 Web application server、Web Server、Database server … 等等,在本地端可以用 vagrant up  啟動,進行驗證,那要實際佈署到遠端時,就可以用 push 來做。push 的對象(或者該說是方式?)可以是 Altas、FTP/SFTP、Heroku 或執行自訂的腳本,所以看起來或許適合我現在的情境。

順便記一些連結:

golang 起手

環境是 Ubuntu 14.04 trusy,14.04 預載的 go 版本是 1.2.1 。

先安裝 golang :sudo apt-get install golang golang-go golang-go.tools ,然後設定環境變數,看是用 bash 或 zsh,bash 就是改 $HOME/.bashrc,zsh 就是改 $HOME/.zshrc,加入:

export GOROOT=$(go env GOROOT)
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

然後 mkdir -p $HOME/.go ,$GOPATH 這路徑裡,放的是 go get 所取得的原始碼。

接著就可以照 golang 环境配置建议 裏面的建議來安裝工具,裏面的 oracle 可以跳過,這已經包在 golang-go.tools 裡。另外這篇裡的編輯器是介紹用 Github 的 ATOM,所以該找時間來找一下 vim 的好用 plugin 來用。

要安裝比較新版本的 golang ,除了可以找 ppa 之外,也可以用 govm 或 gvm 來安裝:

govm 看起來顯然是小很多,gvm 在網路上的介紹文比較多,自己目前是還沒試過。

Packer

是 HashiCorp 釋出的一個工具,它可以依照寫好的設定檔,打包各種格式的 image,像 Amazon Machine Image (給 EC2 用)、Virtualbox iso/ovf、digital ocean、docker、openstack、vmware iso/vmx、Vagrant box …. 等等。安裝很簡單,就下載 zip ,解壓縮 (Linux 下要改權限) 放到路徑裡就可以使用了。

第一次撰寫可以參考 https://github.com/shiguredo/packer-templates 這裡的設定檔範例。指令的使用也蠻簡單,例如:只要做 virtualbox 用的 ovf ,packer build -only=virtualbox-iso template.json

一口氣 build 不同格式的 image:packer build -parallel=true template.json

在 provision 的部份,可以用 shell、chef、puppet… 等,也可以用 ansible https://www.packer.io/docs/provisioners/ansible-local.html

打包好的 image ,會自動放在或推到對應的地方,例如 AMI 就會放到 Amazon 那邊,docker image 可以推送到 docker registry,digital ocean 就是 droplet 或者是推送到 vagrant 等等。

git clone fail

遇到下面這錯誤~

$ git clone http://your_host/your_group/your_project.git
Cloning into 'your_project'...
remote: Counting objects: 426, done.
remote: Compressing objects: 100% (375/375), done.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

過程大致就如 gitlab – error: git-upload-pack died of signal 13 – Stack Overflow

所以我試過 git config –global http.postBuffer 524288000 ,也試著加過 GIT_CURL_VERBOSE ,但都看不出什麼端倪,伺服器上的 log 也沒看到,最後就如 gitlab – error: git-upload-pack died of signal 13 – Stack Overflow 的解答所說,是 permission 問題。我猜可能是我有調整 nginx user 的關係,導致錯誤。後來就是依據 log 裡的提示,調整 /var/run/nginx/proxy 下資料夾的 owner 就解決問題了。

Use NFS as synced folder in Vagrant

Just note during I use NFS as synced folder in Vagrant.

  1. In your host, you have to install nfs-kernel-server:
    sudo apt-get install nfs-kernel-server
  2. In your Vagrantfile, you have to specify private_network even you want to use public_network.  If you don’t specify private_network, vagrant up will fail.  Then specify synced_folder.
    config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.network "public_network", ip: "192.168.11.2", bridge: "eth0"
    config.vm.synced_folder ".", "/vagrant", type: "nfs"

Reference:

Import Vagrant box into VirtualBox

vagrant package 得到的 package.box 實際上是一個 tarball 檔案,用 tar xzf 就可以解開。裏面會有 box.ovf, *.vmdk, private key … 等檔案,使用 vboxmanage import box.ovf 就可以匯入。

在匯入以後,要注意幾點,第一個是名稱,名稱是之前 Vagrantfile 所在目錄的名稱再加上一串數字,你可以用 vboxmanage modifyvm your_vm –name “new name”。

第二個是網路介面名稱,因為在你匯入的機器上可能沒有這個網路介面,如果你跟我一樣在 Vagrantfile 裡是設定用 public network 的話,可以用 vboxmanage modifyvm your_vm –bridgeadapterN new_network_adapter 來替換,那如果是用 private network 之類的,也是用 modifyvm ,總之原理一樣就是。

其他你可能還會用到的指令:

  • 列出 VirtualBox 裡有哪些 VM:vboxmanage list vms
  • 列出指定 VM 的資訊:vboxmanage showvminfo your_vm
  • 刪除 VM:vboxmanage unregistervm your_vm –delete

簡單的組合技可以參考這個 gist

nodeschool.io expressworks

最近看到 nodeschool.io ,所以就照著說明來上 expressworks 的課。

首先就是要安裝:npm install -g expressworks workshopper-exercise

接著建立一個目錄,作為練習用,例如 expressworks_practice ,然後在該目錄下安裝 express jade :npm install express jade

最後就可以練習了,要練習,就是輸入 expressworks,就可以看到選單,選定項目後,會有題目的說明。

以下是你可用的指令:

  • 執行程式並自動驗證:expressworks run program.js
  • 執行:node program.js
  • 檢查:expressworks verify program.js
  • 顯示題目說明:expressworks print
  • 顯示選單:expressworks

但要注意的是,expressworks 似乎是用關鍵字來檢查程式,所以有可能用 node 執行時會有錯誤發生,但 expressworks 卻告訴你通過了的情況。

搬家,從 Subverion 到 Git

從 Git – Git 与 Subversion 整理出來的步驟,Git 本身就有可以從 Subversion 簽出程式的功能:git-svn,應用 git-svn 就可以成功的搬家:

  1. 先到原 svn 專案下,執行 svn log ^/ –xml | grep -P “^<author” | sort -u | perl -pe ‘s/<author>(.*?)<\/author>/$1 = /’ > users.txt ,產生 users.txt,編輯裏面 svn user 跟 git user 的對照。
  2. 接著用 git-svn 重新簽出 svn repository: git svn clone your_svn_url -T trunk -b branches -t tags -s your_project -git -Ausers.txt –no-metadata
    在 Subversion 裡,是以目錄 trunk/branches/tags 來區分主枝、分枝跟標籤,-T, -b, -t 就是告訴 Git 這些事情。
    -Ausers.txt 就是告訴 Git-svn 要參考前個步驟所產生的 users.txt 去做使用者的對照。
    –no-metadata 是處理掉一些 git-svn 加上的附加訊息,這可以用 git log 比較得知,沒有加的話,git log 結果會有 git-svn-id: …. 的訊息。
  3. 如果有 tags 的話,會需要處理:git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag “$tagname” “tags/$tagname”; git branch -r -d “tags/$tagname”; done
  4. 如果有 branch 的話,也需要處理:git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch “$branchname” “refs/remotes/$branchname”; git branch -r -d “$branchname”; done
  5. 接著加入 git remote repository :git remote add origin your_git_remote_repository ,再用 git push origin –all 推上去。
  6. 最後把 tags 也推上去: git push origin –tags