免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6207 | 回复: 0
打印 上一主题 下一主题

[Salt] Salt自动化之自动更新Gitfs [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-03-21 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-26 11:33 |只看该作者 |倒序浏览
Salt支持Gitfs, 可以将State Tree放入Git远程仓库中, 进行版本控制, 易于管理. 当提交更新至远程Git仓库后, 需要手动在Master执行如下操作:
  1. salt-run fileserver.update
复制代码

或者等待一段时间,由Master的maintenance进程进行更新(默认更新间隔为60s, 可以通过master配置文件 loop_interval 选项进行调整). 那么有没有一种方案, 能够实现Push代码至Git仓库后, 自动触发Gitfs的更新哪?

常见的Git仓库管理系统, 如Gitlab, Github, Bitbucket都支持Webhook功能, 即当Push代码至仓库时, 能够自动触发外部Webhook调用, 而Salt API提供Webhook功能, 可以通过Webhook触发Event, Reactor系统又能基于Event进行Salt自动化管理, 看看可以就此入手, 实现Gitfs自动更新方案.
环境说明

CentOS 6.5 With EPEL
salt-master及salt-api版本2015.5.0
Master端已安装python-pygit2
Master端已安装Nginx(用于salt-api安全防护)
本次采用Github作为远程仓库Demo
本次采用临时域名salt-api-demo.pengyao.org进行测试, 请根据自己真实环境进行调整
开工

以下操作, 如非说明, 均在Master端进行
配置Salt API
  1. /etc/salt/master.d/api.conf
复制代码
  1. rest_cherrypy:
  2.   port: 8000
  3.   host: 127.0.0.1
  4.   debug: True
  5.   disable_ssl: True
  6.   webhook_url: /hook
  7.   webhook_disable_auth: True
复制代码

由于第三方Webhook部分并不支持认证功能, 所以关闭了webhook认证(webhook_disable_auth参数)

重启Salt API服务, 以使配置生效
  1. service salt-api restart
复制代码

由于关闭了Webhook认证, 意味着公网所有人都可以触发本Webhook, 所以Master端安装了Nginx对Webhook接口增加Basic Auth认证功能

  1. /etc/nginx/conf.d/salt-api-demo.pengyao.org.conf
复制代码
  1. upstream salt-api-demo {
  2.   server 127.0.0.1:8000;
  3. }

  4. server {
  5.   listen 80;
  6.   server_name salt-api-demo.pengyao.org;

  7.   location / {
  8.     proxy_pass  http://salt-api-demo;
  9.   }
  10.   location /hook {
  11.     proxy_pass  http://salt-api-demo;
  12.     auth_basic  "salt api demo";
  13.     auth_basic_user_file  /opt/htpasswd;
  14.   }
  15. }
复制代码

重启Nginx服务, 以使配置生效
  1. service nginx restart
复制代码

创建Basic Auth用户文件:
  1. echo "demo:$(echo -n demo_pass |openssl passwd -stdin)"  > /opt/htpasswd
复制代码

Master下载eventlisten.py, 监听Event
  1. wget https://raw.githubusercontent.com/saltstack/salt/develop/tests/eventlisten.py
  2. python eventlisten.py
复制代码

开启新窗口, 手动触发webhook, 进行测试
  1. curl http://demo:demo_pass@salt-api-demo.pengyao.org/hook/test -XPOST -d "demo=True"
复制代码

运行eventlisten.py的控制台有如下输出:
  1. Event fired at Tue May 26 00:33:04 2015
  2. *************************
  3. Tag: salt/netapi/hook/test
  4. Data:
  5. {'_stamp': '2015-05-25T16:33:04.425532',
  6. 'body': '',
  7. 'headers': {'Accept': '*/*',
  8.              'Authorization': 'Basic ZGVtbzpkZW1vX3Bhc3M=',
  9.              'Connection': 'close',
  10.              'Content-Length': '9',
  11.              'Content-Type': 'application/x-www-form-urlencoded',
  12.              'Host': 'salt-api-demo',
  13.              'Remote-Addr': '127.0.0.1',
  14.              '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'},
  15. 'post': {'demo': 'True'}}
复制代码

webhook测试达到预期

建立远程仓库

登陆Github建立远程仓库, 本次Demo仓库地址:
https://github.com/pengyao/salt-gitfs-demo.git
配置Gitfs
  1. /etc/salt/master.d/gitfs.conf
复制代码
  1. # Gitfs backend
  2. fileserver_backend:
  3.   - git

  4. # Gitfs provider
  5. gitfs_provider: pygit2

  6. # Gitfs repositories
  7. gitfs_remotes:
  8.   - https://github.com/pengyao/salt-gitfs-demo.git
复制代码

重启Salt Master服务, 以使配置生效
  1. service salt-master restart
复制代码

重启完毕后, 获取gitfs中的文件列表(启动时, 会自动触发拉取最新的远程仓库代码)
  1. salt-run fileserver.file_list
复制代码

输出如下:
  1. - README
复制代码

配置Reactor
  1. /etc/salt/master.d/reactor.conf
复制代码
  1. reactor:
  2.   - 'salt/netapi/hook/gitfs/*':
  3.     - /srv/reactor/gitfs.sls
复制代码
  1. /srv/reactor/gitfs.sls
复制代码
  1. {% if 'gitfs/update' in tag %}
  2. gitfs_update:
  3.   runner.fileserver.update
  4. {% endif %}
复制代码

重启Salt Master服务, 以使配置生效
  1. service salt-master restart
复制代码

重启完毕后, 测试webhook:
  1. curl http://demo:demo_pass@salt-api-demo.pengyao.org/hook/gitfs/update -XPOST -d "demo=True"
复制代码

运行eventlisten.py的窗口, 有如下输出:
  1. Event fired at Tue May 26 00:49:11 2015
  2. *************************
  3. Tag: salt/netapi/hook/gitfs/update
  4. Data:
  5. {'_stamp': '2015-05-25T16:49:11.694576',
  6. 'body': '',
  7. 'headers': {'Accept': '*/*',
  8.              'Authorization': 'Basic ZGVtbzpkZW1vX3Bhc3M=',
  9.              'Connection': 'close',
  10.              'Content-Length': '9',
  11.              'Content-Type': 'application/x-www-form-urlencoded',
  12.              'Host': 'salt-api-demo',
  13.              'Remote-Addr': '127.0.0.1',
  14.              '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'},
  15. 'post': {'demo': 'True'}}
  16. Event fired at Tue May 26 00:49:11 2015
  17. *************************
  18. Tag: salt/event/new_client
  19. Data:
  20. {'_stamp': '2015-05-25T16:49:11.737823'}
  21. Event fired at Tue May 26 00:49:11 2015
  22. *************************
  23. Tag: salt/run/20150526004911736899/new
  24. Data:
  25. {'_stamp': '2015-05-25T16:49:11.742807',
  26. 'fun': 'runner.fileserver.update',
  27. 'jid': '20150526004911736899',
  28. 'user': 'Reactor'}
  29. Event fired at Tue May 26 00:49:14 2015
  30. *************************
  31. Tag: salt/run/20150526004911736899/ret
  32. Data:
  33. {'_stamp': '2015-05-25T16:49:14.168910',
  34. 'fun': 'runner.fileserver.update',
  35. 'jid': '20150526004911736899',
  36. 'return': True,
  37. 'success': True,
  38. 'user': 'Reactor'}
复制代码

可以看到, 本次测试, 产生了4条event:

webhook产生, 对应Tag为: salt/netapi/hook/gitfs/update
由于配置的有对应的Reactor, 所以会自动创建Reactor线程, 产生第二条Event
产生的Reactor线程在获取对应的sls发现需要运行runner.fileserver.update任务, 所以自动创建该任务, 对应的Tag为: salt/run/$jid/new
runner任务结果返回, 对应的Tag为: salt/run/$jid/ret
测试达到预期

配置GitHub Webhook

进入项目配置页面, 选择"Webhooks & Services"左侧导航条, 选择 "Add Webhook", 分别输入如下内容:

Payload URL: http://demo:demo_pass@salt-api-demo.pengyao.org/hook/gitfs/update
输入完毕后, 选择 Add Webhook进行保存

自动更新Gitfs测试

本地clone本项目, 进行如下操作:
  1. git clone git@github.com:pengyao/salt-gitfs-demo.git
  2. cd salt-gitfs-demo
  3. echo "I am a test" > test
  4. git add -A
  5. git commit -m "add test"
  6. git push -u origin master
复制代码

git push后, 在运行eventlisten.py窗口, 有如下输出:
  1. Event fired at Tue May 26 01:04:15 2015
  2. *************************
  3. Tag: salt/netapi/hook/gitfs/update
  4. Data:
  5. {'_stamp': '2015-05-25T17:04:15.495458',
  6. '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"
  7. ......此处省略若干字......
  8. Event fired at Tue May 26 01:04:15 2015
  9. *************************
  10. Tag: salt/event/new_client
  11. Data:
  12. {'_stamp': '2015-05-25T17:04:15.523955'}
  13. Event fired at Tue May 26 01:04:15 2015
  14. *************************
  15. Tag: salt/run/20150526010415522645/new
  16. Data:
  17. {'_stamp': '2015-05-25T17:04:15.529005',
  18. 'fun': 'runner.fileserver.update',
  19. 'jid': '20150526010415522645',
  20. 'user': 'Reactor'}
  21. Event fired at Tue May 26 01:04:19 2015
  22. *************************
  23. Tag: salt/run/20150526010415522645/ret
  24. Data:
  25. {'_stamp': '2015-05-25T17:04:19.393239',
  26. 'fun': 'runner.fileserver.update',
  27. 'jid': '20150526010415522645',
  28. 'return': True,
  29. 'success': True,
  30. 'user': 'Reactor'}
复制代码

检查gitfs仓库文件列表:
  1. salt-run fileserver.file_list
复制代码

输出如下:
  1. - README
  2. - test
复制代码

达到预期

结束语

Reactor系统的加入, Salt插上智能化的翅膀, 轻松甩开竞争对手几条街. 简单易用的Salt REST API接口, 更易于和第三方系统整合, 使Salt轻松成为运维系统自动化引擎.

人生苦短, 我用Salt!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP