使用ansible搭建自动发布系统

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

官网主页 http://www.ansible.com/

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,那么请参阅手册怎么处理 :-(

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
参见: MacBook Pro is slow to start and shutdown 解决启动不了 mac 电脑固态硬盘方法: 1 .  启动时按 cmd+S ,进入 Single User Mode 2 .  在 :/ root# 下 输入命令:     mount -uaw     sudo chown root:admin                                 / (enter password when asked)      sudo kextcache -sys
先来说说这个坑爹的问题,其实本来我是没注意到的,因为程序跑起来一切都正常。但是在tomcat启动时飞速打印log时,在中间“隐藏”了一个错误: 2015 - 02 - 15 16 : 03 : 22 [ catalina-exec- 4 : 2202 ] - [ DEBUG ] [org.springframework.beans.TypeConverterDelegate] Original ConversionService attempt failed - ignored since Propert
上一篇: MySQL 安装(RPM安装模式)及目录结构 本篇使用二进制模式安装: 查看当前是几位系统 :file/sbin/init 各下载地址: Mysql官网下载:         http://dev.mysql.com/downloads/mysql/  (默认选择当前系统)         http://dev.mysql.com/downloads/mirrors.html   (其他镜像地址) Oracle官方下载: https://edelivery.oracle.com/ FTP下载:
mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护 1 设置副本集 #!/bin/bash #mongodb 进入client 并use admin cd /usr/mongodb/bin MongoDB='./mongo 192.168.1.7:37017' $MongoDB EOF use admin rsconf={         "_id" : "Job001",         "members" : [            
problem: Given a linked list, swap every two adjacent nodes and return its head.For example,Given 1-2-3-4, you should return the list as 2-1-4-3.Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself ca

[置顶] apache2优化配置总结 - 2015-04-07 11:04:18

apache2优化配置总结 运行和测试环境   Ubuntu server 12.04 LTS 配置参数调整 配置文件 一般在/etc/apache2/下    apache2.conf       conf.d/secrity     default.conf  下面我写到的配置参数都存在在这几个文件中 1.hostnamelookups  off  域名查找 开启这个会增加AP的负担, 减慢访问速度 建议关闭 2. sethandler server-status  关闭这个否则暴露信息. 3.all
本文属于那种跟着我一步一步来的类型文章。 laravel和composer这些概念啊,好处啊,我就不多说了。不知道的建议先弄懂,goole一下就知道了! 安装步骤 1.安装composer 我是全局安装(Globally):在linux终端执行 curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 其实上面两段代码的意思,就是下载composer,phar 然后讲它移动到你的bin
今天我们来看看Dynamics CRM 2015的系统升级,对于新系统的升级,我们有两种升级方法:1)在现有系统中通过Dynamics CRM 2015安装包对旧系统进行升级,2)将旧系统迁移至新系统中。在这篇文章里,我们采用第二种方法,当然,这也是微软推荐的方法。 在升级系统之前,我们要做好一系列的准备工作。在之前的博文中,我也提到了很多新系统中的Feature,如果没有在End User做好十足的准确之前,我是不建议大家去升级现有系统。在升级Dynamics CRM 2013 系统之前,我们必须为其安

关于laravel错误解决方案 - 2015-04-07 11:04:09

2015-3-13 晚 9:13  运行laravel时发生一个错误Indirect modification of overloaded element of BbsArticle has no effect ; 错误代码:    foreach ($article[ 'reply' ] as $key = $value){             $article[ 'reply' ][$key][ 'reply_time' ] = substr($value[ 'created_at' ],0,10
前言         题目说的有点长,其实就是以下几件事,第一是让Shell命令可以在程序内执行,然后将执行结果传递给变量,从而可以进行后续的事务处理,第二是使用nmap命令获取当前局域网内所有在线IP和开放的端口,最后就是对nmap获得的结果进行处理,得到只有IP和端口的结果。         Linux命令行的强大功能相信使用Linux的人都知道,一个命令等于你在windows用几百行甚至上千行的代码量才能实现,所以,如果很好的利用shell命令,可以说是事半功倍。         而要充分利用she