使用ansible搭建自动发布系统

本文发布时间: 2019-Mar-22
[email protected] 23:23:081. 需求描述1.1 后台开发者的体力劳动互联网公司的后台工程师每天大部分时间都是对着黑黑的屏幕敲命令,敲代码、编译、部署到测试环境、测试、部署到生产环境、灰度升级、临时停掉服务、临时重启服务、发现问题回滚到上一个版本等等如果你是在做一件服务全球用户的事情,如果你的IDC就有四五十个、机器几百台,还搞的定麽?你可能想到写脚本来解决这个问题,不幸的是写脚本会把你拉向另一个深渊。具体原因以后有时间再说后台开发者必须用这样一个系统:能够一键部署、灰度、升级、回滚。之前在YY和QQ都有专门的运维团队做的又鲁棒又fancy的运维系统,现在没有这样的系统了怎么办1.2 相关开源工具列表http://en.wikipedia.org/wiki/Comparisonofopen-source_configurationmanagementsoftware上边链接汇总了相关开源工具,我用了一整天时间几乎把所有的工具都尝试了一遍,经过方方面面的对比,最终选择了老牌unix运维工具:Ansible1.3 系统bash脚本:简单命令组成的脚本ansible的playbook:脚本、命令、copy等组成的类似批处理的手册php:调用ansible的playbook功能html:展示机器列表与进程包,将用户操作、选中的机器列表、进程包送给php这里重点说一下如何使用ansible2. ubuntu下安装ansible官网主页 http://www.ansible.com/sudo apt-get install software-properties-commonsudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo apt-get install ansible测试是否安装成功<pre name="code" class="plain">ansible --versionecho "[192.168.99.81] ansible_ssh_port=[22] ansible_ssh_user=[username] ansible_ssh_private_key_file=/path/to/pem/file | sudo tee > /etc/ansible/hostsansible 192.168.99.81 -m command -a 'whoami'注意上述[]表示这部分是需要替换的变量,实际是不存在[]的3. 优化配置sudo vim /etc/ansible/ansible.cfggathering = explicithost_key_checking = Falserecord_host_keys = Falsescp_if_ssh = Truessh_args = -o PreferredAuthentications=publickey4. 编写playbook总让ansible去一条条执行命令太low,真正用的时候还是要玩儿playbook. 所谓playbook就是说我想做一件事情,分成若干个task;每步执行失败或者重试、或者终止,简单的不得了。4.1 playbook样本举例还是拿升级来举例:创建一个hosts文件echo "192.168.99.83 ansible_ssh_port=22 ansible_ssh_user=devops ansible_ssh_private_key_file=/path/to/pem/file" > /tmp/__hosts.txt~IFYNaj创建一个文件叫做upgrade.yml---- hosts: "{{host}}" remote_user: devops sudo: no gather_facts: False tasks: - name: 1. UPLOAD copy: src={{ item.src }} dest={{ item.dest }} mode=0775 with_items: - {src: "upgrade.sh", dest: "/home/devops/"} - {src: "/home/devops/upload/bin/{{pkg}}", dest: "/home/devops/"} - name: 2. UPGRADE shell: /home/devops/upgrade.sh {{pkg}}调用:ansible-playbook action/upgrade.yml --extra-vars 'host=all pkg=hello.exe' -i /tmp/__host.txt~IFYNaj4.2 关于上传文件的部分- name: 1. UPLOAD copy: src={{ item.src }} dest={{ item.dest }} mode=0775 with_items: - {src: "upgrade.sh", dest: "/home/devops/"} - {src: "/home/devops/upload/bin/{{pkg}}", dest: "/home/devops/"}这几句话的意思是:我要调用copy模块copy本来给src, dest这两个参数就好了,比如 copy: src=/etc/hosts dest=/etc/hosts;但是我想copy好几个文件,需要一个循环,也就是下边的with_items关键词mode表示上传之后权限改成7754.3 关于{{}}这部分这是playbook的变量,表示可以从外部传入的参数。这样可以让做差不多事情的playbook重复使用。参数真正的值由调用时通过--extra-vars传入4.4 关于脚本执行结果bash脚本返回0,ansible的shell模块认为执行成功bash脚本返回非0,ansible的shell模块认为执行失败如果你的脚本成功时候也不返回0,那么请参阅手册怎么处理 :-(


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2020-Jul-13 01:13am
栏目列表