最近服務器老是宕機,學習的時候很多環境有需要集群,忍無可忍的情況下終于決定自己裝一波虛擬機宮學習使用。本人系統為Deepin,這里記錄一下Deepin安裝Vagrant的過程及步驟.
Reference One: https://mritd.me/2017/03/01/how-to-use-vagrant/
Reference Two: https://tutorialforlinux.com/2017/10/11/how-to-install-vagrant-deepin-linux-easy-guide/
Vagrant 是一個開源的 基于 ruby 的開源虛擬機管理工具;
它能夠以腳本化的方式啟動、停止、和和刪除虛擬機,當然這些手動也沒費勁;更重要的是它能夠自己定義網絡分配、初始化執行的腳本、添加硬盤等各種復雜的動作;最重要的是 Vagrant 提供了類似于 docker image 的 box;Vagrant Box 就是一個完整的虛擬機分發包,可以自己制作也可以從網絡下載;并且 Vagrant 開源特性使得各路大神開發了很多 Vagrant 插件方便我們使用,基于以上這些特點,我們可以實現:
- 一個腳本定義好虛擬機的數量
- 一個腳本定義好虛擬機初始化工作,比如裝 docker
- 一個腳本完成多臺虛擬機網絡配置
- 一條命令啟動、停止、刪除多個虛擬機
二、Vagrant 使用
2.1、Vagrant 安裝
Vagrant 安裝極其簡單,目前官方已經打包好了各個平臺的安裝包文件,地址訪問 Vagrant 官方下載地址;
這里以Deepin為例:
1.打開終端Ctr+Alt+t
2.Download Latest Vagrant for Debian Linux下載最新版本Vagrant
Here Get Latest Vagrant .deb 32/64bit
3.檢查是否含有GDebi Package.
which gdebi
如果沒有這個軟件可以使用sudo apt install gdebi
安裝
4.打開下載目錄
cd ~/Downloads
ls
5.執行安裝
sudo gdebi ./vagrant*.deb
6.最后測試安裝是否成功
vagrant -h
But in case of Vagrant Help Ruby Gems Issue Fix with:
sudo
vagrant plugin ``install
vagrant-share \``--plugin-version 1.1.8
7.至于Oracle VirtualBox安裝,可以點擊這里
8.至于Vagrant怎么使用和管理,可以點擊這里.
2.2、Vagrant Box 下載
裝虛擬機大家都不陌生,首先應該搞個系統鏡像;同樣 Vagrant 也需要先搞一個 Vagrant Box,Vagrant Box 是一個已經預裝好操作系統的虛擬機打包文件;根據不同系統可以選擇不同的 Vagrant Box,官方維護了一個 Vagrant Box 倉庫,地址 點這里

點擊對應的系統后可以看到如下界面

該頁面羅列出了使用不同虛擬機時應當使用扥添加明令;當然執行這些命令后 vagrant 將會從網絡下載這個 box 文件并添加到本地 box 倉庫;不過眾所周知的原因,這個下載速度會讓你懷疑人生,所有簡單的辦法是執行以下這條命令,然后會顯示 box 的實際下載地址;拿到地址以后用迅雷下載先把文件下載下來,然后使用 vagrant 導入也可以(centos7 本地已經有了一下以 ubuntu 為例)

下載后使用
vagrant box add xxxx.box
即可將 box 導入到本地倉庫
2.3、啟動一個虛擬機
萬事俱備只差東風,在上一步執行 vagrant init ubuntu/trusty64; vagrant up --provider virtualbox
命令獲取 box 下載地址時,已經在當前目錄下生成了一個 Vagrantfile 文件,這個文件其實就是虛擬機配置文件,具體下面再說;box 導入以后先啟動一下再說,執行 vagrnat up
即可
其他幾個常用命令如下
-
vagrant box [list|add|remove]
查看添加刪除 box 等 -
vagrant up
啟動虛擬機 -
vagrant halt
關閉虛擬機 -
vagrant init
初始化一個指定系統的 Vagrantfile 文件 -
vagrant destroy
刪除虛擬機 -
vagrant ssh
ssh 到虛擬機里
特別說明一下 ssh 這個命令,一般默認的規范是vagrant ssh VM_NAME
后,會以 vagrant 用戶身份登錄到目標虛擬機,如果當前目錄的 Vagrantfile 中只有一個虛擬機那么無需指定虛擬機名稱(init 后默認就是);虛擬機內(box 封裝時)vagrant這個用戶擁有全局免密碼 sudo 權限;root 用戶一般密碼為 vagrant
三、Vagrantfile
直接貼 Vagrantfile,以下配置在進行 vagrant up
之前可能需要使用 vagrant plugin install vagrant-host
插件,以支持自動在各節點之間添加 host
Vagrant.configure("2") do |config|
# 定義虛擬機數量
vms = Array(1..5)
# 數據盤存放目錄
$data_base_dir = "/data/vm/disk"
vms.each do |i|
config.vm.define "docker#{i}" do |docker|
# 設置虛擬機的Box
docker.vm.box = "centos/7"
# 不檢查 box 更新
docker.vm.box_check_update = false
# 設置虛擬機的主機名
docker.vm.hostname="docker#{i}.node"
# 設置虛擬機的IP (wlp2s0 為橋接本機的網卡)
docker.vm.network "public_network", ip: "192.168.1.1#{i}", bridge: "wlp2s0"
# 設置主機與虛擬機的共享目錄
#docker.vm.synced_folder "~/Desktop/share", "/home/vagrant/share"
# VirtaulBox相關配置
docker.vm.provider "virtualbox" do |v|
# 設置虛擬機的名稱
v.name = "docker#{i}"
# 設置虛擬機的內存大小
v.memory = 1536
# 設置虛擬機的CPU個數
v.cpus = 1
# 增加磁盤
docker_disk = "#$data_base_dir/docker-disk#{i}.vdi"
data_disk = "#$data_base_dir/data-disk#{i}.vdi"
# 判斷虛擬機啟動后
if ARGV[0] == "up"
# 如果兩個文件都不存在 則創建 SATA 控制器(這里調用的是 Virtual Box 的命令)
if ! File.exist?(docker_disk) && ! File.exist?(data_disk)
v.customize [
'storagectl', :id,
'--name', 'SATA Controller',
'--add', 'sata',
'--portcount', '5',
'--controller', 'IntelAhci',
'--bootable', 'on'
]
end
# 創建磁盤文件
if ! File.exist?(docker_disk)
v.customize [
'createhd',
'--filename', docker_disk,
'--format', 'VDI',
'--size', 10 * 1024 # 10 GB
]
end
if ! File.exist?(data_disk)
v.customize [
'createhd',
'--filename', data_disk,
'--format', 'VDI',
'--size', 10 * 1024 # 10 GB
]
end
# 連接到 SATA 控制器
v.customize [
'storageattach', :id,
'--storagectl', 'SATA Controller',
'--port', 1, '--device', 0,
'--type', 'hdd', '--medium',
docker_disk
]
v.customize [
'storageattach', :id,
'--storagectl', 'SATA Controller',
'--port', 2, '--device', 0,
'--type', 'hdd', '--medium',
data_disk
]
end
end
# 增加各節點 host 配置
config.vm.provision :hosts do |provisioner|
vms.each do |x|
provisioner.add_host "192.168.1.1#{x}", ["docker#{x}.node"]
end
end
# 自定義執行腳本
docker.vm.provision "shell", path: "init.sh"
# 每次開機后重啟 network 和 ssh,解決公網網卡不啟動問題
docker.vm.provision "shell", run: "always", inline: <<-SHELL
systemctl restart network
systemctl restart sshd
echo -e "\033[32mvirtual machine docker#{i} init success!\033[0m"
SHELL
end
end
end
以上基本都加了注釋,所以大致應該很清晰,至于第一行那個 `Vagrant.configure("2")` 代表調用第二版 API,不能改動,其他的可參考注釋同時綜合倉庫中的其他配置文件即可
**Vagrantfile 實質上就是一個 ruby 文件,可以自己在里面定義變量等,可以在里面按照 ruby 的語法進行各種復雜的操作;具體 ruby 語法可以參考相關文檔學習一下**