- Ansible權(quán)威指南
- 李松濤 魏巍 甘捷
- 1131字
- 2019-01-04 06:58:31
第1章
Ansible基礎(chǔ)入門
“未來主體是傳統(tǒng)行業(yè)利用互聯(lián)網(wǎng)技術(shù),以云端用人工智能的方式處理大數(shù)據(jù)”,在騰訊“云+未來”技術(shù)峰會上,馬化騰這樣形容未來。15年前,電腦還只是少數(shù)人的專屬,那時的網(wǎng)吧還很火,還沒人知道“網(wǎng)咖”是什么。而現(xiàn)在人手一部智能手機(jī),物聯(lián)網(wǎng)更是讓日常生活中的普通家電也能在互聯(lián)網(wǎng)占據(jù)一席之地。這一切都推動著互聯(lián)網(wǎng)如火如荼發(fā)展,IT技術(shù)的發(fā)展更是日新月異,IT工種的分類日益精細(xì)專業(yè)化。
從早期All In One(所有應(yīng)用部署在一臺服務(wù)器上)的簡單應(yīng)用,到后期集群、高可用、緩存、消息隊列、配置中心、主從分離、負(fù)載均衡、大數(shù)據(jù)存儲等尖端技術(shù)的復(fù)雜應(yīng)用,對運(yùn)維的技術(shù)專業(yè)度和綜合技能要求越來越高,運(yùn)維的交付標(biāo)準(zhǔn)不再以周或天為單位,而是以分鐘為單位。在現(xiàn)在是如此,在未來更是如此。運(yùn)維不再如早期一樣,手動一臺臺地登錄服務(wù)器、部署應(yīng)用配置環(huán)境、手動交付(諸如亞馬遜、Google等巨型企業(yè)早已實現(xiàn)自動擴(kuò)縮容,配置應(yīng)用自動化,流程自動交付等功能)。該方式耗時耗力,很難避免人為因素的錯誤,最主要的是這些重復(fù)手工勞動無法讓運(yùn)維有更大的價值釋放,這一切都是不合理的,需要有更好的解決方式。
相信看到這里,大家都明白,我們需要一套自動化管理工具來幫助運(yùn)維更高質(zhì)量、更有效地完成手頭工作,以證明運(yùn)維能創(chuàng)造的價值不止于此,況且生活不止眼前的茍且,還有詩和遠(yuǎn)方,不是嗎?但當(dāng)下SaltStack、Puppet、Fabric、Chef等自動化工具遍地開花,為什么還要推薦Ansible呢?讀完本章你會有些許想法,未來已來,只是尚未流行。
1.1 Ansible是什么
隨著移動互聯(lián)、物聯(lián)網(wǎng)、互聯(lián)網(wǎng)+、大數(shù)據(jù)、云計算等大規(guī)模應(yīng)用的催生推動,以及人們?nèi)粘I畹幕ヂ?lián)網(wǎng)化,互聯(lián)網(wǎng)的蓬勃發(fā)展不僅沖擊影響著整個經(jīng)濟(jì)體,更對人們的生活理念影響深遠(yuǎn)。在體驗到互聯(lián)網(wǎng)帶來的便利和舒適的同時,人們也不再滿足于“可以用”,而是要“用得爽”,在政策、需求、利益、趨勢等原因的刺激下,互聯(lián)網(wǎng)的發(fā)展速度可想而知。眾所周知,智能的背后意味著復(fù)雜,這一現(xiàn)象在互聯(lián)網(wǎng)的發(fā)展中體現(xiàn)得淋漓盡致。在互聯(lián)網(wǎng)迅猛發(fā)展的同時,運(yùn)維這個工種也從默默無聞的后臺逐步走向公眾視野,被更多的人所知曉。早期公司業(yè)務(wù)有數(shù)十臺、上百臺服務(wù)器已經(jīng)是非常龐大的規(guī)模,每個運(yùn)維同時操作10~20臺機(jī)器,忙碌地奔波于各電腦之間配置重啟服務(wù),數(shù)十人摩肩接踵的場面是何等壯觀。只是每個人都在數(shù)十臺機(jī)器上做同樣的修改、配置、操作,如何保證每臺機(jī)器的操作都完全一樣呢?又如何保證其他所有人的操作都能準(zhǔn)確無誤、沒有遺漏過失呢?更何況,隨著互聯(lián)網(wǎng)的迅猛發(fā)展,一個公司擁有幾十臺上百臺機(jī)器早已不是稀奇事,巨型公司數(shù)以萬計的機(jī)器都不在話下,再沿用老一套辦法一臺臺地人工修改配置已然不現(xiàn)實,這該怎么辦呢?相信此時你已然明白運(yùn)維自動化具體是什么了。簡單來講,運(yùn)維自動化就是將日常重復(fù)性的工作通過規(guī)則設(shè)定使其遵循預(yù)先既定規(guī)則,在指定的范圍時間內(nèi)自動化運(yùn)行,但整個過程無需人工參與。而Ansible正是幫助運(yùn)維人員實現(xiàn)自動化的工具之一。
Ansible是近年越來越火的一款運(yùn)維自動化工具,其主要功能是幫忙運(yùn)維實現(xiàn)IT工作的自動化、降低人為操作失誤、提高業(yè)務(wù)自動化率、提升運(yùn)維工作效率,常用于軟件部署自動化、配置自動化、管理自動化、系統(tǒng)化系統(tǒng)任務(wù)、持續(xù)集成、零宕機(jī)平滑升級等。它豐富的內(nèi)置模塊(如acl、command、shell、cron、yum、copy、file、user等,多達(dá)569個)和開放的API接口
,同時任何遵循GPL
協(xié)議的企業(yè)或個人都可以隨意修改和發(fā)布自己的版本。
Ansible在其官網(wǎng)上定義如下:Ansible is a radically simple IT automation engine。即Ansible是一款極其簡單的IT自動化工具。這里特別使用了radically simple來形容Ansible的簡單程度,在0.X版本的Ansible官網(wǎng)中,更“過分”地使用Stupid Simple來形容Ansible是“令人發(fā)指的簡單”。在Ansible官網(wǎng)的通篇文檔中也不時使用Incredibly Simples、Keep It Simple、Power+Simplicity等字眼,可見Ansible這款自動化工具的設(shè)計非常注重Simple的理念。但Ansible的功能卻非常不簡單,完全沒有因為使用方式上的簡單而縮水,其自身內(nèi)置模塊的數(shù)量達(dá)500多個,而且還在快速地增加新模塊,以下是這些模塊的覆蓋面的大致分類。
?系統(tǒng)層:支持的系統(tǒng)有Linux、Windows、AIX等,對應(yīng)的模塊有acl、cron、pip、easy_install、yum、authorized_key等大量的內(nèi)置模塊;
?知名第三方平臺支持:支持的云平臺有AWS、Azure、Cloudflare、Openstack、Google、Linode、Digital Ocean等,對應(yīng)的模塊有ec2、azure_rm_deployment、cloudflare_dns、clc_aa_policy、glance_image、gc_storage、digital_ocean等;
?虛擬化:VMware、Docker、Cloudstack、LXC、Openstack等,對應(yīng)的模塊有vmware_vmkernel、docker、cs_account、lxc_container、glance_image等;
?商業(yè)化硬件:F5、ASA、Citrix、Eos等,對應(yīng)的模塊有bigip_facts、asa_acl、netscaler、eos_command等;
?系統(tǒng)應(yīng)用層:Apache、Zabbix、Rabbitmq、SVN、GIT等,對應(yīng)的模塊有apache2_module、zabbix_group、rabbitmq_binding、subversion、git等。
GitHub上有眾多開源愛好者為Ansible貢獻(xiàn)功能模塊,這些模塊完全可以滿足日常工作所需。官方對模塊也從使用者角度進(jìn)行詳細(xì)分類,如Cloud Modules(云主機(jī)模塊)、Clustering Modules(集群模塊)、Commands Modules(命令模塊)、Database Modules(數(shù)據(jù)庫模塊)等。詳細(xì)的模塊分類可參考官方模塊列表:http://docs.ansible.com/ansible/modules_by_category.html,該網(wǎng)址內(nèi)容的更新速度非常快,如果公司在使用Ansible,建議最少兩周關(guān)注一次。
Ansible名字其實是來源于其作者喜歡的一本書——奧森·斯科特·卡特的《安德的游戲》,該書中Ansible是一種能跨越時空的即時通信工具,使用Ansible可以在相距數(shù)光年的距離遠(yuǎn)程實時控制前線的艦隊?wèi)?zhàn)斗。Michael DeHaan希望借這個名詞比喻控制遠(yuǎn)端大量的服務(wù)器,因此便將自己的這款產(chǎn)品命名為Ansible。
Web界面是一款功能完善的管理工具的必備功能,Tower是Ansible的Web化管理界面,但免費(fèi)版的容量只有10臺主機(jī),付費(fèi)版則無容量限制。基于此原因,本書的第12~14章會介紹搭建屬于自己的Web化管理界面的方法,并代碼全開源,具體地址大家可從GitHub上下載,同時讀者遇到的問題都可以通過QQ群“Ansible中文權(quán)威”咨詢
,或在微信公眾號
“運(yùn)維部落”留言。
更多信息請參考:
?Ansible官方地址:https://docs.ansible.com/;
?GitHub地址:https://github.com/ansible/ansible/blob/devel/docsite/rst/index.rst;
?Ansible中文權(quán)威地址:http://www.ansible.com.cn/。
1.2 Ansible發(fā)展史
Ansible的第一個版本是0.0.1,發(fā)布于2012年3月9日,其作者兼創(chuàng)始人是Michael DeHaan。Michael DeHaan曾經(jīng)供職于Puppet Labs、RedHat、Michael,在配置管理和架構(gòu)設(shè)計方面有豐富的經(jīng)驗。其在RedHat任職期間主要開發(fā)了Cobble,經(jīng)歷了各種系統(tǒng)簡化、自動化基礎(chǔ)架構(gòu)操作的失敗和痛苦,在嘗試了Puppet、Chef、Cfengine、Capistrano、Fabric、Function、Plain SSH等各式工具后,決定自己打造一款能結(jié)合眾多工具優(yōu)點(diǎn)的自動化工具, Ansible由此誕生。
其第一個版本號被非常謹(jǐn)慎地定義為0.01。到目前為止共發(fā)布107個版本,最新穩(wěn)定版是Stable 2.1.1.0-1,最新Beat版Beat 2.1.1.0-0.1.rc1。值得一提的是,作為自動化工具新秀, Ansibe已被RedHat官方收購,在GitHub上被關(guān)注的勢頭也極為迅猛,Star和Fork數(shù)是當(dāng)下紅極一時的SaltStack的2倍多。同類自動化工具GitHub關(guān)注程度如表1-1所示。從表可以看出Ansible的受歡迎度。被RedHat收購后,其未來發(fā)展?jié)摿Ω遣豢晒懒俊?/p>
表1-1 同類自動化工具GitHub關(guān)注程度(2016-07-10)

Ansible版本更新速度非常快,有時會一天推出多個Dev版本,7天推出一個穩(wěn)定版本。所以使用Ansible的過程中也需多留意官網(wǎng)的更新。
1.3 為什么選擇Ansible
Ansible自2012年發(fā)布以來,沒多久便在美國開始流行。快速被IT人員接受的原因較大方面得益于Michael DeHaan在美國IT圈的名氣和影響力。隨后它逐步在各國流行。而筆者選擇Ansible的原因主要有如下幾個方面:
?Ansible完全基于Python開發(fā),而DevOps在國內(nèi)已然是一種趨勢,Python被逐步普及,運(yùn)維人員自己開發(fā)工具的門檻逐步降低,得益于此,方便對Ansible二次開發(fā);
?Ansible豐富的內(nèi)置模塊,甚至還有專門為商業(yè)平臺開發(fā)的功能模塊,近600個模塊完全可以滿足日常功能所需;
?在Ansible去中心化概念下,一個簡單的復(fù)制操作即可完成管理配置中心的遷移;
?Agentless(無客戶端),客戶端無需任何配置,由管理端配置好后即可使用,這點(diǎn)非常誘人。在第10章會介紹如何部署配置Windows系統(tǒng)的主機(jī)端,用后會有深切的感受。
自Ansible發(fā)布后,也陸續(xù)被AWS、Google CloudPlatform、Microsoft Azure、Cisco、HP、VMware、Twitter等大公司接納并投入使用。關(guān)于筆者個人與Ansible的一些故事,有興趣的朋友可以參考本書前言。
1.4 Ansible是如何工作的
Ansible沒有客戶端,因此底層通信依賴于系統(tǒng)軟件,Linux系統(tǒng)下基于OpenSSH通信, Windows系統(tǒng)下基于PowerShell,管理端必須是Linux系統(tǒng),使用者認(rèn)證通過后在管理節(jié)點(diǎn)通過Ansible工具調(diào)用各應(yīng)用模塊將指令推送至被管理端執(zhí)行,并在執(zhí)行完畢后自動刪除產(chǎn)生的臨時文件。Ansible具體的工作機(jī)制官方有專欄介紹https://www.ansible.com/how-ansible-works,但整體稍過簡略。我們參考從官網(wǎng)視頻中的截圖來詳細(xì)了解下其工作方式,如圖1-1所示。根據(jù)Ansible使用過程中的不同角色,我們將其分為:
?使用者
?Ansible工具集
?作用對象
(1)使用者
如圖1-1中Ansible工作機(jī)制所示,Ansible使用者來源于多種維度,圖中為我們展示了4種方式:
第一種方式:CMDB(Configuration Management Database,配置管理數(shù)據(jù)庫), CMDB存儲和管理著企業(yè)IT架構(gòu)中的各項配置信息,是構(gòu)建ITIL項目的核心工具,運(yùn)維人員可以組合CMDB和Ansible,通過CMDB直接下發(fā)指令調(diào)用Ansible工具集完成操作者所希望達(dá)成的目標(biāo);
第二種方式:PUBLIC/PRIVATE方式,Ansible除了豐富的內(nèi)置模塊外,同時提供豐富的API語言接口,如PHP、Python、PERL等多種當(dāng)下流行語言,基于PUBLIC(公有云)/PRIVATE(私有云), Ansible以API調(diào)用的方式運(yùn)行;
第三種方式:USERS直接使用Ad-Hoc臨時命令集調(diào)用Ansible工具集來完成任務(wù)執(zhí)行, Ad-Hoc將在第3章有詳細(xì)介紹;
第四種方式:USERS預(yù)先編寫好的ANSIBLE PLAYBOOKS,通過執(zhí)行Playbooks中預(yù)先編排好的任務(wù)集按序完成任務(wù)執(zhí)行。
(2)Ansible工具集
ansible命令是Ansible的核心工具,ansible命令并非自身完成所有的功能集,其只是Ansible執(zhí)行任務(wù)的調(diào)用入口,大家可心理解為“總指揮”,所有命令的執(zhí)行通過其“調(diào)兵遣將”最終完成。ansible命令共有哪些兵將可供使喚呢?大家看中間綠色框中有INVENTORY(命令執(zhí)行的目標(biāo)對象配置文件)、API(供第三方程序調(diào)用的應(yīng)用程序編程接口)、MODULES(豐富的內(nèi)置模塊)、PLUGINS(內(nèi)置和可自定義的插件)這些可供調(diào)遣。
(3)作用對象
Ansible的作用對象,不僅僅是Linux和非Linux操作系統(tǒng)的主機(jī)(HOSTS),同樣也可以作用于各類公有云/私有云,商業(yè)和非商業(yè)設(shè)備的網(wǎng)絡(luò)設(shè)施。

