iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
1
自我挑戰組

DevOps學習之旅系列 第 26

Day 26 Vagrant 構建及配置虛擬環境

  • 分享至 

  • xImage
  •  

Vagrant

Vagrant是一款用於構建及配置虛擬開發環境的軟體,基於Ruby,主要以命令行的方式運行。
主要使用Oracle的開源VirtualBox虛擬化系統,與Chef,Salt,Puppet等環境配置管理軟體搭配使用, 可以實行快速虛擬開發環境的構建。

  • 用於構建及配置虛擬開發環境
  • 配置檔案 Vagrant File
  • Boxs 庫
  • 執行在Virtualbox

Mac 安裝

# 安裝 virtualbox
brew cask install virtualbox
# 安裝 vagrant
brew cask install vagrant
# 安裝 vagrant-manager
brew cask install vagrant-manager

Windows 安裝

[32-bit][64-bit]
VirtualBox Extension Park

Box name

螢幕快照 2018-10-27 下午10.19.44.png

啟動 Centos 7

# 創建資料夾
mkdir vagrant_centos_7
# 切換目錄
cd vagrant_centos_7
# 初始化 Vargant 並指定作業系統為 centos7,會建立一個 Vagrantfile 
vagrant init centos/7

螢幕快照 2018-10-27 下午10.12.49.png

啟動 vagrant

vagrant up

螢幕快照 2018-10-27 下午10.16.22.png

螢幕快照 2018-10-27 下午10.20.56.png

螢幕快照 2018-10-27 下午10.36.47.png

登入到虛擬機

vagrant ssh

螢幕快照 2018-10-27 下午10.22.29.png

Vagrant 指令說明

# 創建vagrant file
vagrant init 
# 啟動虛擬機
vagrant up
# 登入虛擬機
vagrant ssh
# 關閉虛擬機
vagrant  halt
# 刪除虛擬機
vagrant destroy
# 查看虛擬機狀態
vagrant status

369921D2-0D6F-438A-AE7B-25E24C24AB36.png

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.1"
end

設定網路使用bridge

config.vm.network "public_network"

Vagrant SSH 功能

  1. 正統登入法:用 vagrant 帳號 + vagrant 密碼來登入,並關閉 host key checking。
  2. 正統登入法:用 vagrant 帳號 + private key 來登入,並關閉 host key checking。
  3. 簡便登入法:用 vagrant ssh 指令登入。
    ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null vagrant@127.0.0.1 -p 2222
    password:vagrant

Vagrant 初使化 Provision 安裝 nginx and postgresql 9.4

Provision 時機:

  • 第一次 vagrant up
  • 執行 vagrant provision
  • 執行 vagrant reload --provision
config.vm.provision "shell", inline: <<-SHELL
     sudo yum update
     sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
     sudo yum -y install nginx18
     sudo yum -y install http://yum.postgresql.org/9.5/redhat/rhel-6-x86_64/pgdg-centos95-9.5-2.noarch.rpm
     sudo yum -y install postgresql95-server postgresql95-contrib postgresql95-devel
     sudo service postgresql-9.5 initdb
  SHELL
SCRIPTS = ["install-base.sh","project.sh"]
for scripts in SCRIPTS
  config.vm.provision "shell", path: scripts
end

Networking 網路

透過 port mapping/forwarding 機制

config.vm.network "forwarded_port", guest: 80, host: 8080

透過 private network 機制

config.vm.network "private_network", ip: “192.168.33.10"

檔案系統:搞定存取權限

複製檔案

config.vm.provision "file", source: "project.sh", destination: "/home/project/"

同步資料夾

config.vm.synced_folder "./app", "/var/www/html/app"

同步資料夾,並設定擁有者權限

config.vm.synced_folder "./app", "/var/www/html/app",
      owner: "www-data"

GUI 視窗系統

boxcutter/ubuntu1404-desktop

管理Virtualbox

VBoxManage list vms
VBoxManage unregister xxxx --delete

###實作

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  # 指定系統OS
  config.vm.box = "centos/7"
  # 設定快取yum
  config.cache.enable :yum
  # 設定VirtualBox網路,使用Bridge橋接網路
  config.vm.network "public_network"
  # 使用系統權限執行下面指令
  config.vm.provision "shell", inline: <<-SHELL
    # 安裝必要Library和軟體
    yum -y update
    yum -y install epel-release htop vim iptraf-ng.x86_64 net-tools gcc gcc-c++ make git patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel zip unzip
    yum -y install libjpeg zlib libtiff libfreetype littlecms libwebp tcl tk openjpeg libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel python-devel
    yum -y install curl-devel expat-devel gettext-devel perl-ExtUtils-MakeMaker wget postgresql-libs postgresql-devel libffi-devel open-vm-tools
    
    # 設定時區服務ntp
    yum -y install ntp
    timedatectl set-timezone Asia/Taipei
    rm /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime
    systemctl enable ntpd
    systemctl start ntpd

  SHELL

  # 系統基本建置
  SCRIPTS = ["base.sh"]
  for scripts in SCRIPTS
    config.vm.provision "shell", path: scripts
  end

  # 複製檔案到VM內部,、Source Code、Project設定檔
  config.vm.provision "file", source: "./", destination: "~/"

  # 複製過去後的處理過程
  config.vm.provision "shell", inline: <<-SHELL
    mkdir /home/project/.ssh
    cp /home/vagrant/id_rsa /home/project/.ssh/id_rsa
    ssh-keyscan -T 60 bitbucket.org > /home/project/.ssh/known_hosts
    chmod 600 /home/project/.ssh/id_rsa
    chmod 700 /home/project/.ssh
    chown -R project.project /home/project/.ssh
    chown -R project.project /home/project/.ssh/*

    # nginx
    cp /home/vagrant/nginx/nginx.conf /etc/nginx/nginx.conf
    cp -r /home/vagrant/nginx/conf.d/* /etc/nginx/conf.d/
    cp -r /home/vagrant/nginx/ssl /etc/nginx/ssl

    # systemd
    cp -r /home/vagrant/systemd/* /etc/systemd/system/

    # 使用者
    cp /home/vagrant/project.sh /home/project/project.sh
    
    # 複製 token 專案
    unzip /home/vagrant/source_code/ithome_pellok_2018.zip -d /home/project/
    mv /home/project/ithome_pellok_2018 /home/project/ithome_pellok_2018

    chown -R project.project /home/project/
    su - project -c "sh project.sh"
    chmod +x /home/project

    # 重新載入systemctl 設定檔
    systemctl daemon-reload

    # 依順序來啟動服務
    systemctl start ithome_pellok_2018;sleep 5s
    
    # 設定開機自動啟動服務
    systemctl enable ithome_pellok_2018

    # 開機後自動重新啟動服務,依據服務順序
    echo "systemctl restart ithome_pellok_2018;sleep 5s" >> /etc/rc.d/rc.local

  SHELL

end

結論

使用 Vagrant File 可以讓系統環境轉換成程式碼,並且加入版控,達到 Service As Code 的概念,有時候因應專案需求,需要把我們的軟體部署在 VMware 上面的時候,會使用 Vagrant File 把專案搭包成 OVA 檔案,客戶只要在 VMware 上面匯入 OVA 在設定一下網路就可以直些使用,還蠻方便的.

參考

Vagrant


上一篇
Day 25 GitLab 自動化測試與部署(二)
下一篇
Day 27 Ansible IT自動化工具(一)
系列文
DevOps學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言