- 論壇徽章:
- 1
|
Salt支持Gitfs, 可以將State Tree放入Git遠(yuǎn)程倉庫中, 進(jìn)行版本控制, 易于管理. 當(dāng)提交更新至遠(yuǎn)程Git倉庫后, 需要手動在Master執(zhí)行如下操作:
- salt-run fileserver.update
復(fù)制代碼
或者等待一段時間,由Master的maintenance進(jìn)程進(jìn)行更新(默認(rèn)更新間隔為60s, 可以通過master配置文件 loop_interval 選項(xiàng)進(jìn)行調(diào)整). 那么有沒有一種方案, 能夠?qū)崿F(xiàn)Push代碼至Git倉庫后, 自動觸發(fā)Gitfs的更新哪?
常見的Git倉庫管理系統(tǒng), 如Gitlab, Github, Bitbucket都支持Webhook功能, 即當(dāng)Push代碼至倉庫時, 能夠自動觸發(fā)外部Webhook調(diào)用, 而Salt API提供Webhook功能, 可以通過Webhook觸發(fā)Event, Reactor系統(tǒng)又能基于Event進(jìn)行Salt自動化管理, 看看可以就此入手, 實(shí)現(xiàn)Gitfs自動更新方案.
環(huán)境說明
CentOS 6.5 With EPEL
salt-master及salt-api版本2015.5.0
Master端已安裝python-pygit2
Master端已安裝Nginx(用于salt-api安全防護(hù))
本次采用Github作為遠(yuǎn)程倉庫Demo
本次采用臨時域名salt-api-demo.pengyao.org進(jìn)行測試, 請根據(jù)自己真實(shí)環(huán)境進(jìn)行調(diào)整
開工
以下操作, 如非說明, 均在Master端進(jìn)行
配置Salt API- /etc/salt/master.d/api.conf
復(fù)制代碼- rest_cherrypy:
- port: 8000
- host: 127.0.0.1
- debug: True
- disable_ssl: True
- webhook_url: /hook
- webhook_disable_auth: True
復(fù)制代碼
由于第三方Webhook部分并不支持認(rèn)證功能, 所以關(guān)閉了webhook認(rèn)證(webhook_disable_auth參數(shù))
重啟Salt API服務(wù), 以使配置生效
由于關(guān)閉了Webhook認(rèn)證, 意味著公網(wǎng)所有人都可以觸發(fā)本W(wǎng)ebhook, 所以Master端安裝了Nginx對Webhook接口增加Basic Auth認(rèn)證功能
- /etc/nginx/conf.d/salt-api-demo.pengyao.org.conf
復(fù)制代碼- upstream salt-api-demo {
- server 127.0.0.1:8000;
- }
- server {
- listen 80;
- server_name salt-api-demo.pengyao.org;
- location / {
- proxy_pass http://salt-api-demo;
- }
- location /hook {
- proxy_pass http://salt-api-demo;
- auth_basic "salt api demo";
- auth_basic_user_file /opt/htpasswd;
- }
- }
復(fù)制代碼
重啟Nginx服務(wù), 以使配置生效
創(chuàng)建Basic Auth用戶文件:- echo "demo:$(echo -n demo_pass |openssl passwd -stdin)" > /opt/htpasswd
復(fù)制代碼
Master下載eventlisten.py, 監(jiān)聽Event- wget https://raw.githubusercontent.com/saltstack/salt/develop/tests/eventlisten.py
- python eventlisten.py
復(fù)制代碼
開啟新窗口, 手動觸發(fā)webhook, 進(jìn)行測試- curl http://demo:demo_pass@salt-api-demo.pengyao.org/hook/test -XPOST -d "demo=True"
復(fù)制代碼
運(yùn)行eventlisten.py的控制臺有如下輸出:- Event fired at Tue May 26 00:33:04 2015
- *************************
- Tag: salt/netapi/hook/test
- Data:
- {'_stamp': '2015-05-25T16:33:04.425532',
- 'body': '',
- 'headers': {'Accept': '*/*',
- 'Authorization': 'Basic ZGVtbzpkZW1vX3Bhc3M=',
- 'Connection': 'close',
- 'Content-Length': '9',
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'Host': 'salt-api-demo',
- 'Remote-Addr': '127.0.0.1',
- 'User-Agent': 'curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2'},
- 'post': {'demo': 'True'}}
復(fù)制代碼
webhook測試達(dá)到預(yù)期
建立遠(yuǎn)程倉庫
登陸Github建立遠(yuǎn)程倉庫, 本次Demo倉庫地址:
https://github.com/pengyao/salt-gitfs-demo.git
配置Gitfs
- /etc/salt/master.d/gitfs.conf
復(fù)制代碼- # Gitfs backend
- fileserver_backend:
- - git
- # Gitfs provider
- gitfs_provider: pygit2
- # Gitfs repositories
- gitfs_remotes:
- - https://github.com/pengyao/salt-gitfs-demo.git
復(fù)制代碼
重啟Salt Master服務(wù), 以使配置生效- service salt-master restart
復(fù)制代碼
重啟完畢后, 獲取gitfs中的文件列表(啟動時, 會自動觸發(fā)拉取最新的遠(yuǎn)程倉庫代碼)- salt-run fileserver.file_list
復(fù)制代碼
輸出如下:
配置Reactor- /etc/salt/master.d/reactor.conf
復(fù)制代碼- reactor:
- - 'salt/netapi/hook/gitfs/*':
- - /srv/reactor/gitfs.sls
復(fù)制代碼- {% if 'gitfs/update' in tag %}
- gitfs_update:
- runner.fileserver.update
- {% endif %}
復(fù)制代碼
重啟Salt Master服務(wù), 以使配置生效- service salt-master restart
復(fù)制代碼
重啟完畢后, 測試webhook:- curl http://demo:demo_pass@salt-api-demo.pengyao.org/hook/gitfs/update -XPOST -d "demo=True"
復(fù)制代碼
運(yùn)行eventlisten.py的窗口, 有如下輸出:- Event fired at Tue May 26 00:49:11 2015
- *************************
- Tag: salt/netapi/hook/gitfs/update
- Data:
- {'_stamp': '2015-05-25T16:49:11.694576',
- 'body': '',
- 'headers': {'Accept': '*/*',
- 'Authorization': 'Basic ZGVtbzpkZW1vX3Bhc3M=',
- 'Connection': 'close',
- 'Content-Length': '9',
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'Host': 'salt-api-demo',
- 'Remote-Addr': '127.0.0.1',
- 'User-Agent': 'curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2'},
- 'post': {'demo': 'True'}}
- Event fired at Tue May 26 00:49:11 2015
- *************************
- Tag: salt/event/new_client
- Data:
- {'_stamp': '2015-05-25T16:49:11.737823'}
- Event fired at Tue May 26 00:49:11 2015
- *************************
- Tag: salt/run/20150526004911736899/new
- Data:
- {'_stamp': '2015-05-25T16:49:11.742807',
- 'fun': 'runner.fileserver.update',
- 'jid': '20150526004911736899',
- 'user': 'Reactor'}
- Event fired at Tue May 26 00:49:14 2015
- *************************
- Tag: salt/run/20150526004911736899/ret
- Data:
- {'_stamp': '2015-05-25T16:49:14.168910',
- 'fun': 'runner.fileserver.update',
- 'jid': '20150526004911736899',
- 'return': True,
- 'success': True,
- 'user': 'Reactor'}
復(fù)制代碼
可以看到, 本次測試, 產(chǎn)生了4條event:
webhook產(chǎn)生, 對應(yīng)Tag為: salt/netapi/hook/gitfs/update
由于配置的有對應(yīng)的Reactor, 所以會自動創(chuàng)建Reactor線程, 產(chǎn)生第二條Event
產(chǎn)生的Reactor線程在獲取對應(yīng)的sls發(fā)現(xiàn)需要運(yùn)行runner.fileserver.update任務(wù), 所以自動創(chuàng)建該任務(wù), 對應(yīng)的Tag為: salt/run/$jid/new
runner任務(wù)結(jié)果返回, 對應(yīng)的Tag為: salt/run/$jid/ret
測試達(dá)到預(yù)期
配置GitHub Webhook
進(jìn)入項(xiàng)目配置頁面, 選擇"Webhooks & Services"左側(cè)導(dǎo)航條, 選擇 "Add Webhook", 分別輸入如下內(nèi)容:
Payload URL: http://demo:demo_pass@salt-api-demo.pengyao.org/hook/gitfs/update
輸入完畢后, 選擇 Add Webhook進(jìn)行保存
自動更新Gitfs測試
本地clone本項(xiàng)目, 進(jìn)行如下操作:- git clone git@github.com:pengyao/salt-gitfs-demo.git
- cd salt-gitfs-demo
- echo "I am a test" > test
- git add -A
- git commit -m "add test"
- git push -u origin master
復(fù)制代碼
git push后, 在運(yùn)行eventlisten.py窗口, 有如下輸出:- Event fired at Tue May 26 01:04:15 2015
- *************************
- Tag: salt/netapi/hook/gitfs/update
- Data:
- {'_stamp': '2015-05-25T17:04:15.495458',
- 'body': '{"ref":"refs/heads/master","before":"efe61d0816e4f34c7c0117945ef2383a4183ac26","after":"e2264a6386bf5c6b8ec6daee0ddca3155b4e3ccc","created":false,"deleted":false,"forced":false,"base_ref":null,"compare":"https://github.com/pengyao/salt-gitfs-demo/compare/efe61d0816e4...e2264a6386bf","commits"
- ......此處省略若干字......
- Event fired at Tue May 26 01:04:15 2015
- *************************
- Tag: salt/event/new_client
- Data:
- {'_stamp': '2015-05-25T17:04:15.523955'}
- Event fired at Tue May 26 01:04:15 2015
- *************************
- Tag: salt/run/20150526010415522645/new
- Data:
- {'_stamp': '2015-05-25T17:04:15.529005',
- 'fun': 'runner.fileserver.update',
- 'jid': '20150526010415522645',
- 'user': 'Reactor'}
- Event fired at Tue May 26 01:04:19 2015
- *************************
- Tag: salt/run/20150526010415522645/ret
- Data:
- {'_stamp': '2015-05-25T17:04:19.393239',
- 'fun': 'runner.fileserver.update',
- 'jid': '20150526010415522645',
- 'return': True,
- 'success': True,
- 'user': 'Reactor'}
復(fù)制代碼
檢查gitfs倉庫文件列表:- salt-run fileserver.file_list
復(fù)制代碼
輸出如下:
達(dá)到預(yù)期
結(jié)束語
Reactor系統(tǒng)的加入, Salt插上智能化的翅膀, 輕松甩開競爭對手幾條街. 簡單易用的Salt REST API接口, 更易于和第三方系統(tǒng)整合, 使Salt輕松成為運(yùn)維系統(tǒng)自動化引擎.
人生苦短, 我用Salt! |
|