圖1-1 Ansible工作機(jī)制
同樣,如果我們按Ansible工具集的組成來講,由圖1-1可以看出Ansible主要由6部分組成。
?ANSIBLE PLAYBOOKS:任務(wù)劇本(任務(wù)集),編排定義Ansible任務(wù)集的配置文件,由Ansible順序依次執(zhí)行,通常是JSON格式的YML文件;
?INVENTORY:Ansible管理主機(jī)的清單;
?MODULES:Ansible執(zhí)行命令的功能模塊,多數(shù)為內(nèi)置的核心模塊,也可自定義;
?PLUGINS:模塊功能的補(bǔ)充,如連接類型插件、循環(huán)插件、變量插件、過濾插件等,該功能不常用。
?API:供第三方程序調(diào)用的應(yīng)用程序編程接口;
?ANSIBLE:該部分圖中表示的不明顯,組合INVENTORY、API、MODULES、PLUGINS的綠框大家可以理解為是Ansible命令工具,其為核心執(zhí)行工具;
Ansible執(zhí)行任務(wù),這些組件相互調(diào)用關(guān)系如圖1-2所示:

圖1-2 Ansible組件調(diào)用關(guān)系
使用者使用Ansible或Ansible-playbook(會額外讀取Playbook文件)時,在服務(wù)器終端輸入Ansible的Ad-Hoc命令集或Playbook后,Ansible會遵循預(yù)先編排的規(guī)則將Playbooks逐條拆解為Play,再將Play組織成Ansible可識別的任務(wù)(Task),隨后調(diào)用任務(wù)涉及的所有模塊(Module)和插件(Plugin),根據(jù)Inventory中定義的主機(jī)列表通過SSH(Linux默認(rèn))將任務(wù)集以臨時文件或命令的形式傳輸?shù)竭h(yuǎn)程客戶端執(zhí)行并返回執(zhí)行結(jié)果,如果是臨時文件則執(zhí)行完畢后自動刪除。
1.5 Ansible通信發(fā)展史
Ansible主推的賣點(diǎn)是其無需任何Daemon維護(hù)進(jìn)程即可實現(xiàn)相互間的通信,且通信方式是基于業(yè)內(nèi)統(tǒng)一標(biāo)準(zhǔn)的安全可靠的SSH安全連接。同時因為SSH是每臺Linux主機(jī)系統(tǒng)必裝的軟件,所以Ansible無需在遠(yuǎn)程主機(jī)端安裝任何額外進(jìn)程,即可實現(xiàn)Agentless(無客戶端),進(jìn)而助力其實現(xiàn)去中心化的思想。盡管穩(wěn)定、快速、安全的SSH連接是Ansible通信能力的核心,但SSH的連接效率一直被詬病,所以Ansible的通信方式和效率在過去的數(shù)年中也在不停地改變和提高。基于以上認(rèn)識,我們先來了解Ansible SSH的工作機(jī)制,再來回顧其發(fā)展史。
1.Ansible SSH工作機(jī)制
Ansible執(zhí)行命令時,通過其底層傳輸連接模塊,將一個或數(shù)個文件,或者定義一個Play或Command命令傳輸?shù)竭h(yuǎn)程服務(wù)器/tmp目錄的臨時文件,并在遠(yuǎn)程執(zhí)行這些Play/Comand命令,然后刪除這些臨時文件,同時回傳整體命令執(zhí)行結(jié)果。這一系列操作在未來的Ansible版本中會越來越簡單、直接,同時快速、穩(wěn)定、安全。通過了解其工作機(jī)制及其一直以來秉承的去中心化思想,我們可以總結(jié),Ansible是非C/S架構(gòu),自身沒有Client端,其主要特點(diǎn)如下。
?無客戶端,只需安裝SSH、Python即可,其中Python建議版本為2.6.6以上。
?基于OpenSSH通信,底層基于SSH協(xié)議(Windows基于PowerShell)。
?支持密碼和SSH認(rèn)證,因可通過系統(tǒng)賬戶密碼認(rèn)證或公私鑰認(rèn)證,所以整個過程簡單、方便、安全。建議使用公私鑰方式認(rèn)證,因為密碼認(rèn)證方式的密碼需明文寫配置文件,雖然配置文件可加密,但會增加Ansible使用的復(fù)雜度。
?支持Windows,但僅支持客戶端,服務(wù)端必須是Linux系統(tǒng)。
如Ansible官方介紹,如上特性是希望實現(xiàn)以下最終目標(biāo):
?Clear(簡易):YAML語法,Python語言編寫,易于管理,API簡單明了;
?Fast(敏捷):快速學(xué)習(xí),設(shè)置簡單,無需任何第三方軟件;
?Complete(全面):配置管理、應(yīng)用部署、任務(wù)編排等功能集于一身,豐富的內(nèi)置模塊滿足日常功能所需;
?Efficient(高效):沒有額外軟件包消耗系統(tǒng)性能;
?Secure(安全):沒有客戶端,底層基于OpenSSH,保證通信的安全可靠性。
2.Ansible通信方式發(fā)展歷程
Ansible底層基于安全可靠的SSH協(xié)議通信,但一直被人們詬病于其效率,通信功能作為Ansible最核心的功能之一,官方也一直在做改進(jìn)。本節(jié)我們來了解Ansible通信發(fā)展史。
(1)Paramiko通信模塊
最初,Ansible只使用Paramiko 實現(xiàn)底層通信功能,但是Paramiko只是Python語法的一個第三方庫,發(fā)展速度遠(yuǎn)不及OpenSSH
。同時,Paramiko的性能和安全性較OpenSSH稍遜一籌(在筆者眼里)。
在后續(xù)發(fā)布的新版本中,Ansible仍繼續(xù)兼容Paramiko,甚至在諸如RHEL 5/6等不支持ControlPersist(只在OpenSSH 5.6+版本中支持)的系統(tǒng)中封裝其為默認(rèn)通信模塊。
(2)OpenSSH
從Ansible 1.3版本開始,Ansible默認(rèn)使用OpenSSH連接實現(xiàn)各服務(wù)器間通信,以支持ControlPersist(持續(xù)管理)。Ansible從0.5版本起即支持OpenSSH功能,但直到1.3版本開始才將其設(shè)置為默認(rèn)。
多數(shù)本地SSH配置參數(shù),諸如Hosts、公私鑰文件等是默認(rèn)支持的,但如果希望通過非默認(rèn)的22端口運(yùn)行命令等操作,則需要在Inventory文件中配置ansible_ssh_port的值。OpenSSH相比Paramiko更快、更可靠。
(3)加速模式
據(jù)官網(wǎng)介紹:開啟加速模式后Ansible通信速度有質(zhì)的提升,是開啟ControlPersist后的SSH的2~6倍,是Paramiko通信速度的10倍。
盡管加速模式對Ad-Hoc命令不友好,但是Playbook通過加速模式會收到更高的性能。加速模式拋棄SSH多次連接的方式,通過SSH初始化后,帶著AES key的初始化連接信息通過特定的端口(默認(rèn)5099,但可配置)執(zhí)行命令傳輸文件。使用加速模式唯一需要的額外包是python-keyczar,如此一來,幾乎所有的常規(guī)模塊OpenSSH/Paramiko均工作在加速模式,但如下使用sudo的情況例外:
1)sudoers文件需要關(guān)閉其中的requiretty功能,注釋掉或者設(shè)置每個用戶的默認(rèn)值為username ! requiretty。sudoers的man文檔說明如下。
requiretty If set, sudo will only run when the user is logged in to a real tty. When this flag is set, sudo can only be run from a login session and not via other means such as cron(8) or cgi-bin scripts. This flag is off by default.
2)開啟加速模塊必須事先設(shè)置sudo文件NOPASSWD配置,禁用sudo后的PASSWORD交互認(rèn)證過程。加速模式相對OpenSSH可以提供2~4倍的性能提升(尤其對于文件傳輸功能),在Playbook的應(yīng)用中可以通過增加配置開關(guān)來實現(xiàn)。
--- - hosts: all accelerate: true accelerate_port: 5099 [...]
其中的端口也可以在ansible.cfg中單獨(dú)配置。
[accelerate] accelerate_port = 5099
加速模式是現(xiàn)在已經(jīng)被廢棄的Fireball模式的進(jìn)化版,類似于Ansible加速通信方式,但需控制機(jī)事先安裝ZeroMQ服務(wù)(這與Ansible簡單、無依賴、無Daemon的理念是相違背的),并且一點(diǎn)也不支持sudo操作。
(4)Faster OpenSSH in Ansible 1.5+
Ansible 1.5+版本中的OpenSSH有了非常大的改進(jìn),舊版本中實現(xiàn)方式是復(fù)制文件至遠(yuǎn)程服務(wù)器后運(yùn)行,然后刪除這些臨時文件,而新版本的替代方案是通過OpenSSH發(fā)送執(zhí)行命令,將所有操作附帶在SSH連接過程中同步實現(xiàn)。該方式只在Ansible 1.5+版本有效,且需在/etc/ansible/ansible.cfg的[ssh_connection]區(qū)域開啟pipelining=True功能。
關(guān)于加速模式我們還需要關(guān)注如下內(nèi)容:
?pipelining=True需結(jié)合sudo的requiretty配置方可生效,請確保/etc/sudoers的Defaults requiretty為注釋狀態(tài)。絕大多數(shù)現(xiàn)有流行系統(tǒng)默認(rèn)開啟該選項。
?在Mac OSX、Ubuntu、Windows的Cygwin或其他流行OS最好選擇5.6以上的OpenSSH版本,這些版本對ControlPersist有更友好的支持。
?如Ansible運(yùn)行的主機(jī)系統(tǒng)是RHEL或CentOS,然而希望升級當(dāng)前OpenSSH到最新版本以支持Faster/Persistent連接模式,可以通過yum update openssh升級最新版本。
本節(jié)內(nèi)容可以通過如圖1-1所示的Ansible通信方式發(fā)展史魚骨圖來概括,從最開始的Paramiko,后來初步演變?yōu)镺penSSH,加速模式官方推薦Pipelining方式。

