一般情况下,我们部署一套程序到客户服务器,都需要安装很多中间件,如jdk、mysql、redis、nginx等等,而且,很多时候这些中间件是安装在不同主机上的,这样切来切去很容易出错也很繁琐,换一个客户就需要重新安装所有中间件,就造成了很多重复操作,不符合程序猿的工作思想,那么有没有办法实现一键安装呢?有!我们可以用Docker ,那有人会说了,Docker不支持跨主机安装,我们也可以组一个Docker Swarm来实现跨主机安装;也可以用Ansible,本文主要学习研究的就是Ansible。
Ansible和Docker不同,Ansible不会创建一个迷你的虚拟环境,而是一个普通的命令行执行程序。那么就会产生问题了?
我们先思考一下,如果我们不知道Ansible,让我们自己实现一个,我们要考虑哪些问题呢?
1. 安装中间件时需要执行很多命令,那些命令该该如何组织呢?
2. 安装中间件时需要设置配置文件?
3. 跨主机安装时需要登陆到远程主机,如何实现?
基本上,如果我们自己实现的一键安装能够解决上面这些问题,就可以实现一个简单的一键部署工具了。下面我们来看看Ansible中关于这三个问题的答案。
使用Ansible实现一键部署,我们最常面对的就是`yml`文件,Ansible的主要安装脚本就是一个yml文件,里面包含了很多的“安装中间件的命令”当然,这里的命令肯定不是命令行窗口中使用的命令。而是Ansible特有的,如下面的一个安装mysql的task:
---- name: Install Mysql packageyum: name={{ item }} state=presentwith_items:- mysql-server- MySQL-python- libselinux-python- libsemanage-python- name: Configure SELinux to start mysql on any portseboolean: name=mysql_connect_any state=true persistent=yeswhen: ansible_selinux.status == "enabled"- name: Create Mysql configuration filetemplate: src=my.cnf.j2 dest=/etc/my.cnfnotify:- restart mysql- name: Start Mysql Serviceservice: name=mysqld state=started enabled=yes乍一看,完全摸不到头脑,和我们想象的命令相差太远了,对于安装一个中间件,我们头脑中预期的应该是如`cd`,`cp`,`mv`,`echo`....等类似的命令,但上面的内容完全和预期不搭边啊。
不要慌,让我们仔细看一下,很容易看到,在上面有一个`yum`,这不是centos的软件包命令吗,难道这个脚本是这样定义安装过程的(name:xxxx 命令:xxxx 相关参数:xxxx)?——没错,就是这样定义的。
这个问题就很简单了,我们只需要访问它的官网,然后查找文档即可。在官网,我们所谓的命令实际上是模块(module),官方文档很贴心的提供了一个`Module Index`菜单,在这里我们可以看到对命令的一级分类。
- 文档地址: https://docs.ansible.com/ansible/2.9/
如上图,我们看到了Ansible为我们准备好的非常多的Module,从这个列表中,我们能看到有Files modules、Database modules、Network modules等等,Files modules里面就包含了我们常用的解压缩、复制、移动等命令,Database modules里面包含了创建mysql数据库、用户等,具体的自己去看吧,这里就不说了。
通过这两个章节,我们解决了一键部署的命令如何组织,以及如何表示命令的问题。
几乎所有的中间件的安装都需要修改其默认配置,以适用我们的程序,那么在Ansible中应该如何配置呢?Ansible提供了模版`template`,template默认以`.j2`为后缀名。
- name: Create Mysql configuration filetemplate: src=my.cnf.j2 dest=/etc/my.cnfnotify:- restart mysql在该配置中,可以看出是在配置mysql的my.cnf文件,`dest`表示将配置文件放到/etc/my.cnf位置。让我们看一下`my.cnf.j2`文件。
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0port={{ mysql_port }}[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid从上面的代码中,我们看到有个被`{{ }}`扩起来的字符,没错,它就是模版中的变量。既然有用变量的地方就得有声明变量的地方,声明变量的地方一般都在程序的起始部分或者是一个小节的起始位置。具体的这里不再说了,肯定是会有一个声明的地方的,而且写法也不会复杂,一般都是键值对的形式。下面我们开始讨论第三个问题。
答案很显然,你都要远程操作其他主机了,那登陆的过程是肯定不能少的了。那Ansible是怎么登陆的呢?
首先,如果需要登陆其他机器,得知道其他机器的ip地址,根据登陆方式的不同,输入不同的东西验证。在Ansible该怎么做呢?
同样,也是配置。Ansible存在一个inventory文件,该文件可以配置多个主机,可以对多个主机进行分组,可以按组安装中间件。最简单的长如下这样:
[mysql]10.211.55.8[nginx]10.211.55.7[all:vars]ansible_ssh_user=rootansible_ssh_pass=root配置文件看起来很像`ini`配置文件,在上面的配置文件中,我们将.8分组为mysql,.7分组位nginx。各组的ip是可以写多个的,并且同一个ip可以是多个不同组。注意`[all:vars]`节,其中的`all`表示所有组都适用,也可以设置为`mysql`,那么该节的变量仅适用于`mysql`组了。里面的`ansible_ssh_user`,`ansible_ssh_pass`表示登陆远程主机的用户名和密码;Ansible还支持其他登陆方式,具体可以查看官方文档,这里不做描述。
好了,本文对Ansible的介绍基本就到这里了。通过阅读本文,我们知道了Ansible如何跨主机(跨主机时的ip,登陆信息在哪配置),如何执行命令,命令的相关文档怎么查,如何设置中间价的配置,了解了这些知识,我们基本可以磕磕绊绊的完成大部分需要一键部署的需求了。下面在分享一下官方的Example,参照这些Example外加善用搜索引擎,相信一定可以完成工作任务的。
官方 Example地址: https://github.com/ansible/ansible-examples
原文格式更佳
查看原文:学习了解Ansible——一键部署应用程序及相关组件|NGUP的个人技术博客
| 留言与评论(共有 0 条评论) “” |