在前面系统学习了gitlab的相关知识点和安装、配置、流程等demo演示,接下来介绍Ansible这个工具。在此之前可以设想一下十年前的我们是如何对产品进行部署测试的?如果那时候你公司有开发能力,可能会研发出一套部署测试脚本或者系统,去线上部署自己的产品。又或者通过自己的运维团队和开发团队协同将产品部署到线上,但是在很多情况下运维人员只是做一些基础的搭建服务器等工作,而更多涉及到测试部署的工作都是靠开发人员来完成的,这使得开发人员压力山大。开发人员都有一套自己解决部署问题的黑盒,虽然问题完成了,但是问题也同样明显,大家没有一套统一解决问题的框架或者说是部署工具。如果没有一份详细的部署文档去解释开发人员的部署架构原理,那么可能在后期给该工具使用的运维人员带来巨大的时间成本。

而Ansible的出现就是为了解决这个问题,它可以让我们放弃自己原来开发的部署工具。Ansible是一个开源的部署工具,开发语言为Python,并以playbook作为基础部署架构,仅仅依赖系统标配的ssh连接与授权管理,就可以实现远程节点的快速部署。它的模块化部署管理,兼容Linux与Windows平台,所以说Ansible是一个支持全平台,无需编译,仅需要SSH通道的开源部署工具。Ansible的作用就是推送Playbook进行远程节点的快速部署。

Ansible/Chef/Saltstack/Puppet对比

那么你可能就要问了,为什么选择Ansible,而不是Chef、Saltstack、Puppet等这些部署工具呢?

**Chef(厨师)**是一个用Ruby语言编写的自动化部署工具,是典型的C/S架构,因此需要在待部署的目标机器上安装客户端,与服务器端进行通信,才能实现Chef服务器端recipe脚本推送,进而达到远程部署的目的。Chef本身依赖GIt实现版本控制功能,且recipe食谱编写需要良好的编程基础,由于它的语言结构与Ruby类似,所以如果你是运维出身或者没有Ruby相关的编程经验,并不推荐你使用它,因为它的门槛有一点高。

Saltstack是一个用Python语言编写的自动化部署工具,也是典型的C/S架构,因此需要在待部署的目标机器上安装客户端,与服务器端进行通信,进而实现远程部署的目的。加之它的YAML编写规范,不过它的优点在于内部有一个异步服务器,可以为客户端加快文件服务速度,加之它模块化配置管理适用于在大规模的集群下部署,这也是Saltstack在Ansible之前大家广为使用的一款自动化部署工具。

**Puppet(木偶)**是一个用Ruby语言编写的自动化部署工具,也是典型的C/S架构,因此需要在待部署的目标机器上安装客户端,与服务器端进行通信,进而实现远程部署的目的。采取Ruby语法格式的配置文件,因此如果你是运维出身或者没有Ruby相关的编程经验,并不推荐你使用它。

Ansible是一个用Python语言编写的自动化部署工具,无客户端,模块化配置管理,以及Playbook脚本简易的编写规范,它的脚本语言较Chef更易于上手,较Saltstack更缩短运维的时间成本,这些都是我们选用Ansible的理由,但是我个人认为最重要的一点就是Ansible非常符合近几年流行且提倡的敏捷开发概念,我们需要软件开发周期中部署这一环节有一个快速敏捷、高效的工具去加快我们的产品交互,又能兼容我们主流云计算下所使用的基础设施及工具,所以这里选用Ansible作为我们部署的核心工具。

Ansible的优势和应用场景

Ansible的优势

Ansible的优势有以下几点:1、轻量级无客户端(Agentless)。轻量级大大降低了运维成本和潜在的系统安全问题,以及系统资源损耗。Ansible不使用客户端,而是调用SSH连接工具去实现通信的原因在于它较低了部署的难度,如果你之前搞过运维,那么你肯定知道我们如果给系统安装客户端工具,就意味着我们打开了部署机器与服务器端部署的端口,并无形的占用了系统的CPU、内存、磁盘等资源。假设我们的系统运行在一台安装了java的主机上,我们在安装java软件的同时又安装了某部署客户端,这势必就存在了一个潜在的安全问题,我们给系统留了一个后门,这个后门会不会被人利用用来攻击我们的产品主机,作为Ansible使用的ssh系统连接工具,实现部署通讯,则完美地解决了这个潜在的安全问题的同时,还减轻了我们多余的系统资源损耗。2、Ansible开源免费、学习成本低、快速上手。Ansible开源免费使得一些大中小公司都可以把它作为自动化部署工具,它的语法结构非常简单,非常适合初学者快速上手。3、Ansible使用Playbook作为核心配置架构,统一的脚本格式批量化部署。Ansible将自己YAML脚本的编写架构命名为Playbook,这样就给大家定义了一个统一的编写框架,使我们就可以遵循官方的说明与语法文档对我们的产品逻辑进行编写。4、Ansible完善的模块化扩展,支持目前主流的开发场景。不管你使用的是Linux系统还是Windows系统,不管你开发使用的是java语言还是python语言,不管你的业务逻辑复杂还是简单,Ansible都已经预先准备好了相应的模块化扩展,去匹配你的部署需要,保证Ansible具有一个庞大的平台去兼容所有产品不同的技术细节。5、Ansible具有强大的稳定性和兼容性。Ansible具有强大的稳定性和兼容性得益于它本身的开发语言为Linux系统默认自带的python开发语言,以及自带的默认通信工具ssh远程连接工具,依托默认语言和工具,所以Ansible就可以不需要安装额外的工具就拥有了其他工具无法比拟的稳定性和兼容性优势。6、Ansible具有活跃的官方讨论社区,便于troubleshotting(重大问题)与debug讨论。Ansible具有活跃的官方讨论社区,便于troubleshotting(重大问题)与debug讨论,保证我们有一个较为可靠的技术支持平台,可以说Ansible适用于目前市面上大家所能见到的所有系统。Ansible自带的系统级别模块可以轻易地去处理我们场景的部署问题,而且它的可扩展性允许我们可以自己编写Python模块去实现对某一实例的模块化配置管理,加之Ansible传输依赖是Linux原生的ssh协议,我们几乎不会吹飞之力就能在需要的场景下使用Ansible作为我们的部署工具。

也就是Ansible的出现可以说是在原来部署工具的基础上提高了部署效率,变得更加容易上手,以及较高的扩展性,使得它天生就符合我们敏捷开发所提倡的迅速、敏捷、高效的特质,因此是作为Jenkins+Ansible+Gitlab自动化部署的不二选择。

Ansible配合Virtualenv安装配置

接下来将通过demo演示来介绍Ansible配合Virtualenv在CentOS7系统上如何进行安装和配置。在日常的自动化部署工作中,保证Ansible在一个稳定版本下去应用于我们的产品交付,是我们作为运维工作人员需要关注的问题。Ansible作为一个用Python编写的工具,我们应当按照一个较为稳定的Python语言作为环境依赖,并在其Python包管理工具下安装我们项目需要定制的Python模块。假设此时我们的系统中有其他工具也会使用到Python,这就会造成Python版本的混乱,如何保证我们项目所依赖的Python仅仅为自己使用呢?此时可以使用Virtualenv工具来保证Ansible所使用的Python环境是独立的。注意这里是Python3.6和Ansible2.5搭配使用,然后使用Virtualenv来保证该系统仅被Ansible2.5使用。

CentOS7安装Ansible2.5+Python3.6步骤

