Ansible評測:老牌Unix管理員的夢想級方案
譯文【51CTO精選譯文】大部分服務(wù)器自動化及流程解決方案,例如Puppet與Chef,都依賴于特定方案編碼、Web UI以及命令行工具等要素的綜合體,從而使整套體系正常運(yùn)轉(zhuǎn)。Ansible則有所不同。盡管也能夠支持Web UI,Ansible在Unix管理員的監(jiān)管范圍內(nèi)同樣作用良好,即使用大量通用腳本以及命令行機(jī)制。
Ansible是一款極為靈活的開源工具套件,能夠大大簡化Unix管理員的自動化配置管理與流程控制方式。它利用推送方式對客戶系統(tǒng)加以配置,這樣所有工作都可在主服務(wù)器端完成。其命令行機(jī)制同樣非常強(qiáng)大,允許大家利用商業(yè)許可Web UI實(shí)現(xiàn)授權(quán)管理與配置。
安裝Ansible
安裝Ansible非常簡單。大家可以直接從Git資源庫中克隆鏡像,或者利用Linux或者Unix環(huán)境下的軟件包管理工具下載并安裝Ansible軟件包。管理工具能保證大家獲取必要的軟件包以及Python 2.6可執(zhí)行文件,而且前后只需數(shù)分鐘,我們就能完成Ansible主服務(wù)器的配置任務(wù)。
總體而言,大家需要將Ansible部署在中央服務(wù)器當(dāng)中,同時在Ansible主機(jī)文件內(nèi)配置所需管理的客戶端群組以及主機(jī)名稱。托管主機(jī)的配置流程也非常精簡,只需要安裝功能性Python 2.4或者2.6并為連入的Ansible主服務(wù)器及各臺主機(jī)配置SSH authorized_keys文件。
大家可以采取多種途徑實(shí)現(xiàn)這一步驟,例如作為特定用戶或者在主服務(wù)器上運(yùn)行命令的用戶將Ansible配置到全部接入主機(jī)當(dāng)中。各位當(dāng)然可以通過root權(quán)限用戶搞定一切,但很多朋友可能更傾向于利用普通用戶賬戶進(jìn)行連接并使用sudo命令實(shí)現(xiàn)root權(quán)限。
舉例來說,我們可以在自己的主服務(wù)器上建立一個名為“ansible”的用戶;接下來將一個“ansible”用戶添加至托管主機(jī)并為該用戶提供無需密碼的sudo使用能力。另外,我們也可以為主機(jī)上的sudo命令設(shè)定密碼,或者指定一個其它用戶名專門用于連接。總而言之,我們的最終目標(biāo)在于保證Ansible的控制可執(zhí)行文件通過SSH及運(yùn)行命令接入同一臺經(jīng)過配置的主機(jī)。到這里,我們已經(jīng)講完了關(guān)于Ansible主服務(wù)器及客戶機(jī)的全部配置流程。
Ansible如何運(yùn)行
主服務(wù)器與托管主機(jī)的配置工作完成之后,現(xiàn)在我們可以著手了解Ansible的具體功能。下面舉一個簡單的例子:
- [ansible@ansible1: ~]$ ansible all -m ping -u ansible -sudo
- ansiblecentos.iwlabs.net | success >> {
- "changed": false,
- "ping": "pong"}
- ansibleubuntu.iwlabs.net | success >> {
- "changed": false,
- "ping": "pong"
- }
上述命令的作用在于確保我們的托管主機(jī)已經(jīng)完成配置并能夠正確應(yīng)答請求。根據(jù)返回的結(jié)果,可以看到我們的目標(biāo)主機(jī)已經(jīng)準(zhǔn)備好應(yīng)對日常任務(wù)了。
現(xiàn)在,我們可以運(yùn)行其它命令進(jìn)一步探索其功能特性:
- [ansible@ansible1: ~]$ ansible all -m copy -a "src=/etc/myconf.conf dest=/etc/myconf.conf" -u ansible -sudo
- ansiblecentos.iwlabs.net | success >> {
- "changed": true,
- "dest": "/etc/myconf.conf",
- "gid": 500,
- "group": "ansible",
- "md5sum": "e47397c0881a57e89fcf5710fb98e566",
- "mode": "0664",
- "owner": "ansible",
- "size": 200,
- "src": "/home/ansible/.ansible/tmp/ansible-1379430225.64-138485144147818/source",
- "state": "file",
- "uid": 500
- }
- ansibleubuntu.iwlabs.net | success >> {
- "changed": true,
- "gid": 1000,
- "group": "ansible",
- "mode": "0664",
- "owner": "ansible",
- "path": "/etc/myconf.conf",
- "size": 200,
- "state": "file",
- "uid": 1000
- }
如大家所見,以上命令旨在將/etc/myconf.conf文件復(fù)制到我們的兩臺托管主機(jī)當(dāng)中。在復(fù)制過程中,我們還會獲得一個JSON返還對象,其中包括數(shù)據(jù)以及文件歸屬等信息。我們還可以通過命令行調(diào)整其歸屬、權(quán)限以及其它變量。
我們還可以通過以下命令確保服務(wù)會在主機(jī)啟動的同時開始運(yùn)行:
- [ansible@ansible1: ~]$ ansible webservers -m service -a "name=httpd state=running" u ansible -sudo
或者重新啟動這些主機(jī):
- [ansible@ansible1: ~]$ ansible webservers -m command -a "/sbin/reboot -t now"
或者提取一份包含全部主機(jī)的清單:
- [ansible@ansible1: ~]$ ansible all -m setup -u ansible --sudo
最后一行命令將輸出用于描述每一臺主機(jī)的JSON對象,其中包括總體內(nèi)存、已使用內(nèi)存、CPU、網(wǎng)絡(luò)、磁盤信息、操作系統(tǒng)版本以及內(nèi)核版本等等。
如各位所見,Ansible允許用戶通過調(diào)整命令行參數(shù)執(zhí)行命令、收集數(shù)據(jù)并向目標(biāo)位置復(fù)制文件。
這項(xiàng)功能本身也可以單獨(dú)通過SSH外加一些腳本來實(shí)現(xiàn),畢竟利用遠(yuǎn)程主機(jī)上的SSH實(shí)現(xiàn)命令執(zhí)行早已不是什么新聞。Ansible的進(jìn)取之處在于有能力通過一條短短的參數(shù)集同時實(shí)現(xiàn)命令執(zhí)行、分組、清單以及其它更高級別的主機(jī)管理功能。每一項(xiàng)Ansible命令行功能都提供多種選項(xiàng),包括引用多個分組或者在單一子集(例如將前五十臺服務(wù)器構(gòu)建為一個分組子集)中運(yùn)行命令。
Unix管理員當(dāng)然能夠立即上手這些功能,并快速利用Ansible的工具編寫腳本、從而以非常簡便的方式實(shí)現(xiàn)任務(wù)處理的自動化與流程化。除此之外,我們還可以創(chuàng)建Playbook以收集命令與任務(wù)集,這樣能夠大大降低管理工作的復(fù)雜程度。
Ansible Playbook
Playbook采用YAML語法結(jié)構(gòu),因此它們一般比較易于閱讀并加以配置。舉例來說,下面這條簡單的Playbook能夠確保NTPD始終以“ansible”用戶身份運(yùn)行在全部主機(jī)上、且利用sudo進(jìn)行連接。
- ---
- - hosts: all
- remote_user: ansible
- tasks:
- - service: name=ntpd state=started
- sudo: yes
我們還可以利用Playbook實(shí)現(xiàn)文件復(fù)制。如下所示為Playbook文件復(fù)制版本,其中同時對歸屬及文件所在客戶機(jī)的權(quán)限做出了指定:
- ---
- - hosts: all
- remote_user: ansible
- tasks:
- - name: Copy file to client
- copy: src=/etc/myconf.conf dest=/etc/myconf.conf
- owner=root group=root mode=0644
我們也可以在Playbook中使用各種變量:
- ---
- - hosts: webservers
- remote_user: root
- vars:
- ntp_service: 'ntpd'
- tasks:
- - service: name={{ ntp_service }} state=started
- sudo: yes
除了前面列舉的例子之外,我們還可以使用模板。大家可以在建立的模板中引用變量,而后從Playbook當(dāng)中調(diào)用這些模板、從而構(gòu)建需要的文件。最后,為Apache配置創(chuàng)建一個模板文件,將該配置利用Playbook所指定的變量添加到客戶機(jī)當(dāng)中:
- template: src=/srv/templates/apache.conf dest=/etc/httpd/conf.d/{{ vhost }}.conf
當(dāng)然,我們可能還需要在稍后重新啟動服務(wù)——這一點(diǎn)可以通過notify及handler函數(shù)實(shí)現(xiàn)。
- notify:
- restart apache
- handlers:
- - name: restart apache
- service: name=apache state=restarted
在Playbook中包含上述命令能夠確保虛擬主機(jī)配置文件被保存在客戶機(jī)中的正確位置,而后重啟Apache、從而使全部配置變更正常生效。
與大家的期望相同,我們可以在Playbook中包含文件。我們可以創(chuàng)建一個包含全部必要handler的文件,而后將該文件添加到新Playbook當(dāng)中。如此一來,我們就能夠集中對所有handler進(jìn)行配置、同時又確保它們適用于全部Playbook。
更進(jìn)一步,大家還可以通過配置角色在Playbook中收集handler、任務(wù)以及各種變量,從而供其它角色引用。舉例來說,大家可能在數(shù)據(jù)庫服務(wù)器的日常使用中涉及一系列handler與任務(wù),這時就需要在數(shù)據(jù)庫角色中包含這些文件,而后將角色添加到Playbook當(dāng)中以容納全部配置元素。大家還可以根據(jù)需要對關(guān)聯(lián)性進(jìn)行配置,從而使其它角色引用現(xiàn)有配置方案。
總而言之,Playbook的創(chuàng)建過程并不太直觀,但精心調(diào)教出來的Playbook也確實(shí)能帶來出色的擴(kuò)展能力與順暢的組織方式。值得一提的是,Playbookr運(yùn)行非常便捷:
- [ansible@ansible1: ~]$ ansible-playbook myplaybook.yml -f 10
這條命令將并行運(yùn)行十次Playbook的myplaybook.yml文件,也就是說服務(wù)器將一次性與十臺客戶機(jī)連接并在其中運(yùn)行myplaybook.yml。
While Ansible uses paramiko, a Python SSH2 implementation, or native SSH to communicate with clients, there can be a scalability issue when moving into large numbers of clients. To address this, Ansible 1.3 offers an accelerate mode that launches a daemon over SSH that provides AES-encrypted communication directly with the client. This feature can speed up client communications substantially when measured in large-scale implementations as compared to paramiko or native SSH. |
由于Ansible使用的是paramiko,一種Python SSH2方案,或者原生SSH與客戶機(jī)通信,因此當(dāng)對應(yīng)的客戶機(jī)數(shù)量過大時有可能出現(xiàn)擴(kuò)展性問題。為了解決這一弊端,Ansible 1.3版本提供一套加速模式,通過在SSH上啟動后臺程序?qū)崿F(xiàn)與客戶機(jī)之間的直接加密通信。
Ansible模塊
Ansible當(dāng)中包含一系列模塊,旨在實(shí)現(xiàn)其它擴(kuò)展功能,例如針對云服務(wù)(以Amazon EC2為代表)的配置與管理以及針對各主流數(shù)據(jù)庫服務(wù)器、文件操作以及網(wǎng)絡(luò)設(shè)備的專用模塊等。大家還可以通過創(chuàng)建自己的模塊來滿足特定需求。我們幾乎能夠使用任何一種編程語言來創(chuàng)建此類模塊,除了Python之外、還包括Perl、Bash乃至C++。
我們可以通過編碼讓模塊接納變量,并要求其輸出JSON對象以指明包括命令在內(nèi)的各種能夠在運(yùn)行過程中收集到的相關(guān)狀態(tài)信息。
AnsibleWorks AWX
Ansible也支持一套特定的Web UI,這就是AnsibleWorks AWX。這是一套付費(fèi)解決方案,能夠圍繞Ansible提供清晰而簡潔的Web UI。不過這套Web UI無法在默認(rèn)狀態(tài)下被直接添加到Ansible配置當(dāng)中;如果大家已經(jīng)在服務(wù)器上廣泛安裝了Ansible,那么直接將AWX添加進(jìn)去并不能立刻獲得Web樣式的預(yù)期結(jié)構(gòu)。相反,大家可以利用命令行工具將現(xiàn)有Ansible Inventory導(dǎo)入到AWX當(dāng)中——如果需要讓命令行與AWX保持一致,我們還需要在此后不斷對二者加以同步。
一旦安裝并開始運(yùn)行AWX,大家可以根據(jù)自己的基礎(chǔ)設(shè)施狀況對用戶、團(tuán)隊(duì)、Inventory、項(xiàng)目以及工作模板等進(jìn)行配置。不過需要注意的是,大家必須以新增形式添加這些對象,它們并不以那些包含著全部主機(jī)及配置的現(xiàn)有配置文件為基礎(chǔ)。AWX還提供RESTful API,并集成了LDAP與Active Directory以實(shí)現(xiàn)驗(yàn)證及授權(quán)功能。這種集成能夠幫助大家更便捷地在UI當(dāng)中將用戶及群組與全局組織進(jìn)行映射。
AWX Web UI提供的界面簡潔而且比較直觀,執(zhí)行速度相當(dāng)出色。該UI嚴(yán)格基于Playbook,因此無法使用任何命令行功能。我們需要通過創(chuàng)建Playbook來描述自己想要執(zhí)行的命令行操作,然后將其添加到服務(wù)器中的特定目錄之下。接下來在UI中的工作模板之下訪問對應(yīng)Playbook,而后將其作為Inventory的附加組件,這樣包含在內(nèi)的工作就能順利進(jìn)行了。
這套Web UI確實(shí)具備一定功能性,但它既不夠完善也無法作用于命令行界面。舉例來說,大家不能通過這套Web UI實(shí)現(xiàn)工作調(diào)度——相反,各位倒是可以很輕松地通過命令行中的cron滿足這類需要。Playbook可以運(yùn)行在Web UI與命令行兩種環(huán)境下,因此如果大家的命令行安裝體積太過龐大,不妨考慮將自己的Playbook換個平臺,這幾乎不會帶來什么影響。當(dāng)然,結(jié)構(gòu)的其它部分仍然需要通過同步實(shí)現(xiàn)復(fù)制。
AnsibleWorks AWX還借助一系列Ansible模塊帶來基于Web的簡單云服務(wù)集成效果,因此大家可以為內(nèi)部用戶及團(tuán)隊(duì)提供一套Web UI,從而通過本地管理控制臺支撐起公共或者私有云服務(wù),并利用本地LDAP或者AD基礎(chǔ)設(shè)施實(shí)現(xiàn)身份驗(yàn)證與授權(quán)。通過這種方式,AWX完全能夠充當(dāng)一套針對內(nèi)部客戶的自助門戶。
Ansible實(shí)際效果
長話短說,Ansible是一款極度化且易于設(shè)置及運(yùn)行的自動化工具。其Web UI還算實(shí)用,但對于日常操作之外的深層任務(wù),命令行的擴(kuò)展性更好、效率也更高。
Ansible并未內(nèi)置任何高可用性機(jī)制,但該方案的調(diào)度簡潔設(shè)計(jì)允許用戶輕松通過多套系統(tǒng)控制所有客戶機(jī)。只要在各服務(wù)器上采用豐富的“Playbook”及配置元素,高可用性倒不是什么大問題。
缺乏對Windows環(huán)境的支持導(dǎo)致Ansible在互操作性環(huán)節(jié)得分偏低,但需要強(qiáng)調(diào)的是,這是一款真正為Linux及Unix管理所量身打造的工具,所以這也不算什么大毛病。
Ansible的設(shè)計(jì)與實(shí)際效果證明,這是一款專為Unix老鳥管理員打造的利器。Ansible不走Windows路線,而且也沒有提供太多點(diǎn)綴和可有可無的小玩意。總而言之,這是一款確實(shí)能夠快速簡便打理Linux及Unix系統(tǒng)的優(yōu)秀產(chǎn)品。
原文鏈接: