ansible 修改文件变量_基于ansible的批量配置生成
背景
網(wǎng)絡(luò)運(yùn)維,我們有很多時(shí)間是在準(zhǔn)備配置的路上,咱們之前也講過,從腦海中或者是從自己的寶藏筆記中找出模板,一頓操作猛如虎,Ctrl C+ Ctrl V。這個(gè)過程是十分危險(xiǎn)的,因?yàn)槿瞬皇菣C(jī)器,肯定會(huì)出錯(cuò),放縱自己去放空自己去復(fù)制粘貼,出的配置,早晚要“濕鞋”。
我們之前講過用jinja2+python去生成配置,今天我們講講用ansible去生成配置,其底層實(shí)際也使用的是jinja2。但是借助于playbook和inventory文件(hosts),它可以幫助我們省去一些代碼,同時(shí)可以將生成的配置結(jié)合ansible去實(shí)現(xiàn)更復(fù)雜的內(nèi)容,比如推送到設(shè)備或者推送到git,比如將準(zhǔn)備的配置在下一個(gè)ansible的playbook中使用,或者是產(chǎn)生的配置是下一個(gè)task的任務(wù)等等。
廢話不多講,我們來看看如何用ansible批量生成配置,以及其中的一些技巧。
其中主要涉及到的知識(shí)點(diǎn)是template模塊的使用以及變量的定義。
我們演示的場(chǎng)景還是最簡(jiǎn)單的端口配置。看看如何快速生成端口配置。
jinja2模板引擎使用大家可以參考我之前的文章。
最簡(jiǎn)版:變量+jinja2模板
我們先來一個(gè)簡(jiǎn)單版本的。
簡(jiǎn)單版本首先要定義一個(gè)jinja2的模板文件,jinjia2的文件一般使用j2作為后綴。我們端口配置的j2如下:
{% for intf in interfaces %}{{ intf[0] }}
description {{ intf[1]}}
{% endfor %}
其中我們把端口定義為這樣的一個(gè)數(shù)據(jù)格式 這個(gè)是在playbook中定義的。
interfaces:這里我們把每個(gè)端口定義成了列表,其實(shí)也可以定義成dict字典,二者各有利弊,列表寫一行,看著舒坦,書寫簡(jiǎn)單。dict的key會(huì)讓整體可讀性更好,這個(gè)看大家的取舍。我這里偷個(gè)懶。
其中變量interfaces的名字與j2文件中的變量必須同名,這個(gè)是ansible的對(duì)應(yīng)模塊幫我們?nèi)プ詣?dòng)將interfaces與j2 render生成配置的,所以一定要同名。
然后我們來定義我們對(duì)應(yīng)的把變量render到模板中的task了。
-這個(gè)template模塊,從上面的playbook來看很簡(jiǎn)單:
src:是本地jinja2模板的路徑。
dest:這個(gè)從官方和網(wǎng)上的一些資料去看,都是remote server的路徑。但是,針對(duì)網(wǎng)絡(luò)設(shè)備,這是一個(gè)本地的路徑。
還有一些和Linux文件相關(guān)的參數(shù),是否覆蓋,訪問權(quán)限等,默認(rèn)是覆蓋的,我們不是很關(guān)注。
dest我們說是remote server的路徑,這個(gè)其實(shí)描述的有點(diǎn)問題。對(duì)于host中的設(shè)備,如果是服務(wù)器,dest是遠(yuǎn)程服務(wù)器的路徑,但是針對(duì)網(wǎng)絡(luò)設(shè)備,這個(gè)dest是ansible主機(jī)(或者我們稱之為控制器)的本地路徑,這個(gè)大家要注意一下。
有興趣大家可以去看看template的源代碼,它是根據(jù)jinja2模板和變量生成配置,然后利用copy模塊把配置復(fù)制到遠(yuǎn)端服務(wù)器,如果是網(wǎng)絡(luò)設(shè)備,則會(huì)把內(nèi)容創(chuàng)建在本地(這個(gè)是我根據(jù)實(shí)驗(yàn)獲取一個(gè)結(jié)論,與connection的配置方式無關(guān),在源代碼中找這個(gè)邏輯找的也很模糊,作為網(wǎng)絡(luò)運(yùn)維人員,我們這樣簡(jiǎn)單理解我覺得是沒問題的)。
這個(gè)階段的playbook:
---結(jié)果:
升級(jí)版:變量文件+jinja2模板
剛才的方式我們生成了配置,但是變量都寫在了一個(gè)playbook中,當(dāng)端口比較多的時(shí)候,這個(gè)playbook就顯得非常大,為了看實(shí)際運(yùn)行的內(nèi)容要拖好長(zhǎng)才能看到。
這個(gè)時(shí)候我們可以簡(jiǎn)單升級(jí)一下,把變量提取到一個(gè)指定的yaml文件,然后通過yaml文件描述我們的配置參數(shù)。
首先我們簡(jiǎn)單定義一個(gè)要配置的端口的yaml文件。
interfaces.yml:
---定義好變量,我們把這個(gè)文件導(dǎo)入到playbook中.
---結(jié)果:
我們對(duì)內(nèi)置變量vars_files進(jìn)行了賦值,進(jìn)而導(dǎo)入了我們的變量文件。我們可以導(dǎo)入多個(gè)變量文件。
如此,我們便可以將一個(gè)playbook固定下來,以后每次修改變量文件內(nèi)容批量生成配置文件,且可以重復(fù)利用。
這種適合于一些大批量的配置生成。
腦洞大開
延伸拓展:
基于變量及文件配置自動(dòng)生成,我們可以固化一些常用的應(yīng)急場(chǎng)景,比如防火墻切換,將每組防火墻切換的變量文件準(zhǔn)備好,然后在應(yīng)急的時(shí)候去調(diào)用對(duì)應(yīng)的變量文件
開局自動(dòng)化
日常變更割接的模板管理、配置生成自動(dòng)化及推送自動(dòng)化
后續(xù):
- 基于ansible,可以結(jié)合我們之前相關(guān)推送模塊,Cli的或者是廠商自帶的一些copy_config(從本地文件讀取寫入到設(shè)備
- 通過自己的paramiko與netmiko腳本去推送配置
- 用我們自己的配置推送工具去推送。一些大廠都會(huì)有自研或者購買的配置管理工具可以批量推送配置
- 手刷(最不推薦)
今天就到這里結(jié)束,以上只是一部分演示。我們可以利用ansible與jinja2批量生成配置。
下一次,我們講講基于角色的playbook的編寫,可以與這個(gè)結(jié)合,按角色生成不同的配置。這種適用一些固定場(chǎng)景或者是重要變更或者是開局自動(dòng)化等等
感覺這次劃了水。下次分享計(jì)劃是RESTful API (與這個(gè)ansible的交叉著來),這個(gè)系列打算拆成3-5次去分享,因?yàn)閮?nèi)容其實(shí)有點(diǎn)多。
歡迎大家繼續(xù)關(guān)注、點(diǎn)贊、分享、喜歡、收藏、訂閱,推薦給你身邊的網(wǎng)工!
同名知乎專欄和微信公眾號(hào):NetDevOps加油站,歡迎你的加入!
codes:
https://gitee.com/feifeiflight/NetDevOpsShare/blob/master/codes/ansible_codes/templates_show.yml
https://gitee.com/feifeiflight/NetDevOpsShare/blob/master/codes/ansible_codes/templates_with_var_files_show.yml
總結(jié)
以上是生活随笔為你收集整理的ansible 修改文件变量_基于ansible的批量配置生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql al32utf8_Oracl
- 下一篇: java instance变量_java