天天看點

ansible(八)API,自定義module,自定義plugin

今天看了下ansible的API,樓主一看,這玩意牛逼啊,估計ansible Tower也是根據這套API來的吧。

閑話不說,看看咋玩的吧。

咱們先看看接口的主角,ansible.runner.Runner這個類吧

ansible(八)API,自定義module,自定義plugin

想必大夥也也都看到了,這個類初始化函數裡面的這些參數,就是咱們要輸入的參數,不過全都有預設值,看到了沒,也就是說咱們隻要修改我們需要改變的就OK了。  

我們想要調用這個接口,其實很簡單,兩步就OK了,第一步執行個體化ansible.runner.Runner這個類,

第二步,執行個體化後的對象調用run()這個函數。

咱們先舉小例子,看看運作run()函數之後,傳回的結果長什麼樣的吧

ansible(八)API,自定義module,自定義plugin

想必大夥也看到了,傳回的結果是一個json格式的字典。

dark,指的是沒傳回結果的,因為salt-minion這台機器,樓主沒開機,是以沒傳回。

contacted,這裡面,有我們要的結果。 result['contacted']['stdout']是我們的輸出。

OK,知道這些了。那大夥也差不多知道了,ansible這個接口是幹什麼的了吧?

它幹的活,其實就是把ansible标準庫的子產品,或者咱們自己寫的子產品傳進去,然後我們可以得到

一個字典格式的結果。 有了這個結果,我們就可以對結果進行一系列的處理了。

最重要的一點是啥呢? 有了這個接口,咱們就不用走ansible  指令行,或playbook執行這一流程了。

就可以利用這個接口,寫好一個python子產品,咱們自己的系統就可以直接調用這個子產品,然後得到

正常情況下通過ansible指令行或playbooks才能得到的結果

下面再說說自定義module吧,上上一篇總結facts的時候,寫了一個自定義子產品的小例子。

其實ansible裡面自定義子產品,用bash,perl,lua,python,c++等等這些語言都可以寫子產品。

隻要這些子產品,傳回一個json格式的結果給ansible就OK了。

樓主舉個小例子,測試一下。

ansible(八)API,自定義module,自定義plugin

OK,看看結果吧

ansible(八)API,自定義module,自定義plugin

當然,咱們自定義的子產品入庫之前,最好先測試一下。可以用ansible安裝包裡的一個東西測試下

ansible(八)API,自定義module,自定義plugin

OK,自定義子產品就到這裡了。關鍵把輸入和輸出給弄好,中間的過程就可以自由發揮了

最好咱們來看看,怎麼自定義plugins吧。 

ansible有很多類型的插件都可以自定義,上一篇咱們總結facts的時候,樓主弄個了自定了loops插件的小例子。 loops插件也是衆多類型插件中的一種。下面這個圖,裡面就是可以自定的插件,

以及插件,預設存放的位置。也就是說咱們,定義好插件直接丢在這些檔案夾裡面就OK了

ansible(八)API,自定義module,自定義plugin

樓主舉個callback插件的例子吧,因為,這個插件和salt-stack裡的ruturner長的差不多。

咱們ansible執行後的結果,一般來說,不都是列印到螢幕上的嗎?

而callback插件,則可以接收ansible執行的結果,并安裝我們的設計,把結果輸出到不同的地方去。

比如說輸出到檔案,資料庫,發郵件等。

mark一個官網callback例子的位址

https://github.com/ansible/ansible/tree/devel/plugins/callbacks

ansible(八)API,自定義module,自定義plugin

把檔案丢進/usr/share/ansible_plugins/callback_plugins/檔案夾下面,咱們随便找個playbooks執行下看看結果吧

ansible(八)API,自定義module,自定義plugin

看到了沒,執行了兩次。。。啥原因,樓主也不知道。。。

ansible,樓主就大多數功能也測試了一遍,沒啥實際需求,一直處于自娛自樂的狀态,不準備搞下去了。。。

搞了兩三個禮拜的salt-stack和ansible,得出一個結論,樓主python太水了。

接下來開始好好補補python了

繼續閱讀