Ansible 實戰講堂

前言

在去年的 Modern Web Conf 2015 中聽到 葉大安裝 Nginx 的 101 種方法/Ansible 簡介 覺得超酷的,後來也成功的說服主管應用在工作上。

雖然用了一陣子,但是還是不確定自己用的方法是不是好的、或是有沒有改善的空間,

因此看到葉大新開的 Ansible 實戰講堂 就報名了。

觀察

參加一些課程或是演講都會觀察,

這位講師如何準備自己的演講的,

希望可以從他們身上學到的不只有課堂上的東西。

這堂課程可以看到講師非常在意投影效果、投影品質、現場燈光等因素,

會仔細的跑到每個角落看是否清楚,或是詢問學員。

還貼心的詢問空調會不會太冷/熱。

只是一開始的 AirPlay 不順,還有後來播影片時音訊有問題,是可以改進的地方。

然後這個場子,也是我少數參加的場子使用 Windows 比 osx 還多的。

在課程開前之前,也透過 Quip 和我們密切溝通,

讓我們可以先提出問題,他可以先做單簡的回答 (覺得這點超讚!)

課程

一開始以 料理好吃還不夠,這樣開店才會賺 為例,提醒我們需要先了解需要解決的問題是什麼。

再去看問題本身,並且透過 Lean Change Canvas 抓住問題的脈絡。

(淚推…最近工作超需要)

內容是的主軸由 Brian Brazil 一文中 Do you have basic infrastructure? 所提出來的軟體架構總要面對的三大原則:

  • How to recreate your system
  • How to safely change your system
  • When something has gone wrong

Ansible 其實上面三件事都可以幫忙做到,但是本次的課程是較偏重於第一點及第二點。

問於 When something has gone wrong 相關的問題,講師也在我的課前問題中回答:

簡單一點的,用既有的 monit、logrotate 等工具組合一下即可。 複雜一點的,可能就要搭配較強的監控及警報系統,由警報系統去驅動 Ansible 或其他 script 做一些緊急處理。

收獲

雖然用 Vagrant、Ansible 一段時間了,

最近也開始在學習 Docker 但是透過講師介紹這些工具使用,還是有補足過去我知識的小漏洞。

並且可以透過每一個 lab 的挑戰題,更加深入的了解 Ansible 的使用。

包括 Refactor/Deployment 等,是我在上課前就想了解的議題。

便當

中午便當,紅酒漢堡肉:

19704.jpg

