使用ansible搭建自动发布系统

  • [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

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

时间: 2024-12-24 04:12:02

使用ansible搭建自动发布系统的相关文章

Nginx DHCP TFTP Kickstart搭建自动安装系统

之前使用Cobbler搭建自动安装系统,最近Cobbler网站http://www.cobblerd.org/无法访问,执行命令cobbler get-loaders下载获取PXE启动需要的文件时报404,即使下载成功,所有文件都为0字节,导致服务器安装系统自动获取到IP地址后卡住.不得已自己想办法解决,重新用Nginx DHCP TFTP Kickstart搭建了一套自动安装系统.Nginx安装和配置都挺简单,代替了Cobbler中使用的Apache. 虚拟环境 网段:192.168.200.

游戏自动发布系统思路

⑴ftp.rsync.shell实现游戏资源自动发布至cdn集群; ⑵利用svn的hooks.python实现游戏代码自动发布至web集群; 游戏自动发布系统思路

RexDeploy-自动发布系统

RexDeploy-自动发布系统 一.简介 RexDeploy是基于Rex开发的一个自动化发布平台.(原生是基于perl脚本构建的,这是第一版,后续会捣鼓出python版和web版本支持) 二.安装需求 * Rex  * DBI(perl模块) * DBD-mysql (perl模块) (运行Linux系统之上) 一键安装方法:(Centos 5.5 和Centos 6.3测试OK) unzip  RexDeploy.zip cd RexDeploy/install /bin/bash  ins

一步一步用jenkins,ansible,supervisor打造一个web构建发布系统

新blog地址:http://hengyunabc.github.io/deploy-system-build-with-jenkins-ansible-supervisor/ 一步一步用jenkins,ansible,supervisor打造一个web构建发布系统. 本来应该还有gitlab这一环节的,但是感觉加上,内容会增加很多.所以直接用github上的spring-mvc-showcase项目来做演示. https://github.com/spring-projects/spring-

搭建PXE服务器,实现无人值守自动安装系统

实验:搭建PXE服务器,实现无人值守自动安装系统 在PXE服务器和新安装的服务器上分别安装http实现均衡负载 建立主从DNS服务器 第一步,先配置DHCP,目的是给需要安装系统的主机分配ip地址 服务器IP地址设为192.168.100.11 [[email protected] ~]# ifconfig eth0 | grep "inet addr" inet addr:192.168.100.11  Bcast:192.168.100.255  Mask:255.255.255.

ansible+jenkins+svn实现生产环境自动发布

ansible+jenkins实战 1.部分机器信息:2.远程执行用户:(ansible机器并没有开通外网哦)3.ansible用到的两个重要角色 /etc/ansible/hosts #hosts文件定义主机与和执行权限 /etc/ansible/roles #roles是任务集合,可在roles下面新建多模块,如tomcat,jdk.yum源,防火墙等,分角色方便管理且灵活 ##Jenkins配置1.新建-自由分格项目项目名称:lbbsSvn配置:(这个svn地址也是内网哦)地址:svn:/

熊猫直播Rancho发布系统构建之路

作者介绍 符杰超,熊猫直播基础架构部高级运维开发工程师.主要负责熊猫直播运维自动化架构平台建设和开发 前言 随着熊猫直播的业务发展越来越快,业务需求的迭代和版本更新需求越来越多,对开发和运维面临以下4个痛点: 项目需求上线越来越多 发布周期比较长,人工操作比较繁琐 发布项目效率和风险的问题,比如平滑发布,切换负载均衡 发布过程没有详细的审计功能 由此,团队内部决定在现有的发布过程上实现开发统一的发布系统平台,实现熊猫直播的运维发布流程化.标准化.自动化为一体的统一发布要求. 下面围绕整个Ranc

从零开始搭建前端监控系统(三)——实现控制iframe前进后退

前言 本系列文章旨在讲解如何从零开始搭建前端监控系统. 项目已经开源 项目地址: https://github.com/bombayjs/bombayjs (web sdk) https://github.com/bombayjs/bombayjs-server (服务端,用于提供api)(未完) https://github.com/bombayjs/bombayjs-admin (后台管理系统,可视化数据等)(未完) 您的支持是我们不断前进的动力. 喜欢请start!!! 喜欢请start!

新闻发布系统,添加新闻+++文件上传

1.新闻发布系统 2.文件上传+++ ①首先在index.jsp的界面上初始化一个表单. <body> <form enctype="multipart/form-data" action="<%=path%>/1.jsp" method="post"> 姓名:<input type="text" name="username"/> 选择文件:<inpu