天天看點

《Ansible權威指南》一3.3 Ad-Hoc組管理和特定主機變更

本節書摘來自華章出版社《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基于使用者的管理。

繼續閱讀