還滿好吃的 (很在意這個...

只是 iThome 上次辦的 DevOps 2015 便當真的不好吃阿…

Refs.

  1. DevOps 是圓的,找到立足點就是頂點
  2. Do you have basic infrastructure?

SKillTree-TDD-Review

為什麼想上這堂課?

對測試一直很有興趣,只是自己也不知道從何開始,看了很多文件還有網路上的文章,也一直似懂非懂。

剛好看到幾個朋友非常推薦 Joey Chen 的課程,但是一看到課程是透過 C# 當範例的時候卻有點猶豫了,因為我連一行 C# 的 code 都沒寫過…

後來真的去上了之後,才發現自己的擔心是多餘的,因為上課的例子 非常、非常、非常 淺顯易懂,只要會寫 code 都看到懂。這就是講師厲害的地方,可以用最簡單的例子,講出非常核心的觀念,讓你如醍醐灌頂般的吸收。

核心

老闆請你來是寫 production code 不是寫測試的。

但是測試可以讓我們寫出品質更好的 production code。

課程教的是 開發、開發、開發 而不是測試。

但寫測試的同時也可以看到到自己 production code 的可維護性和彈性。

地表最強 IDE: Visual Studio

不得不講一下,地表最強 IDE: Visual Studio

由於上課的內容都是 C# ,所以課程的內容都是透過 Visual Studio 示範,

自己一直都是 VIM 的狂熱開發者,總覺用它真的超方便阿,為什麼大家不用 XD

寫 code 手都不用離開鍵盤欸!! 也沒有什麼環境的問題,連到遠端的伺服器也是 vim . 打開來就開始寫。只要裝一些 plugin 後,根本超方便阿~~

但是看到 Visual Studio 的重構功能、測試功能,真的覺得它好強大阿~~~~

可惡,也想找個 IDE 來試試了~~~

省思

其實上這堂課,我是邊上邊流冷汗的。

怎麼說呢,應該是看到講師還有一些上課的學員,都覺得好厲害,我特別記得講師在第一天講的一句話:

「程式寫出來會跑是正常的。但是修改一個需求你要一個月人家只要一天,這就是功力的差別」。

雖然在學生時期待過的團隊曾經開發/維運過許多系統,但是回想起來,自己寫的程式根本沒有可測試性/可維護性/可擴充性,有種一下子被打入地獄的感覺。

也同時看到,那麼厲害的每個人,都還是非常熱血且努力的不斷增進自己。

就連那麼厲害的高手都不斷的在努力,自己根本就沒有偷懶的餘地阿!

花一輩子想把 code 寫好,不如早點學好測試用一輩子!

台灣可貴的地方

ywZHEDzTnq8vcWY2hgmH_8eafe0d9ab46cc4daf2612362df39073b2e29d.jpg

我記得小時候, 我阿祖她有一個非常要好的朋友,我都叫她同年祖, 同年祖很常來家裡找我阿祖聊天, 她們是從小玩到大的好朋友,有 70 幾年的友誼囉。

但是有天突然發現同年祖已經好久好久沒來我家聊天了, 後來我聽到大人在說,是因為村裡要選村長, 但是同年祖跟阿祖支持的人不一樣,後來鬧翻了。

一直到我阿祖過世前,她們都沒有在好好坐下來像聊聊天了, 我覺得好可惜,70 幾年的交情了,就因為政治搞壞了。

我想說的是,最近服貿打得火熱, 每個人都會有自己的看法, 我們可以提出自己的想法, 但是也要注意自己的語氣還有風度, 再表達自己意見的同時,我們也要傾聽別人的想法, 別因為一時看法不同,打壞了原本非常要好的友誼。

「我不贊成你的意見 但是我誓死捍衛你說話的權利」- 伏爾泰

可以表達我們各自的看法, 想說我們想說的話, 不就是我們身為一個民主法治國家可貴的地方嗎。

Configure Open vSwitch on Proxmox Virtual Environment

因為研究的關係,會需要在 Proxmox Virtual Environment(PVE) 上安裝 Open vSwitch(OVS) 由於 PVE 把 Linux 原生的 bridge 內鍵在 kernel 中了, 所以無法用 OVS 來取代 Linux 的 bridge 造成 PVE 中的 Kernel Virtual Machine(KVM) 無法使用 OVS。 因此,要此重心 make PVE 的 kernel 後,把 bridge 的設為模組(module), 好讓我們在安裝 OVS 的時候,可以取代它。

環境

  • Proxmox VE 2.3
  • Open vSwitch 1.4.0

1.安裝必要的套件

[root@www ~]# apt-get install -y python-simplejson python-qt4 python-twisted-conch autoconf gcc uml-utilities libtool pkg-config automake build-essential openssl libssl-dev bridge-utils rpm2cpio lintian libncurses5-dev unzip 

2.利用 git clone PVE 的 Kernel

抓回來後放置在 /usr/src 資料夾內,這邊我們抓的是 pve-kernel-2.6.32 的版本。

[root@www ~]# git clone git://git.proxmox.com/git/pve-kernel-2.6.32.git pve-kernel
[root@www ~]# mv pve-kernel /usr/src

3.取得 PVE 的 source code

在剛剛的 pve-kernel 資料夾內下 make 它就會自動把 source code 抓回來囉 抓回來的 source code 會放置在 /usr/src/pve-kernel/linux-2.6-2.6.32

[root@www ~]# cd /usr/src/pve-kernel
[root@www pve-kernel]# make

4.清除暫存檔

先切換進去 linux-2.6-2.6.32 資料夾內,先清除暫存檔後,就可以開始 make kernel 了

# 把 source code 中的目標檔刪除

[root@www linux2.6.2-6.32]# make mrproper

# 清除暫存檔

[root@www linux2.6.2-6.32]# make clean
[root@www linux2.6.2-6.32]# make menuconfig

5.Linux Kernel Configuration

然後就會開始出現藍底白字畫面了,如下:

pve1.png

先在 General setup ->> Local version – append to kernel release 設定你這次編譯的名稱

pve2.png

Networking support -> Networking options -> 把 802.1d Ethernet Bridging * 改為 M

pve3.png

pve4.png

pve5.png

最後,按下 Save an Alternate Configuration File 保留 config 檔,並離開 Linux Kernel Configuration

pve6.png

6.Make Kernel

#先編譯核心
[root@www linux-2.6-2.6.32]# make bzImage

#再編譯模組
[root@www linux-2.6-2.6.32]# make modules

#實際安裝模組
[root@www linux-2.6-2.6.32]# make modules_install

7.設定 GRUB 多重核心選單

由於害怕剛剛編譯完的核心不能正常的開機,所以通常都是手動來設定成多重開機的選單, 好讓我們如果發生錯誤的設定,可以直接再次開機來進入 Linux 系統。

可以先看一下 /lib/modules/ 資料夾下確定我們載的是哪個 kernel 的版本

[root@www /boot]# ll /lib/modules/
2.6.32-26-pve/     2.6.32-19-pvebridge/

可以確定的 2.6.32-19-pvebridge 就是我們剛剛 make 好的 kernel modules 設複製剛剛 make 好的 bzImage 如 config 檔到 /boot 資料夾下

[root@www /boot]# cp /usr/src/pve-kernel/linux-2.6-2.6.32/arch/x86_64/boot/bzImage  /boot/vmlinuz-2.6.32-19-pvebridge
[root@www /boot]# cp /usr/src/pve-kernel/linux-2.6-2.6.32/.config /boot/config-2.6.32-19-pvebridge

8.建立相對應的 Initial Ram Disk(initrd)

[root@www /boot]# mkinitramfs -o /boot/initrd.img-2.6.32-19-pvebridge 2.6.32-19-pvebridge

9.編輯 GRUG 開機多重選單

在 GRUB 選單內加入我們這個版本的 Kernel, 可以參考一下列的寫法。

in /boot/grub/grub.cfg 

menuentry 'Proxmox Virtual Environment GNU/Linux, with Linux 2.6.32-19-pvebridge' --class proxmox --class gnu-linux --class gnu --class os {
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set 9cc709ff-7275-461e-8e91-505d0b1c158f
    echo 'Loading Linux 2.6.32-19-pvebridge ...'
    linux /vmlinuz-2.6.32-19-pvebridge root=/dev/mapper/pve-root ro quiet
    echo 'Loading initial ramdisk ...'
    initrd /initrd.img-2.6.32-19-pvebridge
}

10.最後

再來你就可以重開機了, 重啟之後利 uname -r 查看你的 Kernel 版本是不是你剛剛編的

Open vSwitch 的部份,請參考 Install and Configuring Open vSwitch on Ubuntu 12.04

Install and Configuring Open vSwitch on Ubuntu 12.04

1. 更新 apt-get 套件,並且安裝 Open vSwitch 需求的套件

[root@ubuntu ~] # apt-get update
[root@ubuntu ~] # apt-get install -y git python-simplejson python-qt4 python-twisted-conch autoconf gcc uml-utilities libtool pkg-config automake build-essential openssl libssl-dev bridge-utils

2. 先把 network-manager 關閉

請先確保你是在本地端登錄,然後把 network-manager 關閉, 不然在之後的節驟可能會出現錯誤

[root@ubuntu ~]# /etc/init.d/network-manager stop

3. 下載 OVS tarball

[root@ubuntu ~] # wget http://openvswitch.org/releases/openvswitch-1.4.0.tar.gz
[root@ubuntu ~] # tar zxvf openvswitch-1.4.0.tar.gz
[root@ubuntu ~] # mv openvswitch-1.4.0 openvsiwtch
[root@ubuntu ~] # cd openvsiwtch

4. 註解重覆的程式碼

因為這個版本的某些 code 跟原生的 linux code 有衝突到 所以在這邊,請接以下這些標頭檔的 function 注解掉

  • 修改 datapath/linux/compat/include/linux/skbuff.h 的函式 skbfragpage 跟 skbresetmac_len
  • 修改 datapath/linux/compat/include/linux/if.h 的變數 IFFOVSDATAPATH
  • 修改 datapath/linux/compat/include/linux/ifvlan.h 的函式 vlansetencapproto

5. 編譯 Open vSwitch

[root@ubuntu openvswitch] # ./boot.sh
[root@ubuntu openvsiwtch] # ./configure --with-linux=/lib/modules/`uname -r`/build
[root@ubuntu openvsiwtch] # make && make install

6. 載入 OVS module

# bridge 不先關的話可能會造成 ovs insmod failed
[root@ubuntu openvsiwtch] # lsmod | grep bridge
[root@ubuntu openvsiwtch] # rmmod bridge

#load kernel module
[root@ubuntu openvsiwtch] # insmod datapath/linux/openvswitch.ko
[root@ubuntu openvsiwtch] # insmod datapath/linux/brcompat_mod.ko  #可以讓 ovs 取代 linux bridge 的模組

7. 設定相關參數

[root@ubuntu openvsiwtch] # mkdir -p /usr/local/etc/openvswitch

[root@ubuntu openvsiwtch] # ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

[root@ubuntu openvsiwtch] # ovs-vsctl --no-wait init

[root@ubuntu openvsiwtch] # ovsdb-server /usr/local/etc/openvswitch/conf.db \
--remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,manager_options \
--private-key=db:SSL,private_key \
--certificate=db:SSL,certificate \
--bootstrap-ca-cert=db:SSL,ca_cert --pidfile --detach

[root@ubuntu openvsiwtch] # ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock --detach

[root@ubuntu openvsiwtch] # ovs-brcompatd --pidfile --detach

8. 利用 ovs-vsctl 查看是否安裝成功

[root@ubuntu ~] # ovs-vsctl show
85bbe26c-f2fe-49f6-aa74-e34b026a197f

9. 開機時,自動載入相關設定

可以先將下列寫成一支 shell,然後在 /etc/rc.local 載入 這樣一來,每次重開機時,就都會載入相同的設定

#!/bin/bash


PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#移除原有模組並新增open vSwitch

rmmod bridge
insmod /root/openvswitch/datapath/linux/openvswitch_mod.ko
insmod /root/openvswitch/datapath/linux/brcompat_mod.ko

#啟動

ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \

   --remote=db:Open_vSwitch,manager_options \

   --private-key=db:SSL,private_key \

   --certificate=db:SSL,certificate \

   --bootstrap-ca-cert=db:SSL,ca_cert \

   --detach

#檢查是否開過

SERVICE='ovs-vswitchd'

if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
    echo "$SERVICE service running"
else
    ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock --detach
fi

ovs-brcompatd --pidfile --detach
exit 0
Top