Ansible在CentOS7上安装有两种模式:第一种、YUM包管理安装。使用的命令为:yum -y install ansible,安装完成后Ansible就成了一个系统全局下的工具,此时系统下任意用户都可以使用它,虽然这种安装非常便捷,但也缺点明显突出。假设我们当前系统下的其他用户安装了针对其他工具的Python安装模块,那么就会与Ansible下的Python模块相冲突,造成潜在的安全问题,原因就是在全局状态下,Python的模块安装后都会保存在同一个Python扩展目录下,当我们的Ansible用到的模块与其他工具用到的模块一致时,但版本不同,这样势必会造成Python模块管理混乱,最终影响到我们产品的部署交付。所以Ansible公司为了解决这类问题,特意在官方github下面保存了Ansible的源代码仓库,我们可以克隆该仓库到CentOS7主机中,配合Virtualenv去实现Ansible特定版本的独立环境创建,以保证Ansible在一个独立的Python环境下运转,这就是第二种方式:Git源代码安装(推荐)。使用的命令为:git clone https://github.com/ansible/ansible.git。话不多说,正式进入到搭建工作中。

第一步,在CentOS7系统内预先安装Python3.6版本。

第二步,在CentOS7系统内安装Virtualenv虚拟环境,用来隔离Python与Ansible的环境。使用pip install virtualenv命令即可实现快速安装。

第三步,在CentOS7系统内创建Ansible账户,并使用该账户安装Python3.6版本Virtualenv的实例。可以使用useradd deploy命令去创建一个名为deploy的Ansible账户,并使用su - deploy命令进入该账户的系统命令行界面,进入到deploy账户的命令行以后,使用virtualenv -p /usr/local/bin/python3.6 .py3-a2.5-env 命令创建python3.6版本下的虚拟环境,其中的-p /usr/local/bin/python3.6用来指定Python的版本为python3.6的版本,.py3-a2.5-env 用来表明我们去创建一个该名称下的Virtualenv实例目录。

第四步,在安装Python3.6和Virtualenv以后,需要使用Git源代码来安装Ansible2.5版本,可以先进入第三步中创建的Virtualenv实例目录,使用命令为cd /home/deploy/.py3-a2.5-env,然后使用git clone https://github.com/ansible/ansible.git命令去克隆安装Ansible源代码到本地,接着使用cd ansible命令进入ansible目录,然后使用git checkout stable-2.5命令切换ansible安装版本为稳定的2.5版本。

第五步,在安装完Ansible2.5版本后,需要加载Python3.6的Virtualenv虚拟环境,可以使用命令source /home/deploy/.py3-a2.5-env/bin/active去加载我们的Python3.6Virtualenv虚拟环境。

第六步,在加载完Python3.6的Virtualenv虚拟环境后,需要去安装Ansible下的Python依赖包,可以使用如下命令去下载安装一些依赖包,以保证Ansible能正常加载使用:

1
pip install paramiko PyYAML jinja2

第七步,在安装Ansible的依赖包后,就可以直接在Python3.6的Virtualenv虚拟环境下加载ansible2.5,使用的命令为source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q

第八步,在加载完ansible2.5版本后,需要使用ansible --version命令来验证ansible2.5是否安装成功。出现版本信息即表示ansible安装成功。

CentOS7安装Ansible2.5+Python3.6实操

注意你可以将ansible和gitlab搭建在同一台虚拟机上,或者是分开搭建都是可以的。
第零步,环境预配置。首先启动本地虚拟机,然后获取到它的IP地址,然后打开git bash或者xshell工具,使用ssh@IP命令登录到该虚拟机。开始执行一系列命令:

1
2
3
4
5
systemctl stop firewalld  #关闭firewalld防火墙
systemctl disable firewalld # 禁用防火墙开机启动服务
vi /etc/sysconfig/selinux # 设置selinux值为disabled
reboot # 重启系统
getenforce # 检查selinux策略是否已为disabled状态

第一步,在CentOS7系统内预先安装Python3.6版本。使用的命令为:

1
wget http://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz

如果现实无法连接到Python官网,原因你懂得,因此可以使用其他源进行安装,这里推荐一个可以使用命令为:

1
wget https://npm.taobao.org/mirrors/python/3.6.5/Python-3.6.5.tar.xz

然后使用tar xf Python-3.6.5.tar.xz命令去解压当前的Python编译包。接着使用命令cd Python-3.6.5进入到该Python包内。先使用yum -y install openssl-devel命令来安装openssl依赖,然后使用./configure --prefix=/usr/local/ --with-ensurepip=install --with-ssl --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"命令去设定当前Python编译的一些参数值。--prefix=/usr/local表示将当前Python3.6.5安装到/usr/local目录下,--with-ensurepip用来安装pip包管理工具,--enable-shared参数用来配置Python3.6.5匹配当前系统的参数,--with-ssl参数用来设置默认安装的软件涉及到ssl的功能时是可用的。如果在安装过程出现下面的信息:

说明本机缺少gcc编译环境,可以使用yum install -y gcc命令来安装gcc编译环境,然后再次执行上述编译命令。解决BUG后继续在Python-3.6.5包内执行make && make altinstall命令去完成编译(执行需要一定时间,请耐心等待),并将编译好的文件安装到/usr/local目录下,如果最后出现下面的信息:

1
2
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [altinstall] 错误 1

说明当前环境缺少zlib依赖包,可以使用yum install zlib* -y命令来安装依赖,之后继续执行make && make altinstall命令,当出现下图所示结果时,则表明Python3.6.5已经成功安装在/usr/local目录下:

第二步,在CentOS7系统内安装Virtualenv虚拟环境,用来隔离Python与Ansible的环境。由于此处安装的是Python3.6.5的版本,因此对应的pip包管理工具的名称为pip3.6,所以先使用which pip3.6命令查看pip3.6这个命令的路径:

1
2
[root@localhost Python-3.6.5]# which pip3.6
/usr/local/bin/pip3.6

既然已经知道了pip3.6工具的对应路径,那么可以给这个pip3.6工具设置一个软连接(所谓的软连接其实就是windows下的快捷方式),使用的命令为:

1
[root@localhost Python-3.6.5]# ln -s /usr/local/bin/pip3.6 /usr/local/bin/pip

这样我们就可以使用pip来代替pip3.6,但实际上调用的还是pip3.6这个包管理工具。接着使用pip install virtualenv命令去安装virtualenv依赖工具,如果下载速度非常慢,建议使用下面的命令:

1
[root@localhost Python-3.6.5]# pip install virtualenv -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

第三步,在CentOS7系统内创建Ansible账户,并使用该账户安装Python3.6版本Virtualenv的实例。可以使用useradd deploy命令去创建一个名为deploy的Ansible账户:

1
2
[root@localhost Python-3.6.5]# useradd deploy

并使用su - deploy命令进入该账户的系统命令行界面:

1
2
3
[root@localhost Python-3.6.5]# su - deploy
[deploy@localhost ~]$

进入到deploy账户的命令行以后,使用virtualenv -p /usr/local/bin/python3.6 .py3-a2.5-env 命令创建python3.6版本下的虚拟环境,其中的-p /usr/local/bin/python3.6用来指定Python的版本为python3.6的版本,.py3-a2.5-env 用来表明我们去创建一个该名称下的Virtualenv实例目录:

1
2
[deploy@localhost ~]$ virtualenv -p /usr/local/bin/python3.6 .py3-a2.5-env

而且你看到它会输出这么一条信息creator CPython3Posix(dest=/home/deploy/.py3-a2.5-env, clear=False, global=False),说明我们这个虚拟环境存在于/home/deploy/目录下。

第四步,在安装Python3.6和Virtualenv以后,需要使用Git源代码来安装Ansible2.5版本,可以先进入第三步中创建的Virtualenv实例目录,使用命令为:

1
2
3
[deploy@localhost ~]$ cd /home/deploy/.py3-a2.5-env/
[deploy@localhost .py3-a2.5-env]$

