開始 Vagrant 之旅
如果你和我一樣,你可能在某一個地方有一個「沙盒」,你可以在那裡進行你正在做的任何項目。隨著時間的推移,沙盒會變得雜亂無章,充斥著各種想法、工具鏈元素、你不使用的代碼模塊,以及其他你不需要的東西。當你完成某件事情時,這會使你的部署變得複雜,因為你可能不確定項目的實際依賴關係 —— 隨著時間推移你在沙盒中已經有了一些工具,但是你忘了必須安裝它。你需要一個乾淨的環境,將所有的依賴關係放在一個地方,以便以後更方便。
或者你可能工作在 DevOps 中,你所服務的開發人員用模糊的依賴關係來編寫代碼,這使得測試變得更加困難。你需要一種方法來獲得一個乾淨的盒子,將代碼放入其中,並通過它運行代碼,而且你希望這些環境是一次性的和可重複的。
那麼選擇 Vagrant 吧。由 HashiCorp 在 MIT 許可證下創建,Vagrant 可充當 VirtualBox、Microsoft Hyper-V 或 Docker 容器的包裝器和前端,並且可以通過許多其他供應商的插件進行擴展。你可以配置 Vagrant 以提供可重複的、乾淨的環境,並且已安裝需要的基礎架構。配置腳本是可移植的,因此,如果你的倉庫和 Vagrant 配置腳本位於基於雲存儲上,那麼你只需要很少的限制就可以啟動並在多台機器機器上工作。讓我們來看一看。
安裝
對於本次安裝,我的環境是 Linux Mint 桌面,版本是 18.3 Cinnamon 64 位,在其他大多數 Debian 派生系統上安裝非常類似。在大多數發行版中,對於基於 RPM 的系統也有類似的安裝程序。Vagrant 的安裝頁面為 Debian、 Windows、 CentOS、 MacOS 和 Arch Linux 都提供下載,但是我在我的軟體包管理器中找到了它,所以我在那進行了安裝。
最簡單的安裝使用了 VirtualBox 作為虛擬化提供者,所以我需要安裝它:
sudo apt-get install virtualbox vagrant
安裝程序將會獲取依賴項 —— 主要是 Ruby 的一些東西,安裝它們。
建立一個項目
在設置你的項目之前,你需要了解一些你想要運行它的環境。你可以在 Vagrant Boxes 倉庫中找到為許多虛擬化供應商提供的大量預配置的 系統 。許多會預先配置一些你可能需要的核心基礎設置,比如 PHP、 MySQL 和 Apache,但是對於本次測試,我將安裝一個 Debian 8 64 位 「Jessie」 裸機沙盒並手動安裝一些東西,這樣你就可以看到具體過程了。
mkdir ~/myproject
cd ~/myproject
vagrant init debian/contrib-jessie64
vagrant up
最後一條命令將根據需要從倉庫中獲取或更新 VirtualBox 鏡像,然後運行啟動器,你的系統上會出現一個運行的系統!下次啟動這個項目時,除非鏡像已經在倉庫中更新,否則不會花費太長時間。
要訪問該沙盒,只需要輸入 vagrant ssh
,你將進入虛擬機的全功能 SSH 會話中,你將會是 vagrant
用戶,但也是 sudo
組的成員,所以你可以切換到 root,並在這裡做你想做的任何事情。
你會在沙盒中看到一個名為 /vagrant
目錄,對這個目錄小心點,因為它與你主機上的 ~/myproject
文件夾保持同步。在虛擬機 /vagrant
下建立一個文件它會立即複製到主機上,反之亦然。注意,有些沙盒並沒有安裝 VirtualBox 的附加功能,所以拷貝只能在啟動時才起作用。有一些用於手動同步的命令行工具,這可能是測試環境中非常有用的特性。我傾向于堅持使用那些有附加功能的沙盒,所以這個目錄可以正常工作,不必考慮它。
這個方案的好處很快顯現出來了: 如果你在主機上有一個代碼編輯工具鏈,並處於某種原因不希望它出現在虛擬機上,那麼這不是問題 —— 在主機上進行編輯,虛擬機會立刻更改。快速更改虛擬機,它也將其同步到主機上的「官方」副本 。
讓我們關閉這個系統,這樣我們就可以在這個系統里提供一些我們需要的東西:
vagrant halt
在虛擬機上安裝額外的軟體
對於這個例子,我將使用 Apache、 PostgreSQL 和 Perl 的 Dancer web 框架進行項目開發。我將修改Vagrant 配置腳本,以便我需要的東西已經安裝。 為了使之稍後更容易保持更新,我將在項目根目錄下創建一個腳本~/myproject/Vagrantfile
:
$provision_script = <<SCRIPT
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -y install
apache2
postgresql-client-9.4
postgresql-9.4
libdbd-pg-perl
libapache2-mod-fastcgi
libdata-validate-email-perl
libexception-class-perl
libexception-class-trycatch-perl
libtemplate-perl
libtemplate-plugin-json-escape-perl
libdbix-class-perl
libyaml-tiny-perl
libcrypt-saltedhash-perl
libdancer2-perl
libtemplate-plugin-gravatar-perl
libtext-csv-perl
libstring-tokenizer-perl
cpanminus
cpanm -f -n
Dancer2::Session::Cookie
Dancer2::Plugin::DBIC
Dancer2::Plugin::Auth::Extensible::Provider::DBIC
Dancer2::Plugin::Locale
Dancer2::Plugin::Growler
sudo a2enmod rewrite fastcgi
sudo apache2ctl restart
SCRIPT
在 Vagrantfile 結尾附近,你會發現一行 config.vm.provision
變數,正如你在示例中看到的那樣,你可以在此處以內聯方式進行操作,只需通過取消注釋以下行:
# config.vm.provision "shell", inline: <<-SHELL
# sudo apt-get update
# sudo apt-get install -y apache2
# SHELL
相反,將那四行替換為使用你在文件頂部定義為變數的配置腳本:
config.vm.provision "shell", inline: $provision_script
你可能還希望將轉發的埠設置為從主機訪問虛擬機上的 Apache。尋找包含 forwarded_port
的行並取消注釋它。如果你願意,也可以將埠從 8080 更改為其他內容。我通常使用埠 5000,並在我的瀏覽器瀏覽 http://localhost:5000 就可以訪問我虛擬機上的 Apache 伺服器。
這裡有一個設置提示:如果你的倉庫位於雲存儲上,為了在多台機器上使用 Vagrant,你可能希望將不同機器上的 VAGRANT_HOME
環境變數設置為不同的東西。以 VirtualBox 的工作方式,你需要分別為這些系統存儲狀態信息,確保你的版本控制系統忽略了用於此的目錄 —— 我將 .vagrant.d*
添加到倉庫的 .gitignore
文件中。不過,我確實讓 Vagrantfile 成為倉庫的一部分!
好了!
我輸入 vagrant up
,我準備開始寫代碼了。一旦你做了一兩次,你可能會想到你可以循環利用很多的 Vagrantfile 模板文件(就像我剛剛那樣),這就是 Vagrant 的優勢之一。你可以更快地完成實際的編碼工作,並將很少的時間花在基礎設施上!
你可以使用 Vagrant 做更多事情。配置工具存在於許多工具鏈中,因此,無論你需要複製什麼環境,它都是快速而簡單的。
via: https://opensource.com/article/18/4/getting-started-vagrant
作者:Ruth Holloway 選題:lujun9972 譯者:MjSeven 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive