iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 12

day12_Vagrant基本安裝&說明

  • 分享至 

  • xImage
  •  
  • 前言
    其實這一篇是最早寫的存檔
    寫得並不詳細
    不過在以後的要介紹的ansible專案還會再遇到vagranfile的
    ===
    本篇主要參考:
  • 30 天入門 Ansible 及 Jenkins_2018
    另參考官方文件補充 https://www.vagrantup.com/docs/

vagrant是拿來建vm的,建完後直接可以ssh (超方便)
就算你不想用vagrant,您還是得懂它,因為很多k8s、ansible專案都有用vagrant,
加減了解,才知道哪些設定檔是vagrant、哪些是ansible,
而且vagrant跟ansible很多副檔名都叫yml,熟一點比較不會搞錯

通常會再配合ansible對vm跑一些自動化的腳本(後面再介紹)

備註:這篇只是簡單介紹 vagrant ,並做簡單的牛刀小試

https://app.vagrantup.com/bento/boxes/ubuntu-18.04
http://www.cc.ntu.edu.tw/chinese/epaper/0040/20170320_4006.html

VS Code Extensions

相信大部分的人都有用VS Code,可裝下面2個Extensions,下載數都很高

  • 一、Vagrant
    可以在VS Code下一些Vagrant指令
    vagrant up Vagrant: Up
    vagrant provisionVagrant: Provision
    vagrant suspendVagrant: Suspend
    vagrant haltVagrant: Halt
    vagrant destroy -fVagrant: Destroy
    vagrant reloadVagrant: Reload
    vagrant statusVagrant: Status

  • 二、Vagrantfile Support
    這個必裝,highlight vagrantfile,比較好看

  • 三、YAML Support by Red Hat
    裝了比較好看 YAML 檔,大概有5項功能
    YAML validation
    Document Outlining (Ctrl + Shift + O)
    Auto completion (Ctrl+Space)
    Hover support
    Formatter

安裝VirtualBox for Ubuntu

https://www.virtualbox.org/wiki/Linux_Downloads
下載最新的點2下就能安裝了
virtualbox-5.2_5.2.18-124319~Ubuntu~bionic_amd64.deb

安裝 Vagrant

https://www.vagrantup.com/downloads.html

  • macOS
    下載dmg檔,拉到application就好了
    vagrant_2.1.5_x86_64.dmg

  • Ubuntu
    下載Debian 64-bit,點2下deb檔就能安裝了

先建個工作目錄
$ mkdir ~/myDevEnv
$ cd ~/myDevEnv

用 vagrant 初使化一個 ubuntu-18.04 的虛擬機
參考:https://app.vagrantup.com/bento/boxes/ubuntu-18.04

$ vagrant init bento/ubuntu-18.04 #使用官方打包後的作業系統,會初使化一個Vagrant file
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
  • 此時已產生 ~/myDevEnv/Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
# 1代表1.0.x的設定,2代表1.1+ ~ 2.0.x 的設定
# 所以你如果看到 Vagrant.configure("1"),代表那個專案可能超老舊的囉
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
end
  • 接著就會用curl到vagrantcloud-files-production.s3.amazonaws.com下載ubuntu-18.04這個box,要等10分鐘左右

在~/myDevEnv/會多出 資料夾 .vagrant

$ ll ./.vagrant/machines/default/virtualbox/
40B action_provision
10B action_set_name
3B creator_uid
36B id
32B index_uuid
1.6K private_key # RSA的private key,我猜是ssh的private key吧
122B synced_folders #json格式的設定檔
{
    "virtualbox":
    {
        "/vagrant":
        {
            "guestpath":"/vagrant",
            "hostpath":"/Users/xx/myDevEnv",
            "disabled":false,
            "__vagrantfile":true
        }
    }
}
  • VM也會被建起來
~/VirtualBox VMs/myDevEnv_default_1536610941331_60767/ubuntu-18.04-amd64-disk001.vmdk 2GB
action_set_name 153661
  • 啟動 虛擬機
$ vagrant up 
  • 透過 vagrant 用 ssh 登入 虛擬機
    用vagrant建立的vm,會自動做ssh設定
$ vagrant ssh # 直接連到 default 的 vm
vagrant@vagrant:~$

$ vagrant ssh-config
#  虛擬主機 masterNode01 的 private key 的存放位置
IdentityFile /Users/xx/myDevEnv/.vagrant/machines/masterNode01/virtualbox/private_key

在更多的情境下,我們可能不會用到vagrant
如果我們不是用vagrant來建vm,就必須懂 「ssh設定」 & 「ssh for ansible設定」

其他常用指令

$ vagrant version # 版本,我用的版本是
$ vagrant box list # 列出所有 vagrant boxes (類似 docker images)
$ vagrant box remove bento/ubuntu-18.04 # 刪除 box
$ vagrant status # 目前運行狀況
$ vagrant up # 啟動 虛擬機
$ vagrant provision # 啟動 已存在的 虛擬機
$ vagrant halt # 暫停 虛擬機
$ vagrant destroy # 砍掉 虛擬機

vagrantfile

我們的目的是用 vagrant 建一堆 ubuntu vm ,這些 ubuntu vm 再用 kubeadm 建 k8s cluster
所以我們先建 Master Node,後續再用ansible自動化設定

