1分钟了解Ansible企业应用场景

2020-04-26 15:01:35 浏览数 (1)

运维自动化过程其实是简化对象操复杂度过程,即命令执行和文件传输的便利化过程,是开发和运维从分立对抗到合作共赢的过程. Ansible 做为当下运维自动化工具如火如荼的发展了很多年,但哪种使用方式是正确的姿势呢?本文将为大家揭开某公司互联网中心的 Ansible 应用场景

我们从如下4个角度来进行本次分享:

1、互联网中心自动化工具演化史

fabric、ansible、puppet、saltstack作为同时代的自动化工具,各有优劣:

  • fabric:四者中最为轻量,但应对多/大项目,会明显“力不从心”
  • puppet:老牌自动化工具,四者中最重的自动化工具,ruby语言实现
  • saltstack:即puppet之后的新兴运维工具,当下 运维必备开发技能的python语言实现
  • ansible:最新出现的无client客户端工具,非C/S架构。python实现,以去中心化理念推广盛行。也是目前最为火热的运维自动化工具,github 的fork和star数是第二名 saltstack 和第三名puppet两者之和还要多。

1.1 流程化、标准化是自动化的前提

在整个2016年,运维的工作重心和难点,很大一部分精力都是树立标准规范,对抗个人原则。

早期开发同学使用的是fabric来做运维工具,在运维到来之前,开发的所有选择都是合理的。运维所要发挥的价值是让事情更加专业化。

所幸,运维及时发现 fabric 在多/大项目的应对上不足以承载规模,因此,第一时间将所有逻辑迁移至 ansible。这个选择太正确的,在随后快速发展中,ansible相继承载了三十余项目。

2018年是运维自动化工具的起飞年,Ansible 结合 Jenkins 实现了初步的流程一站化,将运维和测试环境打通。

而在2019年的web化和智能化历程中,运维自研平台和测试自研平台,终于将CICD完整闭环,从开发提交版本发一刻开始,到版本是上线生产为止,所有的环境均归纳到CICD闭环中,均有完整流程和轨迹可供追溯

1.2 版本流转流程

和绝大多数公司的使用场景一样,随着互联网技术的逐步成熟,这样的流程基本已经是标配。互联网技术成熟的标志之一就是某个技术热点的消失

  1. Developers 开发环境开发版本
  2. 提交 gitlab
  3. 触发 jenkins打包
  4. 结合自动化工具如 Ansible ,发布更新

有运维开发能力的公司往往会将各平台相互打通,实现无人干预。

1.3 AutomaticTool架构规划

我们特意分了2大模块:

  • 应用发布
  • 应用部署

应用发布目录主要存放运维自定义或编写的yml文件,而应用部署则主要针对 galaxy 下载或二次开发的外部引用模块。

针对应用发布模块,我们也做了很多约束和目录规范「但其实是无效的」:

  • 各目录功能使用定义,如 files 目录存放普通文件;scripts存入执行脚本; tasks存放临时任务脚本等;
  • 配置自动远程备份;
  • 应用部署目录下的配置不能覆盖

2、用Ansible做了什么?

目前实现的功能有如下这些:

  • 系统初始化(目录,用户,软件包)
  • Nginx conf配置自动生成
  • 业务应用环境初始化部署
    • 一键安装指定版本
    • 全量生成全服配置
    • 应用权限自动刷新
  • 自动化发布(console)
    • git打通
    • 自动打包&分发
    • 自动备份
    • DB更新自动检测及备份
  • DB自动更新
  • Ansible与K8S结合初探(测试)

2.1 Ansible 与应用部署

我们找一些比较经典的场景做细节探究

想象这么一个场景,新申请的服务器需要安装nginx、php等应用,你用Ansible会怎么做。

全手工写YAML playbook是一种不错但肯定不是最优路径的办法。正确的姿势如图:

  1. 从 glaxy 下载role
  2. 修改 roles
  3. 使用

对的,就是这么简单

2.2 Ansible 与发布

发布通常要完成的要素有如下几个方面:

  1. 打包
  2. 分发包
  3. 备份旧程序
  4. 停进程
  5. 更新程序
  6. 起进程

该 YAML只是其中一个范例,最大的特点是,其它数十个项目的发项代码和它有着惊人的相似处,修改维护成本很低,新增我通常的做法是复制一个文件,花几分钟修改下就能够满足要求了。

秘决在哪里呢?前提有提到流程化、标准化是自动化的前提

2.3 Ansible 与 nginx 配置生成

Nginx的大家都会,但正因为大家都会,也同步带来了很多风格问题。

想像这么一个场面,大家都能修改nginx配置,每个人都在修改,每个人都留下了自己的想法和气味,但最终的结果可想而知。最终nginx配置再也没人能懂,再也没人能维护了。

我们就经历了这样的惨剧,最终不得已,终于下狠心,将所有的nginx配置推翻重来。就有了现在的这种方式。使用 Ansible 命令,通过读取模板配置来动态生成 Nginx 的配置。

2.4 Ansible 与 Spring Boot

这里不想讲太多,具体直接看代码,逻辑上都很简单,只是在结合使用时,有一些接口的处理比较麻烦。

2.5 Ansible 与 web 化

如图,是我们当下使用的平台。在 Ansible 的调用上也并不优雅。主要是API接口不够完善,各模块的使用场景并非每个人都很熟悉。

2.6 Ansible使用之初始化

  • 系统初始化
代码语言:javascript复制
ans;ansible-playbook init.yml
  • 安装部署 proxy 应用
代码语言:javascript复制
ans;ansible-playbook sysinit/NginxProxy.yml
  • 安装部署 web 应用
代码语言:javascript复制
ans;ansible-playbook sysinit/NginxWeb.yml
  • 生成 Proxy Nginx 配置
代码语言:javascript复制
ans;ansible-playbook sysinit/NginxProxy.yml --tags “nginx_vhost_generate"
  • 生成 Web Nginx 配置
代码语言:javascript复制
ans;ansible-playbook sysinit/NginxWeb.yml --tags “nginx_vhost_generate,php_conf_generate"
  • 部署 Rabbit MongoDB等
代码语言:javascript复制
ans;ansible-playbook sysinit/Rabbitmq.yml
ansible-playbook sysinit/Mongodb.yml
…

2.7 Ansible使用之代码发布

  • PHP类
代码语言:javascript复制
$ ansible-playbook all.yml --extra-vars “project=all git_commit=a7db8750e7fb8b3845a6e5d76c6b7b6843f5bacd"
$ ansible-playbook yunying.yml --extra-vars "project=yunying git_commit=c4d753ae0e29f03961d8093760eeb9b2bdb08241"
$ ansible-playbook h5.yml --extra-vars "project=h5 git_commit=6c99ce066f7cc7134f3c5fb51d3fbcd0366e8c96"
$ ansible-playbook static.yml --extra-vars "project=static git_commit=d3ebf117e19b656eea6dfb2fe1e3a04aaa43ceb1”
…
  • JAVA类
代码语言:javascript复制
$ ansible-playbook java-cloud.yml --extra-vars "project=outer git_commit=d3sdfv117e19b656eea6dfb2fe1e3a04aaa43ceb1”
$ ansible-playbook java-cloud.yml --extra-vars "project=account git_commit=d3sdfv117e19b656eea6dfb2fe1e3a04aaa43ce2ds”
…

大家可以看到,所有项目的发布项目几乎都是类似的。

3. Ansible OR Shell

使用 Ansible 工具最大的好处,我依然认为是能够打平整个团队的整体输出质量。

0 人点赞