新聞中心
了解 Ansible 的功能,這是一個(gè)無(wú)代理的、可擴(kuò)展的配置管理系統(tǒng)。

網(wǎng)絡(luò)自動(dòng)化
隨著 IT 行業(yè)的技術(shù)變化,從服務(wù)器虛擬化到公有云和私有云,以及自服務(wù)能力、容器化應(yīng)用、平臺(tái)即服務(wù)(PaaS)交付,而一直以來(lái)落后的一個(gè)領(lǐng)域就是網(wǎng)絡(luò)。
在過(guò)去的五年多,網(wǎng)絡(luò)行業(yè)似乎有很多新的趨勢(shì)出現(xiàn),它們中的很多被歸入到軟件定義網(wǎng)絡(luò)software-defined networking(SDN)。
注意:
SDN 是新出現(xiàn)的一種構(gòu)建、管理、操作和部署網(wǎng)絡(luò)的方法。SDN 最初的定義是出于將控制層和數(shù)據(jù)層(包轉(zhuǎn)發(fā))物理分離的需要,并且,解耦合的控制層必須管理好各自的設(shè)備。
如今,在 SDN 旗下已經(jīng)有許多技術(shù),包括基于控制器的網(wǎng)絡(luò)controller-based networks、網(wǎng)絡(luò)設(shè)備 API、網(wǎng)絡(luò)自動(dòng)化、白盒交換機(jī)whitebox switche、策略網(wǎng)絡(luò)化、網(wǎng)絡(luò)功能虛擬化Network Functions Virtualization(NFV)等等。
出于這篇報(bào)告的目的,我們參考 SDN 的解決方案作為我們的解決方案,其中包括一個(gè)網(wǎng)絡(luò)控制器作為解決方案的一部分,并且提升了該網(wǎng)絡(luò)的可管理性,但并不需要從數(shù)據(jù)層解耦控制層。
這些趨勢(shì)的之一是,網(wǎng)絡(luò)設(shè)備的 API 作為管理和操作這些設(shè)備的一種方法而出現(xiàn),真正地提供了機(jī)器對(duì)機(jī)器的通訊。當(dāng)需要自動(dòng)化和構(gòu)建網(wǎng)絡(luò)應(yīng)用時(shí) API 簡(jiǎn)化了開(kāi)發(fā)過(guò)程,在數(shù)據(jù)如何建模時(shí)提供了更多結(jié)構(gòu)。例如,當(dāng)啟用 API 的設(shè)備以 JSON/XML 返回?cái)?shù)據(jù)時(shí),它是結(jié)構(gòu)化的,并且比返回原生文本信息 —— 需要手工去解析的僅支持命令行的設(shè)備更易于使用。
在 API 之前,用于配置和管理網(wǎng)絡(luò)設(shè)備的兩個(gè)主要機(jī)制是命令行接口(CLI)和簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)。讓我們來(lái)了解一下它們,CLI 是一個(gè)設(shè)備的人機(jī)界面,而 SNMP 并不是為設(shè)備提供的實(shí)時(shí)編程接口。
幸運(yùn)的是,因?yàn)楹芏喙?yīng)商爭(zhēng)相為設(shè)備增加 API,有時(shí)候 只是因?yàn)?/em> 它被放到需求建議書(RFP)中,這就帶來(lái)了一個(gè)非常好的副作用 —— 支持網(wǎng)絡(luò)自動(dòng)化。當(dāng)真正的 API 發(fā)布時(shí),訪問(wèn)設(shè)備內(nèi)數(shù)據(jù)的過(guò)程,以及管理配置,就會(huì)被極大簡(jiǎn)化,因此,我們將在本報(bào)告中對(duì)此進(jìn)行評(píng)估。雖然使用許多傳統(tǒng)方法也可以實(shí)現(xiàn)自動(dòng)化,比如,CLI/SNMP。
注意:
隨著未來(lái)幾個(gè)月或幾年(LCTT 譯注:本文發(fā)表于 2016 年)的網(wǎng)絡(luò)設(shè)備更新,供應(yīng)商的 API 無(wú)疑應(yīng)該被做為采購(gòu)網(wǎng)絡(luò)設(shè)備(虛擬和物理)的關(guān)鍵決策標(biāo)準(zhǔn)而測(cè)試和使用。如果供應(yīng)商提供一些庫(kù)或集成到自動(dòng)化工具中,或者如果被用于一個(gè)開(kāi)放的標(biāo)準(zhǔn)或協(xié)議,用戶應(yīng)該知道數(shù)據(jù)是如何通過(guò)設(shè)備建模的,API 使用的傳輸類型是什么。
總而言之,網(wǎng)絡(luò)自動(dòng)化,像大多數(shù)類型的自動(dòng)化一樣,是為了更快地工作。工作的更快是好事,減少部署和配置改變的時(shí)間并不總是許多 IT 組織需要去解決的問(wèn)題。
包括速度在內(nèi),我們現(xiàn)在看看這些各種類型的 IT 組織逐漸采用網(wǎng)絡(luò)自動(dòng)化的幾種原因。你應(yīng)該注意到,同樣的原則也適用于其它類型的自動(dòng)化。
簡(jiǎn)化架構(gòu)
今天,每個(gè)網(wǎng)絡(luò)都是一片獨(dú)特的“雪花”,并且,網(wǎng)絡(luò)工程師們?yōu)槟軌蛲ㄟ^(guò)一次性的網(wǎng)絡(luò)改變來(lái)解決傳輸和應(yīng)用問(wèn)題而感到自豪,而這最終導(dǎo)致網(wǎng)絡(luò)不僅難以維護(hù)和管理,而且也很難去實(shí)現(xiàn)自動(dòng)化。
網(wǎng)絡(luò)自動(dòng)化和管理需要從一開(kāi)始就包含到新的架構(gòu)和設(shè)計(jì)中去部署,而不是作為一個(gè)二級(jí)或三級(jí)項(xiàng)目。哪個(gè)特性可以跨不同的供應(yīng)商工作?哪個(gè)擴(kuò)展可以跨不同的平臺(tái)工作?當(dāng)使用具體的網(wǎng)絡(luò)設(shè)備平臺(tái)時(shí),API 類型或者自動(dòng)化工程是什么?當(dāng)這些問(wèn)題在設(shè)計(jì)過(guò)程之前得到答案,最終的架構(gòu)將變成簡(jiǎn)單的、可重復(fù)的、并且易于維護(hù) 和 自動(dòng)化的,在整個(gè)網(wǎng)絡(luò)中將很少啟用供應(yīng)商專用的擴(kuò)展。
確定的結(jié)果
在一個(gè)企業(yè)組織中,改變審查會(huì)議change review meeting會(huì)評(píng)估面臨的網(wǎng)絡(luò)變化、它們對(duì)外部系統(tǒng)的影響、以及回滾計(jì)劃。在人們通過(guò) CLI 來(lái)執(zhí)行這些 面臨的變化 的世界上,輸入錯(cuò)誤的命令造成的影響是災(zāi)難性的。想像一下,一個(gè)有 3 位、4 位、5位,或者 50 位工程師的團(tuán)隊(duì)。每位工程師應(yīng)對(duì) 面臨的變化 都有他們自己的獨(dú)特的方法。并且,在管理這些變化的期間,一個(gè)人使用 CLI 或者 GUI 的能力并不會(huì)消除和減少出現(xiàn)錯(cuò)誤的機(jī)率。
使用經(jīng)過(guò)驗(yàn)證的和測(cè)試過(guò)的網(wǎng)絡(luò)自動(dòng)化可以幫助實(shí)現(xiàn)更多的可預(yù)測(cè)行為,并且使執(zhí)行團(tuán)隊(duì)更有可能實(shí)現(xiàn)確實(shí)性的結(jié)果,首次在保證任務(wù)沒(méi)有人為錯(cuò)誤的情況下正確完成的道路上更進(jìn)一步。
業(yè)務(wù)靈活性
不用說(shuō),網(wǎng)絡(luò)自動(dòng)化不僅為部署變化提供了速度和靈活性,而且使得根據(jù)業(yè)務(wù)需要去從網(wǎng)絡(luò)設(shè)備中檢索數(shù)據(jù)的速度變得更快。自從服務(wù)器虛擬化到來(lái)以后,服務(wù)器和虛擬化使得管理員有能力在瞬間去部署一個(gè)新的應(yīng)用程序。而且,隨著應(yīng)用程序可以更快地部署,隨之浮現(xiàn)的問(wèn)題是為什么還需要花費(fèi)如此長(zhǎng)的時(shí)間配置一個(gè) VLAN(虛擬局域網(wǎng))、路由器、FW ACL(防火墻的訪問(wèn)控制列表)或者負(fù)載均衡策略呢?
通過(guò)了解在一個(gè)組織內(nèi)最常見(jiàn)的工作流和 為什么 真正需要改變網(wǎng)絡(luò),部署如 Ansible 這樣的現(xiàn)代的自動(dòng)化工具將使這些變得非常簡(jiǎn)單。
這一章介紹了一些關(guān)于為什么應(yīng)該去考慮網(wǎng)絡(luò)自動(dòng)化的高級(jí)知識(shí)點(diǎn)。在下一節(jié),我們將帶你去了解 Ansible 是什么,并且繼續(xù)深入了解各種不同規(guī)模的 IT 組織的網(wǎng)絡(luò)自動(dòng)化的不同類型。
什么是 Ansible?
Ansible 是存在于開(kāi)源世界里的一種最新的 IT 自動(dòng)化和配置管理平臺(tái)。它經(jīng)常被拿來(lái)與其它工具如 Puppet、Chef 和 SaltStack 去比較。Ansible 作為一個(gè)由 Michael DeHaan 創(chuàng)建的開(kāi)源項(xiàng)目出現(xiàn)于 2012 年,Michael DeHaan 也創(chuàng)建了 Cobbler 和 cocreated Func,它們?cè)陂_(kāi)源社區(qū)都非常流行。在 Ansible 開(kāi)源項(xiàng)目創(chuàng)建之后不足 18 個(gè)月時(shí)間, Ansilbe 公司成立,并收到了六百萬(wàn)美金 A 輪投資。該公司成為 Ansible 開(kāi)源項(xiàng)目排名第一的貢獻(xiàn)者和支持者,并一直保持著。在 2015 年 10 月,Red Hat 收購(gòu)了 Ansible 公司。
但是,Ansible 到底是什么?
Ansible 是一個(gè)無(wú)需代理和可擴(kuò)展的超級(jí)簡(jiǎn)單的自動(dòng)化平臺(tái)。
讓我們更深入地了解它的細(xì)節(jié),并且看一看那些使 Ansible 在行業(yè)內(nèi)獲得廣泛認(rèn)可的屬性。
簡(jiǎn)單
Ansible 的其中一個(gè)吸引人的屬性是,使用它你 不 需要特定的編程技能。所有的指令,或者說(shuō)任務(wù)都是自動(dòng)化的,以一個(gè)標(biāo)準(zhǔn)的、任何人都可以理解的人類可讀的數(shù)據(jù)格式的文檔化。在 30 分鐘之內(nèi)完成安裝和自動(dòng)化任務(wù)的情況并不罕見(jiàn)!
例如,下列來(lái)自一個(gè) Ansible 劇本playbook的任務(wù)用于去確保在一個(gè) VLAN 存在于一個(gè) Cisco Nexus 交換機(jī)中:
- nxos_vlan: vlan_id=100 name=web_vlan
你無(wú)需熟悉或?qū)懭魏未a就可以明確地看出它將要做什么!
注意:
這個(gè)報(bào)告的下半部分涉到 Ansible 術(shù)語(yǔ)(劇本playbook、劇集play、任務(wù)task、模塊module等等)的細(xì)節(jié)。在我們使用 Ansible 進(jìn)行網(wǎng)絡(luò)自動(dòng)化時(shí),提及這些關(guān)鍵概念時(shí)我們會(huì)有一些簡(jiǎn)短的示例。
無(wú)代理
如果你看過(guò)市面上的其它工具,比如 Puppet 和 Chef,你會(huì)發(fā)現(xiàn),一般情況下,它們要求每個(gè)實(shí)現(xiàn)自動(dòng)化的設(shè)備必須安裝特定的軟件。這種情況在 Ansible 上 并不需要,這就是為什么 Ansible 是實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化的最佳選擇的主要原因。
這很好理解,那些 IT 自動(dòng)化工具,包括 Puppet、Chef、CFEngine、SaltStack、和 Ansible,它們最初構(gòu)建是為管理和自動(dòng)化配置 Linux 主機(jī),以跟得上部署的應(yīng)用程序增長(zhǎng)的步伐。因?yàn)?Linux 系統(tǒng)是被配置成自動(dòng)化的,要安裝代理并不是一個(gè)技術(shù)難題。如果有的話,它也只會(huì)延誤安裝過(guò)程,因?yàn)?,現(xiàn)在有 N 多個(gè)(你希望去實(shí)現(xiàn)自動(dòng)化的)主機(jī)需要在它們上面部署軟件。
再加上,當(dāng)使用代理時(shí),它們需要的 DNS 和 NTP 配置更加復(fù)雜。這些都是大多數(shù)環(huán)境中已經(jīng)配置好的服務(wù),但是,當(dāng)你希望快速地獲取一些東西或者只是簡(jiǎn)單地想去測(cè)試一下它能做什么的時(shí)候,它將極大地耽誤整個(gè)設(shè)置和安裝的過(guò)程。
由于本報(bào)告只是為介紹利用 Ansible 實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化,我們希望指出,Ansible 作為一個(gè)無(wú)代理平臺(tái),對(duì)于網(wǎng)絡(luò)管理員來(lái)說(shuō),其比對(duì)系統(tǒng)管理員更具有吸引力。這是為什么呢?
正如前面所說(shuō)的那樣,對(duì)網(wǎng)絡(luò)管理員來(lái)說(shuō),它是非常有吸引力的,Linux 操作系統(tǒng)是開(kāi)源的,并且,任何東西都可以安裝在它上面。對(duì)于網(wǎng)絡(luò)來(lái)說(shuō),卻并非如此,雖然它正在逐漸改變。如果我們更廣泛地部署網(wǎng)絡(luò)操作系統(tǒng),如 Cisco IOS,它就是這樣的一個(gè)例子,并且問(wèn)一個(gè)問(wèn)題, “第三方軟件能否部署在基于 IOS (LCTT 譯注:此處的 IOS,指的是思科的網(wǎng)絡(luò)操作系統(tǒng) IOS)的平臺(tái)上嗎?”毫無(wú)疑問(wèn),它的回答是 NO。
在過(guò)去的二十多年里,幾乎所有的網(wǎng)絡(luò)操作系統(tǒng)都是閉源的,并且,垂直整合到底層的網(wǎng)絡(luò)硬件中。沒(méi)有供應(yīng)商的支持,在一個(gè)網(wǎng)絡(luò)設(shè)備中(路由器、交換機(jī)、負(fù)載均衡、防火墻、等等)載入一個(gè)代理并不那么輕松。有一個(gè)像 Ansible 這樣的自動(dòng)化平臺(tái),從頭開(kāi)始去構(gòu)建一個(gè)無(wú)代理、可擴(kuò)展的自動(dòng)化平臺(tái),就像是它專門為網(wǎng)絡(luò)行業(yè)訂制的一樣。我們最終將開(kāi)始減少并消除與網(wǎng)絡(luò)的人工交互。
可擴(kuò)展
Ansible 的可擴(kuò)展性也非常的好。從開(kāi)源、代碼開(kāi)始在網(wǎng)絡(luò)行業(yè)中發(fā)揮重要的作用時(shí)起,有一個(gè)可擴(kuò)展的平臺(tái)是必需的。這意味著如果供應(yīng)商或社區(qū)不提供一個(gè)特定的特性或功能,開(kāi)源社區(qū)、終端用戶、消費(fèi)者、顧問(wèn),或者任何的人能夠 擴(kuò)展 Ansible 來(lái)啟用一個(gè)給定的功能集。過(guò)去,網(wǎng)絡(luò)供應(yīng)商或者工具供應(yīng)商通過(guò)一個(gè) hook 去提供新的插件和集成。想像一下,使用一個(gè)像 Ansible 這樣的自動(dòng)化平臺(tái),并且,你選擇的網(wǎng)絡(luò)供應(yīng)商發(fā)布了你 真正 需要的一個(gè)自動(dòng)化的新特性。從理論上說(shuō),網(wǎng)絡(luò)供應(yīng)商或者 Ansible 可以發(fā)行一個(gè)新的插件去實(shí)現(xiàn)自動(dòng)化這個(gè)獨(dú)特的特性,這是一件非常好的事情,從你的內(nèi)部工程師到你的增值分銷商(VAR)或者你的顧問(wèn)中的任何一個(gè)人,都可以去提供這種集成。
正如前面所說(shuō)的那樣,Ansible 實(shí)際上是極具擴(kuò)展性的,Ansible 最初就是為自動(dòng)化應(yīng)用程序和系統(tǒng)構(gòu)建的。這是因?yàn)?,Ansible 的可擴(kuò)展性來(lái)自于其集成性是為網(wǎng)絡(luò)供應(yīng)商編寫的,包括但不限于 Cisco、Arista、Juniper、F5、HP、A10、Cumulus 和 Palo Alto Networks。
對(duì)于網(wǎng)絡(luò)自動(dòng)化,為什么要使用 Ansible?
我們已經(jīng)簡(jiǎn)單了解除了 Ansible 是什么,以及一些網(wǎng)絡(luò)自動(dòng)化的好處,但是,對(duì)于網(wǎng)絡(luò)自動(dòng)化,我們?yōu)槭裁匆褂?Ansible?
大家很清楚,使得 Ansible 成為如此偉大的一個(gè)自動(dòng)化應(yīng)用部署平臺(tái)的許多原因已經(jīng)被大家所提及了。但是,我們現(xiàn)在要深入一些,更多地關(guān)注于網(wǎng)絡(luò),并且繼續(xù)總結(jié)一些更需要注意的其它關(guān)鍵點(diǎn)。
無(wú)代理
在實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化的時(shí)候,無(wú)代理架構(gòu)的重要性并不是重點(diǎn)強(qiáng)調(diào)的,特別是當(dāng)它適用于現(xiàn)有的自動(dòng)化設(shè)備時(shí)。如果,我們看一下當(dāng)前網(wǎng)絡(luò)中已經(jīng)安裝的各種設(shè)備時(shí),從 DMZ 和園區(qū),到分支機(jī)構(gòu)和數(shù)據(jù)中心,最大份額的設(shè)備 并不 具有最新 API 的設(shè)備。從自動(dòng)化的角度來(lái)看,API 可以使做一些事情變得很簡(jiǎn)單,像 Ansible 這樣的無(wú)代理平臺(tái)有可能去自動(dòng)化和管理那些 老舊(傳統(tǒng)) 的設(shè)備。例如,基于 CLI 的設(shè)備,它的工具可以被用于任何網(wǎng)絡(luò)環(huán)境中。
注意:
如果僅支持 CLI 的設(shè)備已經(jīng)集成進(jìn) Ansible,它的機(jī)制就像是,怎么在設(shè)備上通過(guò)協(xié)議如 telnet、SSH 和 SNMP 去進(jìn)行只讀訪問(wèn)和讀寫操作。
作為一個(gè)獨(dú)立的網(wǎng)絡(luò)設(shè)備,像路由器、交換機(jī)、和防火墻正在持續(xù)去增加 API 的支持,SDN 解決方案也正在出現(xiàn)。SDN 解決方案的其中一個(gè)常見(jiàn)主題是,它們都提供一個(gè)單點(diǎn)集成和策略管理,通常是以一個(gè) SDN 控制器的形式出現(xiàn)。這對(duì)于 Cisco ACI、VMware NSX、Big Switch Big Cloud Fabric 和 Juniper Contrail,以及其它的 SDN 提供者,比如 Nuage、Plexxi、Plumgrid、Midokura 和 Viptela,是一個(gè)真實(shí)的解決方案。這甚至包含開(kāi)源的控制器,比如 OpenDaylight。
所有的這些解決方案都簡(jiǎn)化了網(wǎng)絡(luò)管理,就像它們可以讓一個(gè)管理員開(kāi)始從“box-by-box”管理(LCTT 譯者注:指的是單個(gè)設(shè)備挨個(gè)去操作的意思)遷移到網(wǎng)絡(luò)范圍的管理。這是在正確方向上邁出的很大的一步,這些解決方案并不能消除在變更期間中人類犯錯(cuò)的機(jī)率。例如,比起配置 N 個(gè)交換機(jī),你可能需要去配置一個(gè)單個(gè)的 GUI,它需要很長(zhǎng)的時(shí)間才能實(shí)現(xiàn)所需要的配置改變 —— 它甚至可能更復(fù)雜,畢竟,相對(duì)于一個(gè) CLI,他們更喜歡 GUI!另外,你可能有不同類型的 SDN 解決方案部署在每個(gè)應(yīng)用程序、網(wǎng)絡(luò)、區(qū)域或者數(shù)據(jù)中心。
在需要自動(dòng)化的網(wǎng)絡(luò)中,對(duì)于配置管理、監(jiān)視和數(shù)據(jù)收集,當(dāng)行業(yè)開(kāi)始向基于控制器的網(wǎng)絡(luò)架構(gòu)中遷移時(shí),這些需求并不會(huì)消失。
大量的軟件定義網(wǎng)絡(luò)中都部署有控制器,幾乎所有的控制器都提供expose一個(gè)最新的 REST API。并且,因?yàn)?Ansible 是一個(gè)無(wú)代理架構(gòu),它實(shí)現(xiàn)自動(dòng)化是非常簡(jiǎn)單的,而不僅僅是對(duì)那些沒(méi)有 API 的傳統(tǒng)設(shè)備,但也有通過(guò) REST API 的軟件定義網(wǎng)絡(luò)解決方案,在所有的終端上不需要有額外的軟件(LCTT 譯注:指的是代理)。最終的結(jié)果是,使用 Ansible,無(wú)論有或沒(méi)有 API,可以使任何類型的設(shè)備都能夠自動(dòng)化。
自由開(kāi)源軟件(FOSS)
Ansible 是一個(gè)開(kāi)源軟件,它的全部代碼在 GitHub 上都是公開(kāi)可訪問(wèn)的,使用 Ansible 是完全免費(fèi)的。它可以在幾分鐘內(nèi)完成安裝并為網(wǎng)絡(luò)工程師提供有用的價(jià)值。Ansible 這個(gè)開(kāi)源項(xiàng)目,或者 Ansible 公司,在它們交付軟件之前,你不會(huì)遇到任何一個(gè)銷售代表。那是顯而易見(jiàn)的事實(shí),因?yàn)樗且粋€(gè)真正的開(kāi)源項(xiàng)目,但是,作為開(kāi)源的、社區(qū)驅(qū)動(dòng)的軟件項(xiàng)目在網(wǎng)絡(luò)行業(yè)中的使用是非常少的,但是,也在逐漸增加,我們想明確指出這一點(diǎn)。
同樣需要指出的一點(diǎn)是,Ansible, Inc. 也是一個(gè)公司,它也需要去賺錢,對(duì)嗎?雖然 Ansible 是開(kāi)源的,它也有一個(gè)叫 Ansible Tower 的企業(yè)產(chǎn)品,它增加了一些特性,比如,基于規(guī)則的訪問(wèn)控制(RBAC)、報(bào)告、 web UI、REST API、多租戶等等,(相比 Ansible)它更適合于企業(yè)去部署。并且,更重要的是,Ansible Tower 甚至可以最多在 10 臺(tái)設(shè)備上 免費(fèi) 使用,至少,你可以去體驗(yàn)一下,它是否會(huì)為你的組織帶來(lái)好處,而無(wú)需花費(fèi)一分錢,并且,也不需要與無(wú)數(shù)的銷售代表去打交道。
可擴(kuò)展性
我們?cè)谇懊嬲f(shuō)過(guò),Ansible 主要是為部署 Linux 應(yīng)用程序而構(gòu)建的自動(dòng)化平臺(tái),雖然從早期開(kāi)始已經(jīng)擴(kuò)展到 Windows。需要指出的是,Ansible 開(kāi)源項(xiàng)目并沒(méi)有“自動(dòng)化網(wǎng)絡(luò)基礎(chǔ)設(shè)施”的目標(biāo)。事實(shí)上是,Ansible 社區(qū)更明白如何在底層的 Ansible 架構(gòu)上更具靈活性和可擴(kuò)展性,對(duì)于他們的自動(dòng)化需要(包括網(wǎng)絡(luò))更容易成為一個(gè) 擴(kuò)展 的 Ansible。在過(guò)去的兩年中,部署有許多的 Ansible 集成,許多是有行業(yè)獨(dú)立人士進(jìn)行的,比如,Matt Oswalt、Jason Edelman、Kirk Byers、Elisa Jasinska、David Barroso、Michael Ben-Ami、Patrick Ogenstad 和 Gabriele Gerbino,也有網(wǎng)絡(luò)系統(tǒng)供應(yīng)商的領(lǐng)導(dǎo)者,比如,Arista、Juniper、Cumulus、Cisco、F5、和 Palo Alto Networks。
集成到已存在的 DevOps 工作流中
Ansible 在 IT 組織中被用于應(yīng)用程序部署。它被用于需要管理部署、監(jiān)視和管理各種類型的應(yīng)用程序的運(yùn)維團(tuán)隊(duì)中。通過(guò)將 Ansible 集成到網(wǎng)絡(luò)基礎(chǔ)設(shè)施中,當(dāng)新應(yīng)用程序到來(lái)或遷移后,它擴(kuò)展了可能的范圍。而不是去等待一個(gè)新的頂架交換機(jī)(LCTT 譯注:TOR,一種數(shù)據(jù)中心設(shè)備接入的方式)的到來(lái)、去添加一個(gè) VLAN、或者去檢查接口的速度/雙工,所有的這些以網(wǎng)絡(luò)為中心的任務(wù)都可以被自動(dòng)化,并且可以集成到 IT 組織內(nèi)已經(jīng)存在的工作流中。
冪等性
術(shù)語(yǔ)冪等性idempotency (讀作 item-potency)經(jīng)常用于軟件開(kāi)發(fā)的領(lǐng)域中,尤其是當(dāng)使用 REST API 工作的時(shí)候,以及在 DevOps 自動(dòng)化和配置管理框架的領(lǐng)域中,包括 Ansible。Ansible 的其中一個(gè)信念是,所有的 Ansible 模塊(集成的)應(yīng)該是冪等的。那么,對(duì)于一個(gè)模塊來(lái)說(shuō),冪等是什么意思呢?畢竟,對(duì)大多數(shù)網(wǎng)絡(luò)工程師來(lái)說(shuō),這是一個(gè)新的術(shù)語(yǔ)。
答案很簡(jiǎn)單。冪等性的本質(zhì)是允許定義的任務(wù),運(yùn)行一次或者上千次都不會(huì)在目標(biāo)系統(tǒng)上產(chǎn)生不利影響,僅僅是一種一次性的改變。換句話說(shuō),如果有一個(gè)要做的改變?nèi)ナ瓜到y(tǒng)進(jìn)入到它期望的狀態(tài),這種改變完成之后,并且,如果這個(gè)設(shè)備已經(jīng)達(dá)到這種狀態(tài),就不會(huì)再發(fā)生改變。這不像大多數(shù)傳統(tǒng)的定制腳本和拷貝、黏貼到那些終端窗口中的 CLI 命令。當(dāng)相同的命令或者腳本在同一個(gè)系統(tǒng)上重復(fù)運(yùn)行,(有時(shí)候)會(huì)出現(xiàn)錯(cuò)誤。即使是粘貼一組命令到一個(gè)路由器中,也可能會(huì)遇到一些使你的其余的配置失效的錯(cuò)誤。好玩吧?
另外的例子是,如果你有一個(gè)配置 10 個(gè) VLAN 的文件文件或者腳本,那么 每次 運(yùn)行這個(gè)腳本,相同的命令命令會(huì)被輸入 10 次。如果使用一個(gè)冪等的 Ansible 模塊,首先會(huì)從網(wǎng)絡(luò)設(shè)備中采集已存在的配置,并且,每個(gè)新的 VLAN 被配置后會(huì)再次檢查當(dāng)前配置。僅僅當(dāng)這個(gè)新的 VLAN 需要被添加(或者,比如說(shuō)改變 VLAN 名字)是一個(gè)變更,命令才會(huì)真實(shí)地推送到設(shè)備。
當(dāng)一個(gè)技術(shù)越來(lái)越復(fù)雜,冪等性的價(jià)值就越高,在你修改的時(shí)候,你并不能注意到 已存在 的網(wǎng)絡(luò)設(shè)備的狀態(tài),而僅僅是從一個(gè)網(wǎng)絡(luò)配置和策略角度去嘗試達(dá)到 期望的 狀態(tài)。
網(wǎng)絡(luò)范圍的和臨時(shí)(Ad Hoc)的改變
用配置管理工具解決的其中一個(gè)問(wèn)題是,配置“飄移”(當(dāng)設(shè)備的期望配置逐漸漂移,或者改變,隨著時(shí)間的推移,手動(dòng)改變和/或在一個(gè)環(huán)境中使用了多個(gè)不同的工具),事實(shí)上,這也是像 Puppet 和 Chef 所使用的地方。代理商電聯(lián)phone home到前端服務(wù)器,驗(yàn)證它的配置,并且,如果需要變更,則改變它。這個(gè)方法是非常簡(jiǎn)單的。如果有故障了,需要去排除怎么辦?你通常需要跳過(guò)管理系統(tǒng),直接連到設(shè)備,找到并修復(fù)它,然后,馬上離開(kāi),對(duì)不對(duì)?果然,在下次當(dāng)代理電連回來(lái),這個(gè)修復(fù)問(wèn)題的改變被覆蓋了(基于主/前端服務(wù)器是怎么配置的)。在高度自動(dòng)化的環(huán)境中,一次性的改變應(yīng)該被限制,但是,仍然允許使用它們(LCTT 譯注:指的是一次性改變)的工具是非常有價(jià)值的。正如你想到的,其中一個(gè)這樣的工具是 Ansible。
因?yàn)?Ansible 是無(wú)代理的,這里并沒(méi)有一個(gè)默認(rèn)的推送或者拉取去防止配置漂移。自動(dòng)化任務(wù)被定義在 Ansible 缺省運(yùn)行一次的劇本對(duì)網(wǎng)絡(luò)工程師是很具有吸引力的,讓人欣慰的是,在設(shè)備上手動(dòng)進(jìn)行的改變不會(huì)自動(dòng)被覆蓋。另外,當(dāng)需要的時(shí)候,一個(gè)劇本所運(yùn)行的設(shè)備范圍很容易被改變,即使是對(duì)一個(gè)單個(gè)設(shè)備進(jìn)行自動(dòng)化的單次變更,Ansible 仍然可以用,設(shè)備的 范圍 由一個(gè)被稱為 Ansible 清單inventory的文件決定;這個(gè)清單可以是一臺(tái)設(shè)備或者是一千臺(tái)設(shè)備。 下面展示的一個(gè)清單文件示例,它定義了兩組共六臺(tái)設(shè)備: 為了自動(dòng)化所有的主機(jī),你的劇本中的劇集play定義的一個(gè)片段看起來(lái)應(yīng)該是這樣的: 并且,要只自動(dòng)化一個(gè)葉子節(jié)點(diǎn)交換機(jī),它看起來(lái)應(yīng)該像這樣: 這是一個(gè)核心交換機(jī): 注意 正如前面所說(shuō)的那樣,這個(gè)報(bào)告的后面部分將詳細(xì)介紹劇本、劇集、和清單。 因?yàn)槟軌蚝苋菀椎貙?duì)一臺(tái)設(shè)備或者 N 臺(tái)設(shè)備進(jìn)行自動(dòng)化,所以在需要對(duì)這些設(shè)備進(jìn)行一次性變更時(shí),Ansible 成為了最佳的選擇。在網(wǎng)絡(luò)范圍內(nèi)的變更它也做的很好:可以是關(guān)閉給定類型的所有接口、配置接口描述、或者是在一個(gè)跨企業(yè)園區(qū)布線的網(wǎng)絡(luò)中添加 VLAN。 這個(gè)報(bào)告從兩個(gè)方面逐漸深入地講解一些技術(shù)。第一個(gè)方面是圍繞 Ansible 架構(gòu)和它的細(xì)節(jié),第二個(gè)方面是,從一個(gè)網(wǎng)絡(luò)的角度,講解使用 Ansible 可以完成什么類型的自動(dòng)化。在這一章中我們將帶你去詳細(xì)了解第二方面的內(nèi)容。 自動(dòng)化一般被認(rèn)為是速度快,但是,考慮到一些任務(wù)并不要求速度,這就是為什么一些 IT 團(tuán)隊(duì)沒(méi)有認(rèn)識(shí)到自動(dòng)化的價(jià)值所在。VLAN 配置是一個(gè)非常好的例子,因?yàn)?,你可能?huì)想,“創(chuàng)建一個(gè) VLAN 到底有多快?一般情況下每天添加多少個(gè) VLAN?我真的需要自動(dòng)化嗎?” 在這一節(jié)中,我們專注于另外幾種有意義的自動(dòng)化任務(wù),比如,設(shè)備準(zhǔn)備、數(shù)據(jù)收集、報(bào)告和遵從情況。但是,需要注意的是,正如我們前面所說(shuō)的,自動(dòng)化為你、你的團(tuán)隊(duì)、以及你的精確的更可預(yù)測(cè)的結(jié)果和更多的確定性,提供了更快的速度和敏捷性。 為網(wǎng)絡(luò)自動(dòng)化開(kāi)始使用 Ansible 的最容易也是最快的方法是,為設(shè)備的最初投入使用創(chuàng)建設(shè)備配置文件,并且將配置文件推送到網(wǎng)絡(luò)設(shè)備中。 如果我們?nèi)ネ瓿蛇@個(gè)過(guò)程,它將分解為兩步,第一步是創(chuàng)建一個(gè)配置文件,第二步是推送這個(gè)配置到設(shè)備中。 首先,我們需要去從供應(yīng)商配置文件的底層專用語(yǔ)法(CLI)中解耦 輸入。這意味著我們需要對(duì)配置參數(shù)中分離出文件和值,比如,VLAN、域信息、接口、路由、和其它的內(nèi)容等等,然后,當(dāng)然是一個(gè)配置的模塊文件。在這個(gè)示例中,這里有一個(gè)標(biāo)準(zhǔn)模板,它可以用于所有設(shè)備的初始部署。Ansible 將幫助提供配置模板中需要的輸入和值之間的部分。幾秒鐘之內(nèi),Ansible 可以生成數(shù)百個(gè)可靠的和可預(yù)測(cè)的配置文件。 讓我們快速的看一個(gè)示例,它使用當(dāng)前的配置,并且分解它到一個(gè)模板和單獨(dú)的一個(gè)(作為一個(gè)輸入源的)變量文件中。 這是一個(gè)配置文件片斷的示例: 如果我們提取輸入值,這個(gè)文件將被轉(zhuǎn)換成一個(gè)模板。 注意: Ansible 使用基于 Python 的 Jinja2 模板化語(yǔ)言,因此,這個(gè)被命名為 leaf.j2 的文件是一個(gè) Jinja2 模板。 注意,下列的示例中,雙大括號(hào)( 模板看起來(lái)像這些,并且給它命名為 因?yàn)殡p大括號(hào)代表變量,并且,我們看到這些值并不在模板中,所以它們需要將值保存在一個(gè)地方。值被保存在一個(gè)變量文件中。正如前面所說(shuō)的,一個(gè)相應(yīng)的變量文件看起來(lái)應(yīng)該是這樣的: 這意味著,如果管理 VLAN 的團(tuán)隊(duì)希望在網(wǎng)絡(luò)設(shè)備中添加一個(gè) VLAN,很簡(jiǎn)單,他們只需要在變量文件中改變它,然后,使用 Ansible 中一個(gè)叫 一旦配置文件生成,它需要去 推送 到網(wǎng)絡(luò)設(shè)備。推送配置文件到網(wǎng)絡(luò)設(shè)備使用一個(gè)叫做 接下來(lái)的示例是一個(gè) 構(gòu)建并推送 一個(gè)配置文件到網(wǎng)絡(luò)設(shè)備的簡(jiǎn)單劇本。同樣地,該劇本使用一個(gè)名叫 雖然沒(méi)有詳細(xì)解釋示例中的每一行,但是,你仍然可以看明白它們實(shí)際上做了什么。 注意: 下面的劇本介紹了新的概念,比如,內(nèi)置變量 這個(gè)兩步的過(guò)程是一個(gè)使用 Ansible 進(jìn)行網(wǎng)絡(luò)自動(dòng)化入門的簡(jiǎn)單方法。通過(guò)模板簡(jiǎn)化了你的配置,構(gòu)建配置文件,然后,推送它們到網(wǎng)絡(luò)設(shè)備 — 因此,被稱為 注意: 像這樣的更詳細(xì)的例子,請(qǐng)查看 Ansible 網(wǎng)絡(luò)集成。 監(jiān)視工具一般使用 SNMP —— 這些工具拉取某些管理信息庫(kù)(MIB),然后給監(jiān)視工具返回?cái)?shù)據(jù)?;诜祷氐臄?shù)據(jù),它可能多于也可能少于你真正所需要的數(shù)據(jù)。如果接口基于返回的數(shù)據(jù)統(tǒng)計(jì)你正在拉取的內(nèi)容,你可能會(huì)返回在 由于 Ansible 是完全開(kāi)源并且是可擴(kuò)展的,它可以精確地去收集和監(jiān)視所需要的計(jì)數(shù)器或者值。這可能需要一些預(yù)先的定制工作,但是,最終這些工作是非常有價(jià)值的。因?yàn)椴杉臄?shù)據(jù)是你所需要的,而不是供應(yīng)商提供給你的。Ansible 也提供了執(zhí)行某些條件任務(wù)的直觀方法,這意味著基于正在返回的數(shù)據(jù),你可以執(zhí)行子任務(wù),它可以收集更多的數(shù)據(jù)或者產(chǎn)生一個(gè)配置改變。 網(wǎng)絡(luò)設(shè)備有 許多 統(tǒng)計(jì)和隱藏在里面的臨時(shí)數(shù)據(jù),而 Ansible 可以幫你提取它們。 你甚至可以在 Ansible 中使用前面提到的 SNMP 的模塊,模塊的名字叫 運(yùn)行前面的任務(wù)返回非常多的關(guān)于設(shè)備的信息,并且添加一些級(jí)別的發(fā)現(xiàn)能力到 Ansible中。例如,那個(gè)任務(wù)返回下列的數(shù)據(jù): 你現(xiàn)在可以決定某些事情,而不需要事先知道是什么類型的設(shè)備。你所需要知道的僅僅是設(shè)備的只讀通訊字符串。 從一個(gè)平臺(tái)遷移到另外一個(gè)平臺(tái),可能是從同一個(gè)供應(yīng)商或者是從不同的供應(yīng)商,遷移從來(lái)都不是件容易的事。供應(yīng)商可能提供一個(gè)腳本或者一個(gè)工具去幫助你遷移。Ansible 可以被用于去為所有類型的網(wǎng)絡(luò)設(shè)備構(gòu)建配置模板,然后,操作系統(tǒng)用這個(gè)方法去為所有的供應(yīng)商生成一個(gè)配置文件,然后作為一個(gè)(通用數(shù)據(jù)模型的)輸入設(shè)置。當(dāng)然,如果有供應(yīng)商專用的擴(kuò)展,它也是會(huì)被用到的。這種靈活性不僅對(duì)遷移有幫助,而且也可以用于災(zāi)難恢復(fù)disaster recovery(DR),它在生產(chǎn)系統(tǒng)中不同的交換機(jī)型號(hào)之間和災(zāi)備數(shù)據(jù)中心中是經(jīng)常使用的,即使是在不同的供應(yīng)商的設(shè)備上。 正如前面所說(shuō)的,配置管理是最常用的自動(dòng)化類型。Ansible 可以很容易地做到創(chuàng)建角色role去簡(jiǎn)化基于任務(wù)的自動(dòng)化。從更高的層面來(lái)看,角色是指針對(duì)一個(gè)特定設(shè)備組的可重用的自動(dòng)化任務(wù)的邏輯分組。關(guān)于角色的另一種說(shuō)法是,認(rèn)為角色就是相關(guān)的工作流workflow。首先,在開(kāi)始自動(dòng)化添加值之前,需要理解工作流和過(guò)程。不論是開(kāi)始一個(gè)小的自動(dòng)化任務(wù)還是擴(kuò)展它,理解工作流和過(guò)程都是非常重要的。 例如,一組自動(dòng)化地配置路由器和交換機(jī)的任務(wù)是非常常見(jiàn)的,并且它們也是一個(gè)很好的起點(diǎn)。但是,配置在哪臺(tái)網(wǎng)絡(luò)設(shè)備上?配置的 IP 地址是什么?或許需要一個(gè) IP 地址管理方案?一旦用一個(gè)給定的功能分配了 IP 地址并且已經(jīng)部署,DNS 也更新了嗎?DHCP 的范圍需要?jiǎng)?chuàng)建嗎? 你可以看到工作流是怎么從一個(gè)小的任務(wù)開(kāi)始,然后逐漸擴(kuò)展到跨不同的 IT 系統(tǒng)?因?yàn)楣ぷ髁鞒掷m(xù)擴(kuò)展,所以,角色也一樣(持續(xù)擴(kuò)展)。 和其它形式的自動(dòng)化工具一樣,用任何形式的自動(dòng)化工具產(chǎn)生配置改變都被視為風(fēng)險(xiǎn)。手工去產(chǎn)生改變可能看上去風(fēng)險(xiǎn)更大,正如你看到的和親身經(jīng)歷過(guò)的那樣,Ansible 有能力去做自動(dòng)數(shù)據(jù)收集、監(jiān)視、和配置構(gòu)建,這些都是“只讀的”和“低風(fēng)險(xiǎn)”的動(dòng)作。其中一個(gè) 低風(fēng)險(xiǎn) 使用案例是,使用收集的數(shù)據(jù)進(jìn)行配置遵從性檢查和配置驗(yàn)證。部署的配置是否滿足安全要求?是否配置了所需的網(wǎng)絡(luò)?協(xié)議 XYZ 禁用了嗎?因?yàn)槊總€(gè)模塊、或者用 Ansible 返回?cái)?shù)據(jù)的整合,它只是非常簡(jiǎn)單地 聲明 那些事是 TRUE 還是 FALSE。然后接著基于 它 是 TRUE 或者是 FALSE, 接著由你決定應(yīng)該發(fā)生什么 —— 或許它只是被記錄下來(lái),或者,也可能執(zhí)行一個(gè)復(fù)雜操作。 我們現(xiàn)在知道,Ansible 也可以用于去收集數(shù)據(jù)和執(zhí)行遵從性檢查。Ansible 可以根據(jù)你想要做的事情去從設(shè)備中返回和收集數(shù)據(jù)?;蛟S返回的數(shù)據(jù)成為其它的任務(wù)的輸入,或者你想去用它創(chuàng)建一個(gè)報(bào)告。從模板中生成報(bào)告,并將真實(shí)的數(shù)據(jù)插入到模板中,創(chuàng)建和使用報(bào)告模板的過(guò)程與創(chuàng)建配置模板的過(guò)程是相同的。 從一個(gè)報(bào)告的角度看,這些模板或許是純文本文件,就像是在 GitHub 上看到的 markdown 文件、放置在 Web 服務(wù)器上的 HTML 文件,等等。用戶有權(quán)去創(chuàng)建一個(gè)她希望的報(bào)告類型,插入她所需要的真實(shí)數(shù)據(jù)到報(bào)告中。 創(chuàng)建報(bào)告的用處很多,不僅是為行政管理,也為了運(yùn)營(yíng)工程師,因?yàn)樗鼈兺ǔS须p方都需要的不同指標(biāo)。 從一個(gè)網(wǎng)絡(luò)自動(dòng)化的角度理解了 Ansible 能做什么之后,我們現(xiàn)在看一下 Ansible 是怎么工作的。你將學(xué)習(xí)到從一個(gè) Ansible 管理主機(jī)到一個(gè)被自動(dòng)化的節(jié)點(diǎn)的全部通訊流。首先,我們回顧一下,Ansible 是怎么開(kāi)箱即用out of the box的,然后,我們看一下 Ansible 怎么去做到的,具體說(shuō)就是,當(dāng)網(wǎng)絡(luò)設(shè)備自動(dòng)化時(shí),Ansible 模塊是怎么去工作的。 到目前為止,你已經(jīng)明白了,Ansible 是一個(gè)自動(dòng)化平臺(tái)。實(shí)際上,它是一個(gè)安裝在一臺(tái)單個(gè)服務(wù)器上或者企業(yè)中任何一位管理員的筆記本中的輕量級(jí)的自動(dòng)化平臺(tái)。當(dāng)然,(安裝在哪里?)這是由你來(lái)決定的。在基于 Linux 的機(jī)器上,使用一些實(shí)用程序(比如 pip、apt、和 yum)安裝 Ansible 是非常容易的。 注意: 在本報(bào)告的其余部分,安裝 Ansible 的機(jī)器被稱為控制主機(jī)control host。 控制主機(jī)將執(zhí)行定義在 Ansible 的劇本playbook (不用擔(dān)心,稍后我們將講到劇本和其它的 Ansible 術(shù)語(yǔ))中的所有自動(dòng)化任務(wù)?,F(xiàn)在,我們只需要知道,一個(gè)劇本是簡(jiǎn)單的一組自動(dòng)化任務(wù)和在給定數(shù)量的主機(jī)上執(zhí)行的指令。 當(dāng)一個(gè)劇本創(chuàng)建之后,你還需要去定義它要自動(dòng)化的主機(jī)。映射一個(gè)劇本和要自動(dòng)化運(yùn)行的主機(jī),是通過(guò)一個(gè)被稱為 Ansible 清單inventory的文件。這是一個(gè)前面展示的示例,但是,這里是同一個(gè)清單文件的另外兩個(gè)組: 注意: 你也可以在清單文件中使用 IP 地址,而不是主機(jī)名。對(duì)于這樣的示例,主機(jī)名將是通過(guò) DNS 可解析的。 正如你所看到的,Ansible 清單文件是一個(gè)文本文件,它列出了主機(jī)和主機(jī)組。然后,你可以在劇本中引用一個(gè)具體的主機(jī)或者組,以此去決定對(duì)給定的劇集play和劇本在哪臺(tái)主機(jī)上進(jìn)行自動(dòng)化。下面展示了兩個(gè)示例。 展示的第一個(gè)示例它看上去像是,你想去自動(dòng)化 現(xiàn)在,我們已經(jīng)理解了基本的清單文件,我們可以看一下(在控制主機(jī)上的)Ansible 是怎么與 開(kāi)箱即用 的設(shè)備通訊的,和在 Linux 終端上自動(dòng)化的任務(wù)。這里需要明白一個(gè)重要的觀點(diǎn)就是,需要去自動(dòng)化的網(wǎng)絡(luò)設(shè)備通常是不一樣的。(LCTT 譯注:指的是設(shè)備的類型、品牌、型號(hào)等等) Ansible 對(duì)基于 Linux 的系統(tǒng)去開(kāi)箱即用自動(dòng)化工作有兩個(gè)要求。它們是 SSH 和 Python。 首先,終端必須支持 SSH 傳輸,因?yàn)?Ansible 使用 SSH 去連接到每個(gè)目標(biāo)節(jié)點(diǎn)。因?yàn)?Ansible 支持一個(gè)可拔插的連接架構(gòu),也有各種類型的插件去實(shí)現(xiàn)不同類型的 SSH。 第二個(gè)要求是,Ansible 并不要求在目標(biāo)節(jié)點(diǎn)上預(yù)先存在一個(gè) 代理,Ansible 并不要求一個(gè)軟件代理,它僅需要一個(gè)內(nèi)置的 Python 執(zhí)行引擎。這個(gè)執(zhí)行引擎用于去執(zhí)行從 Ansible 管理主機(jī)發(fā)送到被自動(dòng)化的目標(biāo)節(jié)點(diǎn)的 Python 代碼。 如果我們?cè)敿?xì)解釋這個(gè)開(kāi)箱即用工作流,它將分解成如下的步驟: 是不是意味著每個(gè)網(wǎng)絡(luò)設(shè)備都可以被 Ansible 開(kāi)箱即用?因?yàn)樗鼈円捕贾С?SSH,確實(shí),網(wǎng)絡(luò)設(shè)備都支持 SSH,但是,第一個(gè)和第二要求的組合限制了網(wǎng)絡(luò)設(shè)備可能的功能。 剛開(kāi)始時(shí),大多數(shù)網(wǎng)絡(luò)設(shè)備并不支持 Python,因此,使用默認(rèn)的 Ansible 連接機(jī)制是無(wú)法進(jìn)行的。換句話說(shuō),在過(guò)去的幾年里,供應(yīng)商在幾個(gè)不同的設(shè)備平臺(tái)上增加了 Python 支持。但是,這些平臺(tái)中的大多數(shù)仍然缺乏必要的集成,以允許 Ansible 去直接通過(guò) SSH 訪問(wèn)一個(gè) Linux shell,并以適當(dāng)?shù)臋?quán)限去拷貝所需的代碼、創(chuàng)建臨時(shí)目錄和文件、以及在設(shè)備中執(zhí)行代碼。盡管 Ansible 中所有的這些部分都可以在基于 Linux 的網(wǎng)絡(luò)設(shè)備上使用 SSH/Python 在本地運(yùn)行,它仍然需要網(wǎng)絡(luò)設(shè)備供應(yīng)商去更進(jìn)一步開(kāi)放他們的系統(tǒng)。 注意: 值的注意的是,Arista 確實(shí)也提供了原生的集成,因?yàn)樗梢詿o(wú)需 SSH 用戶,直接進(jìn)入到一個(gè) Linux shell 中訪問(wèn) Python 引擎,它可以允許 Ansible 去使用其默認(rèn)連接機(jī)制。因?yàn)槲覀冋{(diào)用了 Arista,我們也需要著重強(qiáng)調(diào)與 Ansible 默認(rèn)連接機(jī)制一起工作的 Cumulus。這是因?yàn)?Cumulus Linux 是原生 Linux,并且它并不需要為 Cumulus Linux 操作系統(tǒng)使用供應(yīng)商 API。 前面的節(jié)講到過(guò) Ansible 默認(rèn)的工作方式。我們看一下,在開(kāi)始一個(gè) 劇集 之后,Ansible 是怎么去設(shè)置一個(gè)到設(shè)備的連接、通過(guò)拷貝 Python 代碼到設(shè)備、運(yùn)行代碼、和返回結(jié)果給 Ansible 控制主機(jī)來(lái)執(zhí)行任務(wù)。 在這一節(jié)中,我們將看一看,當(dāng)使用 Ansible 進(jìn)行自動(dòng)化網(wǎng)絡(luò)設(shè)備時(shí)都做了什么。正如前面講過(guò)的,Ansible 是一個(gè)可拔插的連接架構(gòu)。對(duì)于 大多數(shù) 的網(wǎng)絡(luò)集成, 注意在劇集中是怎么定義的,這個(gè)示例增加 這告訴 Ansible 不要通過(guò) SSH 去連接到目標(biāo)設(shè)備,而是連接到本地機(jī)器運(yùn)行這個(gè)劇本?;旧?,這是把連接職責(zé)委托給劇本中任務(wù)task 節(jié)中使用的真實(shí)的 Ansible 模塊。每個(gè)模塊類型的委托權(quán)利允許這個(gè)模塊在必要時(shí)以各種形式去連接到設(shè)備。這可能是 Juniper 和 HP Comware7 的 NETCONF、Arista 的 eAPI、Cisco Nexus 的 NX-API、或者甚至是基于傳統(tǒng)系統(tǒng)的 SNMP,它們沒(méi)有可編程的 API。 注意: 網(wǎng)絡(luò)集成在 Ansible 中是以 Ansible 模塊的形式帶來(lái)的。盡管我們持續(xù)使用術(shù)語(yǔ)來(lái)吊你的胃口,比如,劇本、劇集、任務(wù)、和講到的關(guān)鍵概念模塊,這些術(shù)語(yǔ)中的每一個(gè)都會(huì)在 Ansible 術(shù)語(yǔ)和入門 和 動(dòng)手實(shí)踐使用 Ansible 去進(jìn)行網(wǎng)絡(luò)自動(dòng)化 中詳細(xì)解釋。 讓我們看一看另外一個(gè)劇本的示例: 你注意到了嗎,這個(gè)劇本現(xiàn)在包含一個(gè)任務(wù),并且這個(gè)任務(wù)使用了 主要區(qū)別之一是使用的默認(rèn)連接機(jī)制,Ansible 啟動(dòng)一個(gè)持久的 SSH 連接到設(shè)備,并且對(duì)于一個(gè)給定的劇集而已該連接將持續(xù)存在。當(dāng)在一個(gè)模塊中發(fā)生連接設(shè)置和拆除時(shí),與許多使用 而在傳統(tǒng)的 Ansible 形式下,每個(gè)網(wǎng)絡(luò)模塊返回 JSON 數(shù)據(jù)。僅有的區(qū)別是相對(duì)于目標(biāo)節(jié)點(diǎn),數(shù)據(jù)的推取發(fā)生在本地的 Ansible 控制主機(jī)上。相對(duì)于每供應(yīng)商per vendor和模塊類型,數(shù)據(jù)返回到劇本,但是作為一個(gè)示例,許多的 Cisco NX-OS 模塊返回已存在的狀態(tài)、建議狀態(tài)、和最終狀態(tài),以及發(fā)送到設(shè)備的命令(如果有的話)。 作為使用 Ansible 進(jìn)行網(wǎng)絡(luò)自動(dòng)化的開(kāi)始,最重要的是,為 Ansible 的連接設(shè)備/拆除過(guò)程,記著去設(shè)置連接參數(shù)為 這一章我們將介紹許多 Ansible 的術(shù)語(yǔ)和報(bào)告中前面部分出現(xiàn)過(guò)的關(guān)鍵概念。比如, 清單文件inventory file、劇本playbook、劇集play、任務(wù)task和模塊module。我們也會(huì)去回顧一些其它的概念,這些術(shù)語(yǔ)和概念對(duì)我們學(xué)習(xí)使用 Ansible 去進(jìn)行網(wǎng)絡(luò)自動(dòng)化非常有幫助。 在這一節(jié)中,我們將引用如下的一個(gè)簡(jiǎn)單的清單文件和劇本的示例,它們將在后面的章節(jié)中持續(xù)出現(xiàn)。 清單示例 :[core-switches]
dc-core-1
dc-core-2
[leaf-switches]
leaf1
leaf2
leaf3
leaf4hosts: allhosts: leaf1hosts: core-switches使用 Ansible 實(shí)現(xiàn)網(wǎng)絡(luò)任務(wù)自動(dòng)化
設(shè)備準(zhǔn)備
hostname leaf1
ip domain-name ntc.com
!
vlan 10
name web
!
vlan 20
name app
!
vlan 30
name db
!
vlan 40
name test
!
vlan 50
name misc{{}}) 代表一個(gè)變量。leaf.j2:!
hostname {{ inventory_hostname }}
ip domain-name {{ domain_name }}
!
!
{% for vlan in vlans %}
vlan {{ vlan.id }}
name {{ vlan.name }}
{% endfor %}
!---
hostname: leaf1
domain_name: ntc.com
vlans:
- { id: 10, name: web }
- { id: 20, name: app }
- { id: 30, name: db }
- { id: 40, name: test }
- { id: 50, name: misc }template 的模塊,去重新生成一個(gè)新的配置文件。這整個(gè)過(guò)程也是冪等的;僅僅是在模板或者值發(fā)生改變時(shí),它才會(huì)去生成一個(gè)新的配置文件。napalm_install_config的開(kāi)源的 Ansible 模塊。template 的模塊去構(gòu)建配置文件,然后使用一個(gè)名叫 napalm_install_config 的模塊去推送它們,并且激活它作為設(shè)備上運(yùn)行的新的配置文件。inventory_hostname。這些概念包含在 Ansible 術(shù)語(yǔ)和入門 中。---
- name: BUILD AND PUSH NETWORK CONFIGURATION FILES
hosts: leaves
connection: local
gather_facts: no
tasks:
- name: BUILD CONFIGS
template:
src=templates/leaf.j2
dest=configs/{{inventory_hostname }}.conf
- name: PUSH CONFIGS
napalm_install_config:
hostname={{ inventory_hostname }}
username={{ un }}
password={{ pwd }}
dev_os={{ os }}
config_file=configs/{{ inventory_hostname }}.conf
commit_changes=1
replace_config=0BUILD 和 PUSH 方法。數(shù)據(jù)收集和監(jiān)視
show interface 命令中顯示的計(jì)數(shù)器。如果你僅需要 interface resets 并且,希望去看到與重置相關(guān)的鄰接 CDP/LLDP 的接口,那該怎么做呢?當(dāng)然,這也可以使用當(dāng)前的技術(shù);可以運(yùn)行多個(gè)顯示命令去手動(dòng)解析輸出信息,或者,使用基于 SNMP 的工具,在 GUI 中切換不同的選項(xiàng)卡(Tab)找到真正你所需要的數(shù)據(jù)。Ansible 怎么能幫助我們?nèi)ネ瓿蛇@些工作呢?snmp_device_version。這是在社區(qū)中存在的另一個(gè)開(kāi)源模塊: - name: GET SNMP DATA
snmp_device_version:
host=spine
community=public
version=2c{"ansible_facts": {"ansible_device_os": "nxos", "ansible_device_vendor": "cisco", "ansible_device_version": "7.0(3)I2(1)"}, "changed": false}遷移
配置管理
遵從性
報(bào)告
Ansible 怎么工作
開(kāi)箱即用
cisco 和 arista:[cisco]
nyc1.acme.com
nyc2.acme.com
[arista]
sfo1.acme.com
sfo2.acme.comcisco 組中所有的主機(jī),而展示的第二個(gè)示例只對(duì) nyc1.acme.com 主機(jī)進(jìn)行自動(dòng)化:---
- name: TEST PLAYBOOK
hosts: cisco
tasks:
- TASKS YOU WANT TO AUTOMATE---
- name: TEST PLAYBOOK
hosts: nyc1.acme.com
tasks:
- TASKS YOU WANT TO AUTOMATE
Ansible 網(wǎng)絡(luò)集成
connection 參數(shù)設(shè)置為 local。在劇本中大多數(shù)的連接類型都設(shè)置為 local,如下面的示例所展示的:---
- name: TEST PLAYBOOK
hosts: cisco
connection: local
tasks:
- TASKS YOU WANT TO AUTOMATEconnection 參數(shù)去和前面節(jié)中的示例進(jìn)行比較。---
- name: TEST PLAYBOOK
hosts: cisco
connection: local
tasks:
- nxos_vlan: vlan_id=10 name=WEB_VLANnxos_vlan 模塊。nxos_vlan 模塊是一個(gè) Python 文件,并且,在這個(gè)文件中它是使用 NX-API 連接到 Cisco 的 NX-OS 設(shè)備??墒?,這個(gè)連接可能是使用其它設(shè)備 API 設(shè)置的,這就是為什么供應(yīng)商和用戶像我們這樣能夠去建立自己的集成的原因。集成(模塊)通常是以每特性per-feature為基礎(chǔ)完成的,雖然,你已經(jīng)看到了像 napalm_install_config 這樣的模塊,它們也可以被用來(lái) 推送 一個(gè)完整的配置文件。connection=local 的網(wǎng)絡(luò)模塊一樣,對(duì)發(fā)生在劇集級(jí)別上的 每個(gè) 任務(wù),Ansible 將登入/登出設(shè)備。local,并且將它留在模塊中。這就是為什么模塊支持不同類型的供應(yīng)商平臺(tái),它將與設(shè)備使用不同的方式進(jìn)行通訊。Ansible 術(shù)語(yǔ)和入門
# sample inventory file
# filename inventory
[all:vars]
user=admin
pwd=admin
[tor]
rack1-tor1 vendor=nxos
rack1-tor2 vendor=nxos
rack2-tor1 vendor=arista
rack2-tor2 vendor=arista
[core]
core1
core2
劇本示例 :
---
# sample playbook
# filename site.yml
- name: PLAY 1 - Top of Rack (TOR) Switches
hosts: tor
connection: local
tasks:
- name: ENSURE VLAN 10 EXISTS ON CISCO TOR SWITCHES
nxos_vlan:
vlan_id=10
name=WEB_VLAN
host={{ inventory_hostname }}
username=admin
password=admin
when: vendor == "nxos"
- name: ENSURE VLAN 10 EXISTS ON ARISTA TOR SWITCHES
eos_vlan:
vlanid=10
name=WEB_VLAN
host={{ inventory_hostname }}
username={{ user }}
password={{ pwd }}
when: vendor == "arista"
- name: PLAY 2 - Core (TOR) Switches
hosts: core
connection: local
tasks:
- name: ENSURE VLANS EXIST IN CORE
nxos_vlan:
vlan_id={{ item }}
host={{ inventory_hostname }}
username={{ user }}
password={{ pwd }}
with_items:
- 10
- 20
- 30
- 40
- 50
清單文件
使用一個(gè)清單文件,比如前面提到的那個(gè),允許我們?nèi)樽詣?dòng)化任務(wù)指定主機(jī)、和使用每個(gè)劇集頂部節(jié)中(如果存在)的參數(shù) hosts 所引用的主機(jī)/組指定的主機(jī)組。
它也可能在一個(gè)清單文件中存儲(chǔ)變量。如這個(gè)示例中展示的那樣。如果變量在同一行視為一臺(tái)主機(jī),它是一個(gè)具體主機(jī)變量。如果變量定義在方括號(hào)中([ ]),比如,[all:vars],它的意思是指變量在組中的范圍 all,它是一個(gè)默認(rèn)組,包含了清單文件中的 所有 主機(jī)。
注意:
清單文件是使用 Ansible 開(kāi)始自動(dòng)化的快速方法,但是,你應(yīng)該已經(jīng)有一個(gè)真實(shí)的網(wǎng)絡(luò)設(shè)備源,比如一個(gè)網(wǎng)絡(luò)管理工具或者 CMDB,它可以去創(chuàng)建和使用一個(gè)動(dòng)態(tài)的清單腳本,而不是一個(gè)靜態(tài)的清單文件。
劇本
劇本是去運(yùn)行自動(dòng)化網(wǎng)絡(luò)設(shè)備的頂級(jí)對(duì)象。在我們的示例中,它是 site.yml 文件,如前面的示例所展示的。一個(gè)劇本使用 YAML 去定義一組自動(dòng)化任務(wù),并且,每個(gè)劇本由一個(gè)或多個(gè)劇集組成。這類似于一個(gè)橄欖球的劇本。就像在橄欖球賽中,團(tuán)隊(duì)有劇集組成的劇本,Ansible 的劇本也是由劇集組成的。
注意:
YAML 是一種被所有編程語(yǔ)言支持的數(shù)據(jù)格式。YAML 本身就是 JSON 的超集,并且,YAML 文件非常易于識(shí)別,因?yàn)樗偸侨齻€(gè)破折號(hào)(連字符)開(kāi)始,比如,---。
劇集
一個(gè) Ansible 劇本可以存在一個(gè)或多個(gè)劇集。在前面的示例中,它在劇本中有兩個(gè)劇集。每個(gè)劇集開(kāi)始的地方都有一個(gè) 頭部,它定義了具體的參數(shù)。
示例中兩個(gè)劇集都定義了下面的參數(shù):
name
文件 PLAY 1 - Top of Rack (TOR) Switches 是任意內(nèi)容的,它在劇本運(yùn)行的時(shí)候,去改善劇本運(yùn)行和報(bào)告期間的可讀性。這是一個(gè)可選參數(shù)。
hosts
正如前面講過(guò)的,這是在特定的劇集中要去進(jìn)行自動(dòng)化的主機(jī)或主機(jī)組。這是一個(gè)必需參數(shù)。
connection
正如前面講過(guò)的,這是劇集連接機(jī)制的類型。這是個(gè)可選參數(shù),但是,對(duì)于網(wǎng)絡(luò)自動(dòng)化劇集,一般設(shè)置為 local。
每個(gè)劇集都是由一個(gè)或多個(gè)任務(wù)組成。
任務(wù)
任務(wù)是以聲明的方式去表示自動(dòng)化的內(nèi)容,而不用擔(dān)心底層的語(yǔ)法或者操作是怎么執(zhí)行的。
在我們的示例中,第一個(gè)劇集有兩個(gè)任務(wù)。每個(gè)任務(wù)確保存在 10 個(gè) VLAN。第一個(gè)任務(wù)是為 Cisco Nexus 設(shè)備的,而第二個(gè)任務(wù)是為 Arista 設(shè)備的:
tasks:
- name: ENSURE VLAN 10 EXISTS ON CISCO TOR SWITCHES
nxos_vlan:
vlan_id=10
name=WEB_VLAN
host={{ inventory_hostname }}
username=admin
password=admin
when: vendor == "nxos"
任務(wù)也可以使用 name 參數(shù),就像劇集一樣。和劇集一樣,文本內(nèi)容是任意的,并且當(dāng)劇本運(yùn)行時(shí)顯示,去改善劇本運(yùn)行和報(bào)告期間的可讀性。它對(duì)每個(gè)任務(wù)都是可選參數(shù)。
示例任務(wù)中的下一行是以 nxos_vlan 開(kāi)始的。它告訴我們這個(gè)任務(wù)將運(yùn)行一個(gè)叫 nxos_vlan 的 Ansible 模塊。
現(xiàn)在,我們將進(jìn)入到模塊中。
模塊
在 Ansible 中理解模塊的概念是至關(guān)重要的。雖然任何編輯語(yǔ)言都可以用來(lái)寫 Ansible 模塊,只要它們能夠返回 JSON 鍵/值對(duì)即可,但是,幾乎所有的模塊都是用 Python 寫的。在我們示例中,我們看到有兩個(gè)模塊被運(yùn)行: nxos_vlan 和 eos_vlan。這兩個(gè)模塊都是 Python 文件;而事實(shí)上,在你不能看到劇本的時(shí)候,真實(shí)的文件名分別是 eos_vlan.py 和 nxos_vlan.py。
讓我們看一下前面的示例中第一個(gè)劇集中的第一個(gè)任務(wù):
- name: ENSURE VLAN 10 EXISTS ON CISCO TOR SWITCHES
nxos_vlan:
vlan_id=10
name=WEB_VLAN
host={{ inventory_hostname }}
username=admin
password=admin
when: vendor == "nxos"
這個(gè)任務(wù)運(yùn)行 nxos_vlan,它是一個(gè)自動(dòng)配置 VLAN 的模塊。為了使用這個(gè)模塊,包含它,你需要為設(shè)備指定期望的狀態(tài)或者配置策略。這個(gè)示例中的狀態(tài)是:VLAN 10 將被配置一個(gè)名字 WEB_VLAN,并且,它將被自動(dòng)配置到每個(gè)交換機(jī)上。我們可以看到,使用 vlan_id 和 name 參數(shù)很容易做到。模塊中還有三個(gè)其它的參數(shù),它們分別是:host、username、和 password:
host
這是將要被自動(dòng)化的主機(jī)名(或者 IP 地址)。因?yàn)?,我們希望去自?dòng)化的設(shè)備已經(jīng)被定義在清單文件中,我們可以使用內(nèi)置的 Ansible 變量 inventory_hostname。這個(gè)變量等價(jià)于清單文件中的內(nèi)容。例如,在第一個(gè)循環(huán)中,在清單文件中的主機(jī)是 rack1-tor1,然后,在第二個(gè)循環(huán)中,它是 rack1-tor2。這些名字是進(jìn)入到模塊的,并且包含在模塊中的,在每個(gè)名字到 IP 地址的解析中,都發(fā)生一個(gè) DNS 查詢。然后與這個(gè)設(shè)備進(jìn)行通訊。
username
用于登入到交換機(jī)的用戶名。
password
用于登入到交換機(jī)的密碼。
示例中最后的片斷部分使用了一個(gè) when 語(yǔ)句。這是在一個(gè)劇集中使用的 Ansible 的執(zhí)行條件任務(wù)。正如我們所了解的,在這個(gè)劇集的 tor 組中有多個(gè)設(shè)備和設(shè)備類型。使用 when 基于任意標(biāo)準(zhǔn)去提供更多的選擇。這里我們僅自動(dòng)化 Cisco 設(shè)備,因?yàn)?,我們?cè)谶@個(gè)任務(wù)中使用了 nxos_vlan 模塊,在下一個(gè)任務(wù)中,我們僅自動(dòng)化 Arista 設(shè)備,因?yàn)椋覀兪褂昧?nbsp;eos_vlan 模塊。
注意:
這并不是區(qū)分設(shè)備的唯一方法。這里僅是演示如何使用 when,并且可以在清單文件中定義變量。
在清單文件中定義變量是一個(gè)很好的開(kāi)端,但是,如果你繼續(xù)使用 Ansible,你將會(huì)為了擴(kuò)展性、版本控制、對(duì)給定文件的改變最小化而去使用基于 YAML 的變量。這也將簡(jiǎn)化和改善清單文件和每個(gè)使用的變量的可讀性。在設(shè)備準(zhǔn)備的構(gòu)建/推送方法中講過(guò)一個(gè)變量文件的示例。
在最后的示例中,關(guān)于任務(wù)有幾點(diǎn)需要去搞清楚:
- 劇集 1 任務(wù) 1 展示了硬編碼了
username和password作為參數(shù)進(jìn)入到具體的模塊中(nxos_vlan)。 - 劇集 1 任務(wù) 1 和 劇集 2 在模塊中使用了變量,而不是硬編碼它們。這掩飾了
username和password參數(shù),但是,需要值得注意的是,(在這個(gè)示例中)這些變量是從清單文件中提取出現(xiàn)的。 - 劇集 1 中為進(jìn)入到模塊中的參數(shù)使用了一個(gè) 水平的 的 key=value 語(yǔ)法,雖然劇集 2 使用了垂直的 key=value 語(yǔ)法。它們都工作的非常好。你也可以使用垂直的 YAML “key: value” 語(yǔ)法。
- 最后的任務(wù)也介紹了在 Ansible 中怎么去使用一個(gè)循環(huán)。它通過(guò)使用
with_items來(lái)完成,并且它類似于一個(gè) for 循環(huán)。那個(gè)特定的任務(wù)是循環(huán)進(jìn)入五個(gè) VLAN 中去確保在交換機(jī)中它們都存在。注意:它也可能被保存在一個(gè)外部的 YAML 變量文件中。還需要注意的一點(diǎn)是,不使用with_items的替代方案是,每個(gè) VLAN 都有一個(gè)任務(wù) —— 如果這樣做,它就失去了彈性!
動(dòng)手實(shí)踐使用 Ansible 去進(jìn)行網(wǎng)絡(luò)自動(dòng)化
在前面的章節(jié)中,提供了 Ansible 術(shù)語(yǔ)的一個(gè)概述。它已經(jīng)覆蓋了大多數(shù)具體的 Ansible 術(shù)語(yǔ),比如劇本、劇集、任務(wù)、模塊和清單文件。這一節(jié)將繼續(xù)提供示例去講解使用 Ansible 實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化,而且將提供在不同類型的設(shè)備中自動(dòng)化工作的模塊的更多細(xì)節(jié)。示例中的將要進(jìn)行自動(dòng)化設(shè)備由多個(gè)供應(yīng)商提供,包括 Cisco、Arista、Cumulus、和 Juniper。
在本節(jié)中的示例,假設(shè)的前提條件如下:
- Ansible 已經(jīng)安裝。
- 在設(shè)備中(NX-API、eAPI、NETCONF)適合的 APIs 已經(jīng)啟用。
- 用戶在系統(tǒng)上有通過(guò) API 去產(chǎn)生改變的適當(dāng)權(quán)限。
- 所有的 Ansible 模塊已經(jīng)在系統(tǒng)中存在,并且也在庫(kù)的路徑變量中。
注意:
可以在 ansible.cfg 文件中設(shè)置模塊和庫(kù)路徑。在你運(yùn)行一個(gè)劇本時(shí),你也可以使用 -M 標(biāo)志從命令行中去改變它。
在本節(jié)中示例使用的清單如下。(刪除了密碼,IP 地址也發(fā)生了變化)。在這個(gè)示例中,(和前面的示例一樣)某些主機(jī)名并不是完全合格域名(FQDN)。
清單文件
[cumulus]
cvx ansible_ssh_host=1.2.3.4 ansible_ssh_pass=PASSWORD
[arista]
veos1
[cisco]
nx1 hostip=5.6.7.8 un=USERNAME pwd=PASSWORD
[juniper]
vsrx hostip=9.10.11.12 un=USERNAME pwd=PASSWORD
注意:
正如你所知道的,Ansible 支持將密碼存儲(chǔ)在一個(gè)加密文件中的功能。如果你想學(xué)習(xí)關(guān)于這個(gè)特性的更多內(nèi)容,請(qǐng)查看在 Ansible 網(wǎng)站上的文檔中的 Ansible Vault 部分。
這個(gè)清單文件有四個(gè)組,每個(gè)組定義了一臺(tái)單個(gè)的主機(jī)。讓我們?cè)敿?xì)回顧一下每一節(jié):
Cumulus
主機(jī) cvx 是一個(gè) Cumulus Linux (CL) 交換機(jī),并且它是 cumulus 組中的唯一設(shè)備。記住,CL 是原生 Linux,因此,這意味著它是使用默認(rèn)連接機(jī)制(SSH)連到到需要自動(dòng)化的 CL 交換機(jī)。因?yàn)?nbsp;cvx 在 DNS 或者 /etc/hosts 文件中沒(méi)有定義,我們將讓 Ansible 知道不要在清單文件中定義主機(jī)名,而是在 ansible_ssh_host 中定義的名字/IP。登陸到 CL 交換機(jī)的用戶名被定義在 playbook 中,但是,你可以看到密碼使用變量 ansible_ssh_pass 定義在清單文件中。
Arista
被稱為 veos1 的是一臺(tái)運(yùn)行 EOS 的 Arista 交換機(jī)。它是在 arista 組中唯一的主機(jī)。正如你在 Arista 中看到的,在清單文件中并沒(méi)有其它的參數(shù)存在。這是因?yàn)?Arista 為它們的設(shè)備使用了一個(gè)特定的配置文件。在我們的示例中它的名字為 .eapi.conf,它存在在 home 目錄中。下面是正確使用配置文件的這個(gè)功能的示例:
[connection:veos1]
host: 2.4.3.4
username: unadmin
password: pwadmin
這個(gè)文件包含了定義在配置文件中的 Ansible 連接到設(shè)備(和 Arista 的被稱為 pyeapi 的 Python 庫(kù))所需要的全部信息。
Cisco
和 Cumulus 和 Arista 一樣,這里僅有一臺(tái)主機(jī)(nx1)存在于 cisco 組中。這是一臺(tái) NX-OS-based Cisco Nexus 交換機(jī)。注意在這里為 nx1 定義了三個(gè)變量。它們包括 un 和 pwd,這是為了在 playbook 中訪問(wèn)和為了進(jìn)入到 Cisco 模塊去連接到設(shè)備。另外,這里有一個(gè)稱為 hostip 的參數(shù),它是必需的,因?yàn)椋?code>nx1 沒(méi)有在 DNS 中或者是 /etc/hosts 配置文件中定義。
注意:
如果自動(dòng)化一個(gè)原生的 Linux 設(shè)備,我們可以將這個(gè)參數(shù)命名為任何東西。ansible_ssh_host 被用于到如我們看到的那個(gè) Cumulus 示例(如果在清單文件中的定義不能被解析)。在這個(gè)示例中,我們將一直使用 ansible_ssh_host,但是,它并不是必需的,因?yàn)槲覀儗⑦@個(gè)變量作為一個(gè)參數(shù)進(jìn)入到 Cisco 模塊,而 ansible_ssh_host 是在使用默認(rèn)的 SSH 連接機(jī)制時(shí)自動(dòng)檢查的。
Juniper
和前面的三個(gè)組和主機(jī)一樣,在 juniper 組中有一個(gè)單個(gè)的主機(jī) vsrx。它在清單文件中的設(shè)置與 Cisco 相同,因?yàn)閮烧咴?playbook 中使用了相同的方式。
劇本
接下來(lái)的劇本有四個(gè)不同的劇集。每個(gè)劇集是基于特定的供應(yīng)商類型的設(shè)備組的自動(dòng)化構(gòu)建的。注意,那是在一個(gè)單個(gè)的劇本中執(zhí)行這些任務(wù)的唯一的方法。這里還有其它的方法,它可以使用條件(when 語(yǔ)句)或者創(chuàng)建 Ansible 角色(它在這個(gè)報(bào)告中沒(méi)有介紹)。
這里有一個(gè)劇本的示例:
---
- name: PLAY 1 - CISCO NXOS
hosts: cisco
connection: local
tasks:
- name: ENSURE VLAN 100 exists on Cisco Nexus switches
nxos_vlan:
vlan_id=100
name=web_vlan
host={{ hostip }}
username={{ un }}
password={{ pwd }}
- name: PLAY 2 - ARISTA EOS
hosts: arista
connection: local
tasks:
- name: ENSURE VLAN 100 exists on Arista switches
eos_vlan:
vlanid=100
name=web_vlan
connection={{ inventory_hostname }}
- name: PLAY 3 - CUMULUS
remote_user: cumulus
sudo: true
hosts: cumulus
tasks:
- name: ENSURE 100.10.10.1 is configured on swp1
cl_interface: name=swp1 ipv4=100.10.10.1/24
- name: restart networking without disruption
shell: ifreload -a
- name: PLAY 4 - JUNIPER SRX changes
hosts: juniper
connection: local
tasks:
- name: INSTALL JUNOS CONFIG
junos_install_config:
host={{ hostip }}
file=srx_demo.conf
user={{ un }}
passwd={{ pwd }}
logfile=deploysite.log
overwrite=yes
diffs_file=junpr.diff
你將注意到,前面的兩個(gè)劇集是非常類似的,我們已經(jīng)在最初的 Cisco 和 Arista 示例中講過(guò)了。唯一的區(qū)別是每個(gè)要自動(dòng)化的組(cisco and arista) 定義了它們自己的劇集,我們?cè)谇懊娼榻B使用 when 條件時(shí)比較過(guò)。
這里有一個(gè)不正確的或者是錯(cuò)誤的方式去做這些。這取決于你預(yù)先知道的信息是什么和適合你的環(huán)境和使用的最佳案例是什么,但我們的目的是為了展示做同一件事的幾種不同的方法。
第三個(gè)劇集是在 Cumulus Linux 交換機(jī)的 swp1 接口上進(jìn)行自動(dòng)化配置。在這個(gè)劇集中的第一個(gè)任務(wù)是去確認(rèn) swp1 是一個(gè)三層接口,并且它配置的 IP 地址是 100.10.10.1。因?yàn)?Cumulus Linux 是原生的 Linux,網(wǎng)絡(luò)服務(wù)在改變后需要重啟才能生效。這也可以使用 Ansible 的操作來(lái)達(dá)到這個(gè)目的(這已經(jīng)超出了本報(bào)告討論的范圍),這里有一個(gè)被稱為 service 的 Ansible 核心模塊來(lái)做這些,但它會(huì)中斷交換機(jī)上的網(wǎng)絡(luò);使用 ifreload 重新啟動(dòng)則不會(huì)中斷。
本節(jié)到現(xiàn)在為止,我們已經(jīng)講解了專注于特定任務(wù)的 Ansible 模塊,比如,配置接口和 VLAN。第四個(gè)劇集使用了另外的選項(xiàng)。我們將看到一個(gè) pushes 模塊,它是一個(gè)完整的配置文件并且立即激活它作為正在運(yùn)行的新的配置。這里將使用 napalm_install_config 來(lái)展示前面的示例,但是,這個(gè)示例使用了一個(gè) Juniper 專用的模塊。
junos_install_config 模塊接受幾個(gè)參數(shù),如下面的示例中所展示的。到現(xiàn)在為止,你應(yīng)該理解了什么是 user、passwd、和 host。其它的參數(shù)定義如下:
file:
這是一個(gè)從 Ansible 控制主機(jī)拷貝到 Juniper 設(shè)備的配置文件。
logfile:
這是可選的,但是,如果你指定它,它會(huì)被用于存儲(chǔ)運(yùn)行這個(gè)模塊時(shí)生成的信息。
overwrite:
當(dāng)你設(shè)置為 yes/true 時(shí),完整的配置將被發(fā)送的配置覆蓋。(默認(rèn)是 false)
diffs_file:
這是可選的,但是,如果你指定它,當(dāng)應(yīng)用配置時(shí),它將存儲(chǔ)生成的差異。當(dāng)應(yīng)用配置時(shí)將存儲(chǔ)一個(gè)生成的差異。當(dāng)正好更改了主機(jī)名,但是,仍然發(fā)送了一個(gè)完整的配置文件時(shí)會(huì)生成一個(gè)差異,如下的示例:
# filename: junpr.diff
[edit system]
- host-name vsrx;
+ host-name vsrx-demo;
上面已經(jīng)介紹了劇本概述的細(xì)節(jié)?,F(xiàn)在,讓我們看看當(dāng)劇本運(yùn)行時(shí)發(fā)生了什么:
注意:
-i 標(biāo)志是用于指定使用的清單文件。也可以設(shè)置環(huán)境變量 ANSIBLE_HOSTS,而不用每次運(yùn)行劇本時(shí)都去使用一個(gè) -i
本文題目:用Ansible實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化
網(wǎng)址分享:http://fisionsoft.com.cn/article/cdoggsg.html


咨詢
建站咨詢