config.vm.define "masterNode01" # 很重要,跟ansible的inventory(主機清單)名稱要一樣

inventory file

也是YAML格式,電腦清單,除了可設連線的帳號、ssh port,還可以給一堆環境變數

$ vim ~/myDevEnv/inventory
[masterNode01]
127.0.0.1 ansible_port=2222 ansible_user=vagrant # 預設建完 2222

大量指定 變數

[masterNode]
# 這樣就是masterNode01~masterNode10
masterNode[01:10].local ansible_port=22 ansible_user=vagrant

ansible_host
ansible_port # 如果ssh不是走22,就要給
ansible_user # ssh user account

其他參數

ansible_ssh_pass # 敏感變數or資訊,參考 variables and vaults  https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#best-practices-for-variables-and-vaults

ansible.cfg

透過 ansible.cfg 這個檔案的設定來告訴 Ansible SSH 金鑰以及 inventory file 的位置

目前我們的~/myDevEnv目錄底下的檔案
ansible.cfg
hosts
inventory
Vagrantfile

VirtualBox多了一個vm
myDevEnv_masterNode01_1536618176680_13231

$ vagrant up # 我們再來建一次vm

###再來看某個專案的 Vagrantfile
最後,再來補充說明一下vagrantfile,採用ruby語言

參考官網的說明文件:
https://www.vagrantup.com/docs/vagrantfile/machine_settings.html

ENV["LC_ALL"] = "en_US.UTF-8" # host的local環境變數 在進行 ssh連線時傳給 guest

config.ssh.insert_key = false # 取消 insecure keypair(一組key pair連所有vm)
config.ssh.insert_key = true # Vagrant將自動插入keypair,此private key是沒保護的,所以很危險?
  
config.vm.provision "shell", inline: "echo Hello"
config.ssh.username = "vagrant" # 預設是vagrant
#config.ssh.password = "" # ssh的密碼,如果您使用password,如果insert_key=ture,Vagrant將自動插入keypair
config.ssh.host # hostname or ip,預設是empty
config.ssh.port # 預設是 22,如果你的ssh不是用22,就要給
config.ssh.guest_port
config.ssh.private_key_path # 預設是指向vagrant建立的 insecure private key
config.ssh.keys_only = ture # 只用vagrant產生的private keys,不使用其他ssh-agent
config.ssh.keep_alive = ture # 每5秒發1個keep-alive,避免ssh斷線
# 定義多台vm,應該可以寫到inventory
config.vm.define "masterNode-1" do |masterNode01|
  masterNode01.vm.box = "bento/ubuntu-18.04"
  masterNode01.vm.network "private_network", ip: "192.168.50.4",
    virtualbox__intnet: true # only for the VirtualBox provider
  masterNode01.vm.provision "shell",inline:"echo hello from masterNode01"
end

config.vm.define "masterNode-2", autostart: false # 在 vagrant up 時,不要建此 vm
  masterNode02.vm.box = "bento/ubuntu-18.04"
  masterNode02.vm.network "private_network", ip: "192.168.50.4",
    virtualbox__intnet: "mynetwork" # 加到一個 internal network
end

#用迴圈跑
N = 2
(1..N).each do |i|
  config.vm.define "masterNode-#{i}" do |node|
    node.vm.provision "shell",
      inline: "echo hello from node #{i}"
  end
end

# host 的 8080 forwarded port mapping 到 VM 的 80
# config.vm.network "forwarded_port", guest: 80, host: 8080
# 只能用 host 的 127.0.0.1 連
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# 設定 vm 的 private ip
# config.vm.network "private_network", ip: "192.168.33.10"
# Bridged 到實體網卡
# config.vm.network "public_network"
  
# 參考:https://www.vagrantup.com/docs/provisioning/ansible_intro.html
# Run Ansible from the Vagrant Host
# 用Vagrant建立vm,設定交給ansible,playbook.yml是ansible的腳本
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end
# 跑2台vm的ansible-playbook playbook.yml
N = 2
(1..N).each do |machine_id|
  config.vm.define "machine#{machine_id}" do |machine|
    machine.vm.hostname = "masterNode0#{machine_id}"
    machine.vm.network "private_network", ip: "192.168.77.#{20+machine_id}"

    # Only execute once the Ansible provisioner,
    # when all the machines are up and ready.
    if machine_id == N
      machine.vm.provision :ansible do |ansible|
        # Disable default limit to connect to all the machines
        ansible.limit = "all"
        ansible.playbook = "playbook.yml"
      end
    end
  end
end

===
###結語
當我們下完建vm的指令,
vagrant什麼都沒問就是建virtualbox的vm,
而且連名字都取好了(像我的是叫 myDevEnv_default_1536610941331_60767)
$ vagrant init bento/ubuntu-18.04
1.在macos,如果我想建VMWare Fusion的VM呢?
2.在ubuntu,如果我想建VMWare Workstation的VM呢?
這個要花79USD買plugin才能試

Vagrant除了在今天workplace工作目錄(~/myDevEnv) 跟 ~/VirtualBox VMs 產生檔案
似乎還會產生一些VirtualBox的檔案(例如:Virtual NIC)

所以保險一點是在VM裡面玩vagrant


上一篇
day11_docker09_AngularTaiwan讀書會[S03E08]CI Pipeline for Angular
下一篇
day13_Ansible01_安裝及介紹
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言