Ansible and DevOps
|
Jan 10, 2016
前言
在去年的 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 等,是我在上課前就想了解的議題。
便當
中午便當,紅酒漢堡肉:
還滿好吃的 (很在意這個...
只是 iThome 上次辦的 DevOps 2015 便當真的不好吃阿…
Refs.
- DevOps 是圓的,找到立足點就是頂點
- Do you have basic infrastructure?
TDD, BDD, and Testing
|
Nov 3, 2015
為什麼想上這堂課?
對測試一直很有興趣,只是自己也不知道從何開始,看了很多文件還有網路上的文章,也一直似懂非懂。
剛好看到幾個朋友非常推薦 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 寫好,不如早點學好測試用一輩子!
Mood
|
Mar 21, 2014
我記得小時候,
我阿祖她有一個非常要好的朋友,我都叫她同年祖,
同年祖很常來家裡找我阿祖聊天,
她們是從小玩到大的好朋友,有 70 幾年的友誼囉。
但是有天突然發現同年祖已經好久好久沒來我家聊天了,
後來我聽到大人在說,是因為村裡要選村長,
但是同年祖跟阿祖支持的人不一樣,後來鬧翻了。
一直到我阿祖過世前,她們都沒有在好好坐下來像聊聊天了,
我覺得好可惜,70 幾年的交情了,就因為政治搞壞了。
我想說的是,最近服貿打得火熱,
每個人都會有自己的看法,
我們可以提出自己的想法,
但是也要注意自己的語氣還有風度,
再表達自己意見的同時,我們也要傾聽別人的想法,
別因為一時看法不同,打壞了原本非常要好的友誼。
「我不贊成你的意見 但是我誓死捍衛你說話的權利」- 伏爾泰
可以表達我們各自的看法,
想說我們想說的話,
不就是我們身為一個民主法治國家可貴的地方嗎。
Proxmox VE and Visualization
|
Dec 25, 2013
因為研究的關係,會需要在 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
然後就會開始出現藍底白字畫面了,如下:
先在 General setup ->> Local version – append to kernel release 設定你這次編譯的名稱
Networking support -> Networking options -> 把 802.1d Ethernet Bridging * 改為 M
最後,按下 Save an Alternate Configuration File
保留 config 檔,並離開 Linux Kernel Configuration
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
Visualization and Open vSwitch
|
Dec 15, 2013
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