目前來看,Python+yaml+Jinja2是非常方便生成批量配置的組合,在運維工作中用于批量生成設(shè)備的基礎(chǔ)配置。
平房網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),平房網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為平房上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的平房做網(wǎng)站的公司定做!
這里我的案例是配置一批交換機,基礎(chǔ)配置不同的地方有:loopback地址(IPV4和IPV6),設(shè)備名稱,ISIS網(wǎng)絡(luò)號,至于其他互聯(lián)地址什么的因為情況比較復(fù)雜,還是手工做吧。
那么思路就有了。
1、生成yaml文件,類似于下面結(jié)構(gòu):
這里說明一下,loopback地址的V4網(wǎng)段是先規(guī)劃好的,V6地址和ISIS網(wǎng)絡(luò)號通過一定規(guī)則根據(jù)V4地址生成,這個yaml文件可以通過讀取excel文件,按照算法生成yaml文件,這個在其他文章里再寫。
2、讀取yaml文件,生成一個由字典組成的列表。每個字典的信息就包含了每臺設(shè)備需要的變量。
3、寫一個函數(shù),遍歷列表里的字典,每讀取一個字典,把其中變量取出來放進一個臨時字典,渲染jinja2的模板,對每個字典輸出不同的配置文件。這個臨時字典每讀取一次就清空,重新寫入變量。
有一些細節(jié)比如文檔取名,時間函數(shù)等要調(diào)用一些模塊,總結(jié)一下涉及的知識點,有:yaml模塊,jinja2模塊,os模塊,日期函數(shù),條件循環(huán),I/O操作。
附上python腳本:
模板文件放在‘templates’目錄下,否則會報錯找不到文件。
python新手,有不合理的地方請高手指點。
在Go語言項目中,常用的配置文件yaml、toml、json、xml、ini幾種,因為本章主要講解yaml配置文件的使用方法,其他幾種配置文件在這里就不展開了介紹了,大家有興趣可以自行百度。
yaml文件的語法網(wǎng)上有很多的教程,大家自行百度,這里也推薦兩個鏈接:
yaml文件解析使用的是github上第三方開源框架 gopkg.in/yaml.v2 ,下面詳細介紹安裝和使用的方法:
參考鏈接:
安裝EasyDataTransform在Mac上就可以解決。
安裝EasyDataTransform在Mac上,開始輕松的數(shù)據(jù)轉(zhuǎn)換,將要顯示重復(fù)項的Excel電子表格拖到EasyDataTransform上。將添加一個粉紅色的輸入項請注意右側(cè)窗格中的JSON數(shù)據(jù)已自動“展平”到表格中。
您可以將右窗格中的Format下拉菜單設(shè)置為Long或Wide,具體取決于您希望表格具有更多行還是更多列,確保選擇了粉紅色的輸入項,單擊左窗格中的ToFile按鈕,將出現(xiàn)一個窗口。設(shè)置新文件名和位置。選擇YAML文件作為文件類型。添加并選擇了一個綠色輸出項。YAML文件會立即創(chuàng)建,無需“運行”任何內(nèi)容您可以在右側(cè)窗格中更改YAML文件編碼。
YAML是一種流行的格式,用于以人類友好的格式序列化數(shù)據(jù), 類似JSON但更易于閱讀。
由于其表達能力和可讀性,YAML作為配置文件的格式很受歡迎。
它也用于更復(fù)雜的場景中,例如推動Ansible服務(wù)器自動化。
標準庫中沒有用于處理YAML格式的軟件包,但是社區(qū)庫包括gopkg.in/yaml.v2
將YAML文件讀取到Go結(jié)構(gòu)中:
YAML:
YAML解碼與JSON解碼非常相似。
如果你知道YAML文件的結(jié)構(gòu),則可以定義映射該結(jié)構(gòu)的結(jié)構(gòu),并將指向頂級結(jié)構(gòu)的結(jié)構(gòu)的指針傳遞給yaml.Decoder.Decode()函數(shù)(或從[]進行解碼的yaml.Unmarshal())。 字節(jié)片)。
YAML解碼器在結(jié)構(gòu)字段名稱和YAML文件中的名稱之間進行智能映射,以便 YAML中的名稱值被解碼為結(jié)構(gòu)中的字段名稱。
最好使用yaml struct標簽創(chuàng)建顯式映射。 我僅在示例中省略了它們,以說明未指定它們時的行為。
將struct寫入YAML文件:
yaml.Marshal將interface {}作為參數(shù)。 可以傳遞任何Go值,并將其類型包裝到interface {}中。
Marshaller將使用反射檢查傳遞的值并將其編碼為YAML字符串。
在序列化結(jié)構(gòu)時,僅對導出的字段(其名稱以大寫字母開頭)進行序列化/反序列化。
在我們的示例中,未對fullName進行序列化。
結(jié)構(gòu)被序列化為YAML字典。 默認情況下,字典鍵與結(jié)構(gòu)字段名稱相同。
結(jié)構(gòu)字段名稱在字典鍵名稱下序列化。
我們可以提供帶有struct標簽的自定義映射。
我們可以將任意的struct標簽字符串附加到struct字段。
yaml:“ age”指示YAML編碼器/解碼器將名稱age用于表示字段Age的字典關(guān)鍵字。
序列化結(jié)構(gòu)時,將值和指針傳遞給它會產(chǎn)生相同的結(jié)果。
傳遞指針效率更高,因為按值傳遞會創(chuàng)建不必要的副本。