先使用which git命令检查你是否已经安装了git,如果没有则需要退出deploy用户,使用root账户进行安装,相应的安装步骤如下:

1
2
3
4
5
6
7
[deploy@localhost .py3-a2.5-env]$ which git  # 检查是否安装git
/usr/bin/which: no git in ......
[deploy@localhost .py3-a2.5-env]$ su - root # 以root身份登入
[root@localhost ~]# yum -y install git nss curl # 安装git及其依赖
[root@localhost ~]# su - deploy # 以deploy身份登入
[deploy@localhost ~]$

然后使用下面的命令去克隆安装Ansible源代码到本地:

1
2
[deploy@localhost ~]$ git clone https://github.com/ansible/ansible.git

第五步,使用source /home/deploy/.py3-a2.5-env/bin/activate命令去加载我们的Python3.6Virtualenv虚拟环境。(前面出现(.py3-a2.5-env) 则表示已经进入到我们的虚拟环境之中)

1
2
3
[deploy@localhost ~]$ source /home/deploy/.py3-a2.5-env/bin/activate
(.py3-a2.5-env) [deploy@localhost ~]$

第六步,在加载完Python3.6的Virtualenv虚拟环境后,需要去安装Ansible下的Python依赖包,可以使用如下命令去下载安装一些依赖包,以保证Ansible能正常加载使用:

1
2
pip install paramiko PyYAML jinja2

如果下载速度非常慢,那么可以使用镜像,则相应的命令为:

1
2
pip install paramiko PyYAML jinja2 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

第七步,需要将前面下载的ansible源代码移动到Python3.6的Virtualenv虚拟环境下。先使用ll查看一下该文件的权限是不是775,且用户和组均为deploy:

1
2
3
4
(.py3-a2.5-env) [deploy@localhost ~]$ ll
总用量 4
drwxrwxr-x 13 deploy deploy 4096 4月 22 19:41 ansible

如果不是,用root用户赋予该文件及其子文件775权限和更改文件及其子文件用户及组,使用的命令为chmod -R 775 ansiblechown -R deploy.deploy ansible。之后开始移动ansible文件,使用的命令为:

1
2
(.py3-a2.5-env) [deploy@localhost ~]$ mv ansible .py3-a2.5-env/

第八步,,使用下面的命令进入到Python3.6的Virtualenv虚拟环境下,并进入到ansible这个源代码目录:

1
2
(.py3-a2.5-env) [deploy@localhost ~]$ cd .py3-a2.5-env/ansible/
(.py3-a2.5-env) [deploy@localhost ansible]$

然后使用下面的命令切换ansible安装版本为稳定的2.5版本。

1
(.py3-a2.5-env) [deploy@localhost ansible]$ git checkout stable-2.5

在安装Ansible的依赖包后,就可以直接在Python3.6的Virtualenv虚拟环境下加载ansible2.5,使用的命令为:

1
(.py3-a2.5-env) [deploy@localhost ansible]$ source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q

第九步,在加载完ansible2.5版本后,需要使用ansible --version命令来验证ansible2.5是否安装成功。出现版本信息即表示ansible安装成功:

1
2
3
4
5
6
7
8
9
(.py3-a2.5-env) [deploy@localhost ansible]$ ansible --version
ansible 2.5.15 (stable-2.5 4f5084d9d2) last updated 2019/04/23 18:20:44 (GMT +800)
config file = None
configured module search path = ['/home/deploy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/deploy/.py3-a2.5-env/ansible/lib/ansible
executable location = /home/deploy/.py3-a2.5-env/ansible/bin/ansible
python version = 3.6.5 (default, Apr 22 2019, 15:23:54) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
(.py3-a2.5-env) [deploy@localhost ansible]$

至此我们已经在Ansible主机下完成了Python3.6虚拟环境下安装ansible2.5版本,确保ansible在一个独立的环境下正常稳定的运转。