Ansible是Agentless的輕量級批量配置管理工具,由於出現的比較晚(13年)基於Ansible進行開發的相關文檔較少,因此,這里通過一些小的實驗,結合現有資料以及源碼,探索一下Ansible的二次開發。
隨筆的內容分為三個部分
- playbook編輯執行
- python 調用API執行playbook
- 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