如何快速一键部署应用到服务器:ansible介绍

0.引入

相信大家都有这样的经历,就是用Jenkins部署应用时会非常慢,因为Jenkins是去git仓库拉取最新代码,然后打包分发到指定的服务器上,如果你打包后的jar包体积还比较大的话,上传jar包都会花费好长一段时间。所以这种传统的部署方式实在是有点不够极客。

今天我就给大家介绍一种我最近在使用的部署应用的方式,使用ansible一键部署应用到服务器上。用ansible做好相应配置后,基本上只需要一个回车键,你所有想要部署的应用都可以部署成功。

在介绍ansible之前,我想先说说我对ansible的理解。以我的理解,ansible就是一个可以在本地执行远程服务器上命令的命令行工具。它没有界面,就是通过配置文件来工作。想必在知道ansible之前你也有过在自己的个人电脑上执行远程服务器命令的想法。比如我只是想看一下远程服务器上磁盘的容量,但是又不想登录上去,我们都知道ssh命令支持一些简单的操作。比如:

1
ssh root@192.168.1.1 "df -h"

这样就可以不用登录服务器从而知道远程服务器磁盘的剩余大小了。特别是你需要看很多台服务器的磁盘大小时,频繁登录服务器进行操作着实会有点麻烦。所以这种需求确实是存在的,并且也有人解决了类似这种批量操作远程服务器的需求,比如就有人开发了ansible。ansible是一个用Python写的命令行工具,所以在安装之前请确保你的电脑上有Python(一般Mac笔记本都会自带Python)。

以上是我的理解,在我还没有完全介绍ansible之前,我想请你猜想一下它需要具备什么功能,这通常会让你的学习效果更好。

你可能会想,它要是能一键部署应用到多台服务器就好了,这些服务器的信息可能需要通过一个配置文件提供。部署的时候必然涉及执行脚本,所以ansible也需要具备执行远程脚本的能力。

好了,就不卖关子了,让我们正式开始ansible的学习。

1.快速安装ansible

因为ansible是Python写的,所以也可以通过pip来安装:

1
pip install ansible

2.临时执行命令

在ansible中有两种执行命令的方式,一种是直接写在命令行中的,是临时性的;一种是把命令写在配置文件中,这个配置文件就叫做playbook。我们先介绍第一种简单的临时性命令。

  • 命令的组成

img

其中command是默认模块,所以你也可以省略-m参数。比如我们执行如下命令:

1
ansible 127.0.0.1 -a 'who'

可以得到类似如下输出:

1
2
3
4
127.0.0.1 | CHANGED | rc=0 >>
admin console Mar 27 09:01
admin ttys000 Mar 27 09:01
admin ttys001 Mar 27 09:02

前面不是说ansible支持在多台服务器上执行命令吗,那我要同时在两台服务器上执行命令是不是该这样写啊:

1
ansible 127.0.0.1 192.168.1.2 -a 'who'

实际上如果你要真这么做的话,是会报错的,毕竟这也不现实,如果你要在100台服务器上执行同样的命令不是要一次性在一条命令上写100个服务器的地址,那样容易出错也不方便。所以ansible提供了一个保存服务器地址的配置文件,它就是/etc/ansible/hosts。

你只要像下面这样编辑它就可以用了:

1
2
3
4
[remote]
192.168.1.100
192.168.1.101
192.168.1.102

然后你就可以通过临时性的命令执行多台远程服务器上的命令了:

1
ansible remote -a 'df -h'

也就是把原来放服务器地址的地方换成hosts文件中中括号对应的名字就可以了。

3.playbook

上面这种临时性的命令想必你也可以看出来还有一个缺点,虽然可以执行多台服务器的命令了,但是每次只能执行一条命令,这对于经常要在服务器上进行安装软件或者部署服务器等复杂操作的同学来说确实不是一个好消息。但是好消息马上就来了,那就是playbook要登场了!这个playbook官方给的定义是:

‘plays’ 好似音符,playbook 好似由 ‘plays’ 构成的曲谱,通过 playbook,可以编排步骤进行多机器的部署,比如在 webservers 组的所有机器上运行一定的步骤, 然后在 database server 组运行一些步骤,最后回到 webservers 组,再运行一些步骤,诸如此类.

“plays” 算是一个体育方面的类比,你可以通过多个 plays 告诉你的系统做不同的事情,不仅是定义一种特定的状态或模型.你可以在不同时间运行不同的 plays.

所以你可以简单的认为,playbook就是把我们准备要执行的多条命令写在一个配置文件中,由ansible帮我们执行。而且playbook还是yml文件格式的,对于开发者来说,这个文件格式应该很熟悉,所以编写起来也不会那么陌生了。

我来说一个我用到的playbook配置:

1
2
3
4
5
6
7
8
9
10
11
12
- hosts: remote1
tasks:
- name: 部署服务1
shell: sh/restart-1.sh; sh/restart-2.sh
args:
chdir: /home/app
- hosts: remote2
tasks:
- name: 部署服务2
shell: sh/restart-1.sh; sh/restart-2.sh
args:
chdir: /home/app

这里的hosts对应要填的名字就是你hosts文件中用中括号括起来的名字,而tasks就是你要执行的任务,我这里使用了shell模块,并且提供了一个更改工作目录的参数chdir,执行的命令中间也可以使用“;”、“&”或者“|”。我这里是执行远程服务器上的一个启动服务的脚本。

关于playbook远不止shell这样一个模块,关于playbook的其他模块建议你查阅官网找到你需要的去学习。

好了,编辑完一个playbook之后,我们怎么使用它呢,这里就需要用ansible的另一个命令关键字:ansible-playbook,它就是专门用来执行playbook的。配合着上面我们写的playbook,我们可以这样来运行它:

1
ansible-playbook playbook.yml

然后你要执行的命令就会在远程服务器上跑起来了,而这些你都不用登录一次远程服务器,是不是很方便鸭。

4.结语

说了这么多,那ansible到底解决了什么问题呢,它解决的就是一个减少运维过程中简单重复的工作的问题。我们可以把很多需要开发人员或者运维人员执行很多次但又很繁琐的东西通过这个工具一键完成,大大减轻我们工程师的工作压力,并且增加我们的生命。


如何快速一键部署应用到服务器:ansible介绍
https://www.chuckfang.com/2020/03/15/ansible/
作者
方程
发布于
2020年3月15日
许可协议