圖1-3 Ansible通信方式發(fā)展史
在了解Ansible通信原理及發(fā)展史后,我們進(jìn)一步學(xué)習(xí)Ansible自身的發(fā)展史。要知道,在Chef、Puppet、SaltStack、Fabric等自動化工具群雄爭霸的市場背景下,Ansible依然能夠殺出重圍,在GitHub取得如此驚人成就,并且被紅帽官方收購,其發(fā)展史不得不讓人刮目相看。
1.6 Ansible應(yīng)用場景
Ansible底層基于Python,以簡單著稱,配置文件格式也以INI和YAML為主,與其他管理工具相比,學(xué)習(xí)成本較低,學(xué)習(xí)曲線也很平滑,無論是基礎(chǔ)運(yùn)維人員還是資深運(yùn)維工程師都可以較快上手,稍加練習(xí)便可以熟練掌握。如果具備Dev基礎(chǔ),熟悉Python、PHP等主流語言,基于Ansible開放API接口做二次開發(fā),可以靈活有效地發(fā)揮其價值。Ansible自身也包括非常豐富的內(nèi)置模塊,從Windows系統(tǒng)到開源Linux系統(tǒng),從文件同步到命令執(zhí)行,從軟件的安全升級到配置的維護(hù)變更,從商業(yè)硬件A10、F5到公(私)有云AWS、Digital、VMware、Docker等,幾乎囊括了運(yùn)維日常所有的技術(shù)應(yīng)用。系統(tǒng)下所有的操作可從運(yùn)維操作角度劃分為兩類。
?文件傳輸:文件的本地傳輸和異地傳輸,所有文件的空間形態(tài)、時間形態(tài)變化均構(gòu)成文件傳輸類操作。
?命令執(zhí)行:終端所有操作對系統(tǒng)來講都是指令的組成,最終轉(zhuǎn)換為基礎(chǔ)硬件可接受的電信號完成任務(wù)集。對運(yùn)維操作的用戶行為來講,除文件傳輸以外的其他操作均可稱為命令執(zhí)行。
從自動化工作類型角度歸類如下。
(1)應(yīng)用部署
現(xiàn)今的應(yīng)用功能越來越強(qiáng)大,同步應(yīng)用部署過程的依賴和規(guī)則也日趨復(fù)雜,但對應(yīng)用運(yùn)維的要求沒有隨之降低,有效快速正確平滑的應(yīng)用部署需求日趨強(qiáng)烈。Ansible內(nèi)置網(wǎng)絡(luò)、應(yīng)用、系統(tǒng)、第三方云平臺擴(kuò)展等完善的功能模塊,協(xié)助運(yùn)維快速完成應(yīng)用的安裝、卸載、升級、啟停、配置等部署類工作,即使對跨平臺或知名的商業(yè)硬件也同樣支持。
(2)配置管理
配置管理(Configuration Management, CM)是通過技術(shù)或行政手段對軟件產(chǎn)品及其開發(fā)過程和生命周期進(jìn)行控制、規(guī)范的一系列措施。配置管理的目標(biāo)是記錄軟件產(chǎn)品的演化過程,確保軟件開發(fā)者在軟件生命周期中各個階段都能得到精確的產(chǎn)品配置。在日益復(fù)雜的IT環(huán)境和用戶需求下,Ansible內(nèi)置File、Template,結(jié)合Jinja、Lineinfile等內(nèi)置模塊,同時無縫結(jié)合GitHub、GitLab、Git、SVN、Jenkins等主流版本控制和CI持續(xù)集成工具,助力配置管理自動化。
(3)任務(wù)流編排
有效保證Tasks任務(wù)流按既定規(guī)則和順序完成事先制訂的目標(biāo)和計劃,同時Roles編排方式又能在一定程度上從書寫習(xí)慣和代碼層編排上保證整體項目的可架構(gòu)性和規(guī)范性,協(xié)助控制項目維護(hù)成本不致過高。
如上場景適用于網(wǎng)絡(luò)管理員、系統(tǒng)運(yùn)維、應(yīng)用運(yùn)維、桌面運(yùn)維、DevOps、基礎(chǔ)架構(gòu)運(yùn)維等多領(lǐng)域運(yùn)維行業(yè),以及無運(yùn)維崗但服務(wù)規(guī)模又需有一定精力投入維護(hù)的小型公司,開發(fā)人員經(jīng)過簡單的了解即可初步上手。同樣也適用于中大型公司,可以投入人力、精力、財力對Ansible進(jìn)行二次開發(fā),使其更加適用。
1.7 Ansible的安裝部署
了解完Ansible是什么、通信原理及發(fā)展史、Ansible發(fā)展歷程及其應(yīng)用場景后,接下來為大家介紹Ansible的安裝部署。
Ansible的安裝部署非常簡單,其僅依賴于Python和SSH,而系統(tǒng)默認(rèn)均已安裝。除Windows外,RedHat、Debian、CentOS、OSX 均可作為管理節(jié)點(diǎn)部署Ansible。Ansible被RedHat紅帽
官方收購后,其安裝源被收錄在EPEL中,如已安裝EPEL可直接YUM或APT安裝,通過pip和easy_install的Python第三方包管理器也可以便捷安裝Ansible,下面我們詳細(xì)介紹部署方式。
1.7.1 PIP方式
Ansible底層也是基于Python編寫,所以可以通過PIP方式安裝Ansible。
步驟1:安裝python-pip及python-devel程序包。
// 安裝python-pip程序包及python-devel, yum install python-pip python-devel -y
返回類似如下結(jié)果則表示安裝成功:
Installing : python-devel-2.7.5-34.el7.x86_64 1/2 Installing : python-pip-7.1.0-1.el7.noarch 2/2 Verifying : python-pip-7.1.0-1.el7.noarch 1/2 Verifying : python-devel-2.7.5-34.el7.x86_64 2/2 Installed: python-devel.x86_64 0:2.7.5-34.el7 python-pip.noarch 0:7.1.0-1.el7 Complete!
步驟2:安裝Ansible服務(wù)。
// 安裝請前確保服務(wù)器的gcc、glibc開發(fā)環(huán)境均已安裝,系統(tǒng)幾乎所有的軟件包編譯環(huán)境均基于gcc,如 不確認(rèn)可先執(zhí)行如下命令: yum install gcc glibc-devel zlib-devel rpm-build openssl-devel -y //升級本地PIP至最新版本 pip install --upgrade pip //安裝Ansible服務(wù) pip install ansible -upgrade
執(zhí)行命令ansible --version,有類似如下返回結(jié)果則表示Ansible安裝成功并可正常使用。
ansible 2.1.1.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides
如下其他驗證安裝是否成功的方式也一樣,均可執(zhí)行ansible--version驗證,后面不一一列出。
1.7.2 YUM方式
YUM(Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟件包管理器。基于RPM包管理,能夠從指定的服務(wù)器自動下載RPM包并且安裝,可以自動處理依賴性關(guān)系,并且一次安裝所有依賴的軟件包,無需煩瑣地一次次下載、安裝。YUM安裝Ansible過程如下:
//需事先安裝EPEl【注:EPEL:EPEL(Extra Packages for Enterprise Linux,企業(yè)版Linux的額外軟件包)是Fedora小組維護(hù)的一個軟件倉庫項目,為RHEL/CentOS提供它們默認(rèn)不提供的軟件包。】 源后方可找到并安裝Ansible rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm // 安裝Ansible yum install ansible -y
安裝速度視網(wǎng)絡(luò)情況而定,因為安裝過程會安裝非常多的依賴包,又因各系統(tǒng)環(huán)境的差異性,如返回類似如下結(jié)果則表示安裝成功:
Installed: ansible.noarch 0:2.1.1.0-1.el7 Dependency Installed: PyYAML.x86_64 0:3.10-11.el7 libtomcrypt.x86_64 0:1.17-23.el7 libtommath.x86_64 0:0.42.0-4.el7 python-babel.noarch 0:0.9.6-8.el7 python-httplib2.noarch 0:0.7.7-3.el7 python-jinja2.noarch 0:2.7.2-2.el7 python-keyczar.noarch 0:0.71c-2.el7 python-markupsafe.x86_64 0:0.11-10.el7 python-pyasn1.noarch 0:0.1.6-2.el7 python2-crypto.x86_64 0:2.6.1-9.el7 python2-ecdsa.noarch 0:0.13-4.el7 python2-paramiko.noarch 0:1.16.1-1.el7 sshpass.x86_64 0:1.05-5.el7 Complete!
1.7.3 Apt-get方式
Apt-get全稱是Advanced Package Tool,是一款適用于UNIX和Linux系統(tǒng)的應(yīng)用程序管理器,適用于Ubuntu、Debian等deb包管理式的操作系統(tǒng),主要用于自動地從互聯(lián)網(wǎng)的軟件倉庫中搜索、安裝、升級、卸載軟件或操作系統(tǒng)。
// 添加Ansible源 apt-add-repository -y ppa:ansible/ansible // 升級庫文件 apt-get update // 安裝Ansible apt-get install -y ansible
1.7.4 源碼安裝方式
源碼安裝本身就是一道很高的門檻,作為剛接觸Linux的新手不建議使用該方式。
在什么情況下我們需要從源代碼安裝軟件呢?其實源碼安裝是相對于二進(jìn)制安裝而言的,所謂的二進(jìn)制安裝即前言講到的,PIP、YUM、Apt-get都是二進(jìn)制的安裝方式,一般當(dāng)新軟件推出了新的版本,而所用的發(fā)行版并沒有及時跟進(jìn),這時候,想要“嘗鮮”的話,就非得靠自己而不可使用源碼編譯安裝;另一種情形是,不管是軟件的開發(fā)者還是現(xiàn)用的系統(tǒng)都沒有提供可直接使用的二進(jìn)制包,而自己又非要使用該軟件,那么也需源碼安裝才行。當(dāng)然,還有其他的情形。總而言之,學(xué)會源碼安裝軟件方式是一項非常重要的技能,但又因其編譯環(huán)境準(zhǔn)備起來復(fù)雜不堪,同時安裝過程又需人工逐一解決安裝過程中可能遇到的各項應(yīng)用層依賴和系統(tǒng)庫依賴,所以門檻較高,故不建議初學(xué)者使用該方式。
// 不建議安裝Beta版 //安裝Git【注:Git:Git是一款免費(fèi)、開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項目。Git可以有效、高速地處理從很小到非常大的項目版本管理。Git是Linus Torvalds為了幫助管理Linux內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件。】 客戶端 yum install git -y
整個安裝過程無報錯,有類似如下返回結(jié)果則表示安裝成功。
Installed: git.x86_64 0:1.8.3.1-5.el7 Dependency Installed: libgnome-keyring.x86_64 0:3.8.0-3.el7 perl-Error.noarch 1:0.17020-2.el7 perl-Git.noarch 0:1.8.3.1-5.el7 perl-TermReadKey.x86_64 0:2.30-20.el7 Complete!
安裝Ansible軟件包。
// 使用Git將拉取指定的Ansible版本至本地當(dāng)前目錄 git clone git://github.com/ansible/ansible.git -recursive // 切換至程序包目錄 cd ./ansible // 執(zhí)行env-setup腳本,安裝Ansible軟件包 source ./hacking/env-setup
1.7.5 驗證安裝結(jié)果
如上列舉了互聯(lián)網(wǎng)主流系統(tǒng)的Ansible安裝方式,如整個過程均無報錯,則執(zhí)行如下命令應(yīng)有類似結(jié)果返回:
ansible --version ansible 1.9.6
如上述命令能正常執(zhí)行,表示Ansible安裝成功,并可正常使用。通常情況下,Ansible的安裝簡單順利,但確實會有安裝報錯的情況發(fā)生,多數(shù)情況是由本地復(fù)雜的系統(tǒng)環(huán)境導(dǎo)致的。下面我們?yōu)榇蠹医榻BPython多環(huán)境管理,來解決該類問題。
1.8 Python多環(huán)境擴(kuò)展管理
眾所周知,Python發(fā)展至今,版本眾多,部分版本功能差異較大,在使用過程中經(jīng)常遇到第三方庫依賴的Python版本和系統(tǒng)Python版本不一致的情況。同時又因系統(tǒng)底層需調(diào)用當(dāng)前版本Python,所以不能隨意變更當(dāng)前系統(tǒng)Python版本。如此情景下就會有Python多版本共存的情況。于是,Python多環(huán)境管理工具應(yīng)運(yùn)而生。這里為大家介紹兩款工具,分別是Pyenv和Virtualenv。Pyenv和Virtualenv均為Python管理工具,不同的是,前者是對Python的版本進(jìn)行管理,實現(xiàn)不同版本間的切換和使用;而后者則通過創(chuàng)建虛擬環(huán)境,實現(xiàn)與系統(tǒng)環(huán)境以及其他Python環(huán)境的隔離,避免相互干擾。
1.8.1 Pyenv的部署與使用
Pyenv是一個簡單的Python版本管理工具,以前叫作Pythonbrew。它讓你能夠方便地切換全局Python版本,安裝多個不同的Python版本,設(shè)置獨(dú)立的某個文件夾或者工程目錄特異的Python版本,同時創(chuàng)建Python虛擬環(huán)境(virualenv's)。所有這些操作均可以在類UNIX系統(tǒng)的機(jī)器上(Linux和OS X)不需要依賴Python本身執(zhí)行,而且它工作在用戶層,不需要任何sudo操作。
(1)部署
Pyenv作為Python的版本管理工具,通過改變Shell的環(huán)境變量來切換不同的Python版本,以達(dá)到多版本共存的目的。該工具不支持Windows系統(tǒng)。具體工作原理如下。
1)Pyenv安裝后會在系統(tǒng)PATH中插入shims路徑,每次執(zhí)行Python相關(guān)的可執(zhí)行文件時,會優(yōu)先在shims里尋找Python路徑~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin;
2)系統(tǒng)選擇Python版本,依如下順序選擇Python的版本:
?Shell變量設(shè)置(執(zhí)行pyenv shell查看)
?當(dāng)前可執(zhí)行文件目錄下的.python_version文件里的版本號(執(zhí)行pyenv shell查看)
?上層目錄查詢找到的第一個.pyenv-version文件
?全局的版本號在~/.pyenv/version文件內(nèi)(執(zhí)行pyenv global查看)
3)確定版本文件的位置和Python版本后,Pyenv會根據(jù)版本號在~/.pyenv/versions/文件夾中查找對應(yīng)的Python版本。執(zhí)行命令pyenv versions可查看系統(tǒng)目前安裝的Python版本。
接下來開始部署Pyenv,具體部署方式如下:
//clone pyenv至家目錄 git clone git://github.com/yyuu/pyenv.git ~/.pyenv // 修改環(huán)境變量 echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc //重啟當(dāng)前 Shell exec $Shell -l
執(zhí)行pyenv versions命令,有類似如下返回結(jié)果表示安裝正常:
* system (set by /home/o2o/.pyenv/version) 2.7.8
接下來我們來了解Pyenv的使用方式。
(2)通過Pyenv管理多Python版本
Pyenv命令使用規(guī)則如下:
Usage: pyenv <command> [<args>]
我們通過Pyenv安裝Python 3.4.1版本來熟悉其用法。
// 查看可安裝的版本列表 pyenv install -list // 安裝指定的Python版本 pyenv install 3.4.1 // 切換當(dāng)前目錄Python版本為3.4.1 pyenv local 3.4.1 // 切換全局目錄Python版本為3.4.1 pyenv global 3.4.1 // 刷新shims pyenv rehash
Pyenv更多用法如下:
commands 列出pyenv的所有可用命令 local 設(shè)置或列出當(dāng)前環(huán)境下Python版本號 global 設(shè)置或列出全局環(huán)境下Python版本號 shell 設(shè)置或列出Shell環(huán)境下Python版本 install 安裝指定的Python版本 uninstall 卸載指定的Python版本 rehash 重新加載Pyenv的shims路徑(安裝完P(guān)ython版本后需執(zhí)行該命令) version 展示當(dāng)前Python版本號及其生效的路徑 versions 列出Pyenv管控的所有可用Python版本 which 列出要使用命令的絕對路徑 whence 列出后綴命令的所有可用版本
至此,Pyenv介紹完畢,接下來再介紹一款Python多管理工具Virtualenv,它不是通過多版本管理的方式來實現(xiàn)系統(tǒng)同時兼容多Python環(huán)境。Virtualenv是底層基于Python開發(fā)的Python環(huán)境隔離工具,其通過虛擬目錄的方式來實現(xiàn)多環(huán)境的并存。其工作原理很簡單:在你所需的地方創(chuàng)建工作目錄,該目錄類似系統(tǒng)安裝的Python目錄,保留完整的Python環(huán)境、解釋器、標(biāo)準(zhǔn)庫和第三方庫等,當(dāng)我們需要時,切換環(huán)境變量激活即可使用。接下來我們進(jìn)一步學(xué)習(xí)Virtualenv的安裝部署及版本管理。
1.8.2 Virtualenv的部署與使用
Python的第三方包成千上萬,在一個Python環(huán)境下開發(fā)時間越久、安裝依賴越多,就越容易出現(xiàn)依賴包沖突的問題。為了解決這個問題,開發(fā)者們開發(fā)出了Virtualenv,它可以搭建虛擬且獨(dú)立的Python環(huán)境。這樣就可以使每個項目環(huán)境與其他項目獨(dú)立開來,保持環(huán)境的干凈,避免包沖突問題。另外,在開發(fā)Python應(yīng)用程序的時候,所有第三方的包都會被PIP安裝到系統(tǒng)Python版本的site-packages目錄下。但如果我們要同時開發(fā)多個應(yīng)用程序,那這些應(yīng)用程序會共用一個Python,這意味著所有的包都安裝在系統(tǒng)的Python目錄下,這不僅影響我們的正常開發(fā)工作,還有可能因為隨意變更系統(tǒng)Python版本信息而造成系統(tǒng)的不穩(wěn)定。這種情況下,每個應(yīng)用可能需要各自擁有一套“獨(dú)立”的Python運(yùn)行環(huán)境。Virtualenv就是用來為一個應(yīng)用創(chuàng)建一套“隔離”的Python運(yùn)行環(huán)境的。下面我們來看看Virtualevn的部署,以及它如何管理Python環(huán)境。
(1)部署
假設(shè)你已經(jīng)學(xué)習(xí)過我們上節(jié)內(nèi)容并安裝好PIP了,那么Virtualenv的安裝非常簡單,操作如下:
// 安裝virtualenv pip install virtualenv
返回如下結(jié)果表示安裝成功:
Installing collected packages: virtualenv Successfully installed virtualenv-15.0.3
(2)通過Virtualenv管理多Python版本
需強(qiáng)調(diào)說明的是:Virtualenv不是通過多版本管理的方式來實現(xiàn)系統(tǒng)同時兼容多Python環(huán)境的,而是其通過在工作目錄中虛擬完整的Python環(huán)境來實現(xiàn)Python多環(huán)境并存。接下來我們看Virtualenv的使用方式。
Virtualenv命令的使用格式如下:
virtualenv [OPTIONS] DEST_DIR
中括號OPTIONS表示參數(shù)選項,是可選項,即可有可無;DEST_DIR表示命令要執(zhí)行的目錄,如:
// 創(chuàng)建/data/magedu/的虛擬目錄 virtualenv /data/magedu/
可用的OPTIONS選項如下:
--version 顯示當(dāng)前版本號。 -h, --help 顯示幫助信息。 -v, --verbose 顯示詳細(xì)信息。 -q, --quiet 不顯示詳細(xì)信息。 -p PYTHON_EXE, --python=PYTHON_EXE 指定所用的python解析器的版本,比如--python=python2.5 就使用2.5版本的解析器創(chuàng)建新的隔離環(huán)境。默認(rèn)使用的是當(dāng)前系統(tǒng)安裝(/usr/bin/python)的python解 析器。 --clear 清空非root用戶的安裝,并從頭開始創(chuàng)建隔離環(huán)境。 --no-site-packages 令隔離環(huán)境不能訪問系統(tǒng)全局的site-packages目錄。 --system-site-packages 令隔離環(huán)境可以訪問系統(tǒng)全局的site-packages目錄。 --unzip-setuptools 安裝時解壓Setuptools或Distribute。 --relocatable 重定位某個已存在的隔離環(huán)境。使用該選項將修正腳本,并令所有.pth文件使用相應(yīng) 路徑。 --distribute 使用Distribute代替Setuptools,也可設(shè)置環(huán)境變量VIRTUALENV_DISTRIBUTE 達(dá)到同樣效果。 --extra-search-dir=SEARCH_DIRS 用于查找setuptools/distribute/pip發(fā)布包的目錄。可 以添加任意數(shù)量的-extra-search-dir路徑。 --never-download 禁止從網(wǎng)上下載任何數(shù)據(jù)。此時,如果在本地搜索發(fā)布包失敗,virtualenv就會 報錯。 --prompt==PROMPT 定義隔離環(huán)境的命令行前綴。
下面詳細(xì)看看virtualenv在工作中的應(yīng)用方式。我們先創(chuàng)建一個/data/datafile/software/virtualpy/的虛擬工作目錄,而后再切換至虛擬環(huán)境。
// 創(chuàng)建虛擬工作目錄 virtualenv /data/datafile/software/virtualpy/ // 通過source加載環(huán)境變量,使本地環(huán)境切換至虛擬工作目錄 source /data/datafile/software/virtualpy/bin/activate
看到如圖1-4所示的Virtualenv虛擬工作目錄標(biāo)識,表示已切換至虛擬工作目錄。

圖1-4 Virtualenv虛擬工作目錄
退出虛擬環(huán)境命令如下:
// 退出虛擬環(huán)境 Deactivate
看到如圖1-5所示的退出虛擬工作目錄顯示正常的BASH Shell提示符,表示即已退出虛擬工作目錄。

圖1-5 退出虛擬工作目錄
至此,多版本Python環(huán)境管理工具Pyenv和Virtualenv介紹完畢。如果基于系統(tǒng)默認(rèn)Python版本安裝有問題,可嘗試基于Pyenv或Virtualenv切換Python版本后,再次重試1.7節(jié)Ansible的安裝步驟。
1.9 本章小結(jié)
Ansible是運(yùn)維自動化工具的后起之秀。本章前半部分我們學(xué)習(xí)了Ansible是什么,底層通信發(fā)展史,Ansible發(fā)展歷程等概念性知識。后半部分我們詳細(xì)介紹了Ansible安裝部署方式,同時考慮本地復(fù)雜環(huán)境可能導(dǎo)致的部署問題,本章后半部分我們也引申介紹了Python多環(huán)境擴(kuò)展管理,以方便大家應(yīng)對部署過程中可能出現(xiàn)的各類問題。當(dāng)然,Ansible的部署總體非常簡單,一般出問題多數(shù)是因為系統(tǒng)的glibc、gcc等開發(fā)環(huán)境沒有安裝或不完整導(dǎo)致。在學(xué)習(xí)過程中還請嚴(yán)格參考本章安裝操作步驟循序漸進(jìn),相信大家學(xué)完本章也有所體會。
- 樂學(xué)Windows操作系統(tǒng)
- 鴻蒙生態(tài):開啟萬物互聯(lián)的智慧新時代
- 精解Windows 8
- Ubuntu Linux操作系統(tǒng)
- Mastering KVM Virtualization
- Windows Phone 7.5 Data Cookbook
- Implementing Azure DevOps Solutions
- Joomla! 3 Template Essentials
- 突破平面3ds Max動畫設(shè)計與制作
- Distributed Computing with Go
- 分布式高可用架構(gòu)之道
- UI設(shè)計手繪表現(xiàn)從入門到精通
- Angular權(quán)威教程
- Docker容器技術(shù)與運(yùn)維
- Linux系統(tǒng)編程