本節書摘來自華章出版社《ansible權威指南》一書中的第3章,第3.3節,作者 李松濤 魏 巍 甘 捷 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
3.3 ad-hoc組管理和特定主機變更
3.2節為大家介紹了ansible子產品清單及help說明擷取方式。日常運維工作中,我們往往會将負責相同場景應用的主機劃分為一個組,以友善統一管理。ansible也提供了簡潔但強大的組管理功能。同時,我們也可能遇到隻針對這組主機中一台或某些主機做變更的場景,針對這些複雜多變的企業場景,本節我們将深入了解ad-hoc組管理和特定主機變更,進一步了解ansible如何應對複雜多變的企業環境。
3.3.1 ad-hoc組定義
ad-hoc的組功能定義在inventory檔案中,預設路徑是etcansiblehosts,書寫格式遵循ini風格,中括号中的字元為組名。可以将同一個主機同時歸并到多個不同的組中;此外,若目标主機使用了非預設的ssh端口,還可以在主機名稱之後使用冒号加端口号來标明。下面通過實際案例來了解inventory檔案的書寫規則。
如下為inventory檔案示例,包括了組定義及冒号加端口号功能的使用。
ntp.magedu.com
[webservers]
www1.magedu.com2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
如果遠端主機名稱遵循相似的命名模式,還可以使用清單的方式辨別各主機,如下案例為大家展示該寫法。
www[0150].magedu.com
[databases]
db-[af].magedu.com
本次架構規劃了前端proxy、web servers和後面db一套完整應用,以友善大家實際參考,拓撲規劃請參考圖3-5。圖中共定義了proxy、app、nosql和db這4個組。組配置請編輯etcansiblehosts添加如下配置:
[proxy]
192.168.37.159
[app]
192.168.37.130
192.168.37.160
[nosql]
192.168.37.142
[db]
應用分布如下。
[proxy]組:nginx;
[app]組:nginx+php+django;
[nosql]組:redis;
[db]組:mariadb。
如圖3-5所示的架構拓撲是簡化後的網際網路web服務架構,使用者請求通過proxy轉發至後端webservers響應,通過nosql服務緩沖後,最終将請求傳送到db。我們本章的實戰内容就是通過ansible來搭建這樣一套web服務架構。
3.3.2 ad-hoc配置管理:配置proxy與web servers實踐
本節通過配置proxy &web servers學習ad-hoc的組管理方式,前端proxy隻用到nginx七層代理功能,将請求轉發至後端web servers,web servers同時部署nginx、php和django應用,我們按proxy、webservers依次順序部署應用。
(1)ad-hoc配置管理proxy(即nginx)
安裝nginx,執行指令:
ansible proxy -m
yum -a name=nginx state=present
利用ansible安裝nginx,如圖3-6所示。
changed true, 表示本次指令對執行的目标有變更,如再執行一次則為false,表示執行的目标沒
有變更,這裡的false和true不代表該指令執行成功或失敗,隻是表示執行目
标是否被變更
rc 0, resultcode的簡寫,表示指令的執行結果狀态傳回,非0均為異常,指令執行失敗
results [ 執行結果資訊傳回
如果我們要檢查nginx正常安裝,可以執行指令:ansible
proxy -m command -a nginx -v,如果正常則傳回如下内容:
192.168.37.159 success
rc=0
nginx version
nginx1.0.15
ansible的yum子產品同樣支援指定某版本安裝,其name參數指定具體版本位址(網絡或本地均可)。yum子產品也支援從網絡安裝或從本地安裝。
如果從網絡安裝,執行指令:
yum -a name=httpnginx.orgpackagescentos6noarchrpmsnginx-release-centos-6-0.el6.ngx.noarch.rpm
state=present
如果從本地安裝,執行指令:
yum -a name=usrlocalsrcnginx-release-centos-6-0.el6.ngx.noarch.rpm
如指定網絡安裝,安裝期間請保障網絡暢通,并可以通路internet,具體安裝時長視網絡寬帶品質而定,如100m帶寬,該項安裝進行了約2min。如圖3-6為nginx安裝的部分結果回報,ansible在對執行結果傳回提示做得确實不盡人意,雖為json格式輸出,但換行和顔色辨別功能仍有待改善。
(2)ad-hoc配置管理web servers
web servers需同時部署nginx、php和django,其中nginx、php依然通過yum子產品實作,django推薦使用pip或easy_install方式。
1)nginx、php安裝指令如下:
ansible app -m
yum -a name=php state=present
2)django安裝指令如下:
步驟1:安裝mysql-python和python-setuptools依賴包。
yum -a name=mysql-python state=present
yum -a name=python-setuptools state=present
步驟2:安裝django。
pip -a name=django state=present
步驟3:檢查django安裝是否正常,執行指令如下:
command -a python -c 'import django; print django.get_version()'
其中django依賴python 2.7+版本,如執行報錯如下,請檢查python版本。
traceback (most
recent call last)
file string, line 1, in module
file
usrlibpython2.6site-packagesdjango__init__.py, line 1, in module
fromdjango.utils.version
import get_version
usrlibpython2.6site-packagesdjangoutilsversion.py, line 7, in module
fromdjango.utils.lru_cache
import lru_cache
file usrlibpython2.6site-packagesdjangoutilslru_cache.py,
line 28
fasttypes =
{int, str, frozenset, type(none)},
^
syntaxerror
invalid syntax
pip和easy_install子產品支援virtualenv虛拟多環境配置,該功能極為強大,是python應用者的必備利器。如上我們使用pip子產品安裝django,衆所周知easy_install也是python安裝軟體包常用的工具之一,ansible同樣支援easy_install,指令類同# ansible app -m easy_install -a name=django即可。兩者相比較而言,pip的功能較easy_install更為強大,且支援解除安裝、指定版本号等。經過筆者親測,建議使用pip子產品安裝python系列軟體包,除功能強大外,我們發現pip子產品的穩定性和速度也遠勝easy_install子產品(centos 6.5 final)。
截至目前,proxy & web servers部署完畢,通過數條語句即可完成。本示例中的伺服器隻有4台,如果是40、400、4000台,其帶來的便利和節省的時間成本是不可估量的,更為重要的是,這在很大程度上,可以保障操作的正确性。
其實上面的這些變更通過ansible-playbook進行是更好的選擇,在後面playbook章節的講解與應用過程中大家會逐漸有所體會。當然通過shell單獨登入到對應的伺服器也能實作我們想要完成的工作,但ansible為我們節省了海量的時間成本,這也是我們學習ansible的意義所在。
3.3.3 ad-hoc配置後端:配置nosql與database servers實踐
3.3.2節我們使用ansible配置了proxy和web servers,接下來我們使用類似的方法配置nosql和db服務。我們使用redis配置nosql,我們使用mariadb配置db,之是以沒有使用mysql是因為自從mysql被甲骨文公司收購後,雖埃裡森宣稱mysql依然免費,但随着時間的推移,mysql原班核心人馬相繼離開甲骨文,并創立mariadb及mysql社群,開發者對現有oracle舉動感到不滿,行業内不少企業已在考慮使用mariadb,或計劃替換現有mysql。
具體操作步驟如下。
redis安裝指令:ansibledb -m yum -a name=redis
state=present。
redis安裝檢查:ansibledb -m command -a redis-cli
--version。
mariadb安裝步驟如下。
步驟1:添加yum源,vim編輯etcyum.repos.dmariadb.repo添加内容如下。
# mariadb 10.1
centos repository list - created 2016-02-13 0431 utc
#
httpmariadb.orgmariadbrepositories
[mariadb]
name = mariadb
baseurl =
httpyum.mariadb.org10.1centos6-x86
gpgkey=https
yum.mariadb.orgrpm-gpg-key-mariadb
gpgcheck=1
步驟2:安裝mariadb-server,
ansibledb -m yum
-a name=mariadb-server state=present
步驟3:安裝mariadb-client,
-a name=mariadb-client state=present
步驟4:開啟防火牆3306通路權限。
ansible db -m
command -a iptables -a input -s 192.168.37.024 -p tcp -m tcp --dport 3306 -j
accept
截至目前,如圖3-5所示的應用成功部署完畢。其實我們搭建一套主流web應用架構,期間無需登入遠端主機,通過ansible的結果傳回即可判斷所有操作是否正确。
3.3.4 ad-hoc特定主機變更
前兩節我們通過搭建了一套主流web應用架構熟悉了ansible的組管理,接下來為大家介紹如何針對特定伺服器做變更,該情景在日常運維工作中很常見。
ansible有多種方式實作針對特定主機做變更。
1)--limit:通過--limit參數限定主機做變更。
情景:在app組中啟動192.168.37.15的ntp服務。
指令用法:
command -a service ntpd status --limit 192.168.37.158
2)指定ip:通過指定具體ip限定主機做變更。
情景:啟動192.168.37.158的ntp服務。
執行指令:
ansible
192.168.37.158 -m command -a service ntpd status
3)用“”作分隔符,指定多台機器做變更。
情景:啟動192.168.37.158和192.168.37.161的ntp服務。
192.168.37.158192.168.37.161 -m command -a service ntpd status
4)通過“”泛比對,更靈活地針對多台主機做變更。
情景:啟動192.168.37.所有主機的ntp服務。
192.168.37. -m command -a service ntpd status
--limit在日常工作中經常用到,ansible-playbook也支援該參數。“”分隔指定多主機也是不錯的辦法,但記得要用引号将所有位址引起來。
到目前為止ad-hoc組管理及特定主機變更我們已經掌握,這對靈活管理海量伺服器有很大幫助,關于組及指定主機管理介紹到此結束。接下來為大家介紹的是ad-hoc基于使用者的管理。