- [email protected]
- 2015-2-3 23:23:08
1. 需求描述
1.1 后台开发者的体力劳动
- 互联网公司的后台工程师每天大部分时间都是对着黑黑的屏幕敲命令,敲代码、编译、部署到测试环境、测试、部署到生产环境、灰度升级、临时停掉服务、临时重启服务、发现问题回滚到上一个版本等等
- 如果你是在做一件服务全球用户的事情,如果你的IDC就有四五十个、机器几百台,还搞的定麽?
- 你可能想到写脚本来解决这个问题,不幸的是写脚本会把你拉向另一个深渊。具体原因以后有时间再说
- 后台开发者必须用这样一个系统:能够一键部署、灰度、升级、回滚。之前在YY和QQ都有专门的运维团队做的又鲁棒又fancy的运维系统,现在没有这样的系统了怎么办
1.2 相关开源工具列表
http://en.wikipedia.org/wiki/Comparisonofopen-source_configurationmanagementsoftware
上边链接汇总了相关开源工具,我用了一整天时间几乎把所有的工具都尝试了一遍,经过方方面面的对比,最终选择了老牌unix运维工具:Ansible
1.3 系统
- bash脚本:简单命令组成的脚本
- ansible的playbook:脚本、命令、copy等组成的类似批处理的手册
- php:调用ansible的playbook功能
- html:展示机器列表与进程包,将用户操作、选中的机器列表、进程包送给php
这里重点说一下如何使用ansible
2. ubuntu下安装ansible
sudo apt-get install software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install ansible
测试是否安装成功
<pre name="code" class="plain">ansible --version echo "[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/hosts ansible 192.168.99.81 -m command -a 'whoami'
注意上述[]表示这部分是需要替换的变量,实际是不存在[]的
3. 优化配置
sudo vim /etc/ansible/ansible.cfg gathering = explicit host_key_checking = False record_host_keys = False scp_if_ssh = True ssh_args = -o PreferredAuthentications=publickey
4. 编写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~IFYNaj
4.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表示上传之后权限改成775
4.3 关于{{}}这部分
这是playbook的变量,表示可以从外部传入的参数。这样可以让做差不多事情的playbook重复使用。参数真正的值由调用时通过--extra-vars
传入
4.4 关于脚本执行结果
- bash脚本返回0,ansible的shell模块认为执行成功
- bash脚本返回非0,ansible的shell模块认为执行失败
如果你的脚本成功时候也不返回0,那么请参阅手册怎么处理 :-(
时间: 2024-12-24 04:12:02