Ansible playbook API 開發 調用測試


    Ansible是Agentless的輕量級批量配置管理工具,由於出現的比較晚(13年)基於Ansible進行開發的相關文檔較少,因此,這里通過一些小的實驗,結合現有資料以及源碼,探索一下Ansible的二次開發。

    隨筆的內容分為三個部分

  1. playbook編輯執行
  2. python 調用API執行playbook
  3. java調用python程序進行playbook的執行

    實驗的環境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79

 

一、playbook編輯執行

  編輯playbook,這里實現的功能是復制一個腳本到指定節點並執行,需要注意的是yaml的格式,注意縮進

  webAuth.yml

 1 ---
 2 
 3 - name: hostname
 4 
 5   hosts: "{{host}}"
 6 
 7   sudo: yes
 8 
 9   tasks:
10 
11     - name: copy file to "{{host}}"
12 
13       copy: src=/tmp/webAuth.sh dest=/tmp/webAuth.sh mode=0775
14 
15    
16 
17     - name: execute webAuth
18 
19       script: /tmp/webAuth.sh

 

 

  如果想運行該playbook可以使用

# ansible-playbook /opt/ansible/webAuth.yml --extra-vars 'host=’nodes'

 

  此時將會有返回結果。

PLAY [hostname] ***************************************************************

 

GATHERING FACTS ***************************************************************

ok: [192.168.10.110]

 

TASK: [copy file to "{{host}}"] ***********************************************

ok: [192.168.10.110]

 

TASK: [execute webAuth] *******************************************************

changed: [192.168.10.110]

 

PLAY RECAP ********************************************************************

192.168.10.110              : ok=3    changed=1    unreachable=0    failed=0

   能夠執行成功說明playbook是沒問題的,如果報錯誤,那么根據提示進行修改即可。

二、python 調用API執行playbook

    下面使用Python調用API接口執行上面的playbook

 1 Python代碼: test.py
 2 import sys
 3 import ansible.playbook
 4 from ansible import callbacks
 5 from ansible import utils
 6 
 7 stats = callbacks.AggregateStats()
 8 playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
 9 runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
10 def execute(play,params):
11   pb = ansible.playbook.PlayBook(
12     playbook=play,
13     stats=stats,
14     callbacks=playbook_cb,
15     runner_callbacks=runner_cb,
16     check=False,
17     extra_vars=eval(params)
18   )
19   print pb
20   return  pb.run()
21 if __name__=='__main__':
22   res=execute(sys.argv[1],sys.argv[2])
23   print res

 

代碼中 playbook=play 是由命令行給出需要執行的playbook腳本路徑,stats是用於收集執行的過程狀態,playbook_cb是playbook_cb 用來輸出執行的結果,runner_callbacks用來輸出playbook執行期間的結果。

執行

python test.py /opt/ansible/webAuth.yml '{"host":"cloudeploy-nodes"}'

 

返回結果:

PLAY [hostname] ***************************************************************

 

GATHERING FACTS ***************************************************************

ok: [192.168.10.110]

 

TASK: [copy file to "{{host}}"] ***********************************************

changed: [192.168.10.110]

 

TASK: [execute webAuth] *******************************************************

ok: [192.168.10.110]

{'192.168.10.110': {'unreachable': 0, 'skipped': 0, 'ok': 2, 'changed': 1, 'failures': 0}}

 

 

 

三、java調用python程序進行playbook的執行

  使用JAVA調用python來實現java執行playbook

Test.java

 1 import java.io.InputStreamReader;
 2 
 3 import java.io.BufferedReader;
 4 
 5 import java.io.InputStream;
 6 
 7 import java.io.IOException;
 8 
 9 public class Test{
10 
11   public static void main(String args[]) throws IOException{
12 
13     String command="python /opt/ansible/test.py /opt/ansible/hostname.yml {'host':'"+args[0]+"'}";
14 
15     Process process = Runtime.getRuntime().exec(command);
16 
17     printStream(process.getInputStream());
18 
19     printStream(process.getErrorStream());
20 
21     System.out.println("finish");
22 
23   }
24 
25 private static void printStream(InputStream inputStream) {
26 
27   if (inputStream == null){
28 
29     System.out.println("input null");
30 
31     return;
32 
33   }
34 
35   String line = "";
36 
37     try(BufferedReader input = new BufferedReader(new InputStreamReader(inputStream)))
38 
39     {
40 
41       while ((line = input.readLine()) != null) {
42 
43         System.out.println(line);
44 
45       }
46 
47     } catch (IOException e1) {
48 
49         System.out.println("輸出流失敗"+e1);
50 
51         e1.printStackTrace();
52 
53     }
54 
55   }
56 
57 }

 

 

調用

#java Test cloudeploy

這里將playbook的路徑固定了,同樣可以作為參數傳入。

執行結果:

PLAY [hostname] *************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.10.110]

TASK: [return hostname] ******************************************************* 
changed: [192.168.10.110]

TASK: [copy file to "{{host}}"] *********************************************** 
ok: [192.168.10.110]

TASK: [execute webAuth] ******************************************************* 
changed: [192.168.10.110]
{'192.168.10.110': {'unreachable': 0, 'skipped': 0, 'ok': 4, 'changed': 2, 'failures': 0}}
finish

表明執行成功,查看對應節點,文件將被復制並執行

 

參考資料:

Github: playbook 源碼 :https://github.com/ansible/ansible/blob/release1.8.4/lib/ansible/playbook/__init__.py

Kisips: Ansible文檔 playbook進階: http://www.kisops.com/?p=42

361way: ansible小節十 ansible api  http://www.361way.com/ansible-api/4446.html

StackOverflow :Running ansible-playbook using Python API   http://stackoverflow.com/questions/27590039/running-ansible-playbook-using-python-api

Ansible :developing api http://docs.ansible.com/ansible/developing_api.html

google: ansible 論壇   https://groups.google.com/forum/#!topic/ansible-project/V1PoNJcXV_w


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM