Ansible实战之博客站点部署

糖豆贴心提醒,本文阅读时间4分钟

本篇文章记录通过部署一个博客站点来进行ansible实战的例子。

案例分为四个部分,第一部分是手动部署一个mezzanine站点;第二部分是通过ansible来部署mezzanine;第三部分是使用角色来重写第二部分的代码;第四部分则是ansible与Docker一起使用的效果。(注: mezzanine是一个基于django的CMS系统,有点类似wordpress,官网地址在这里 ,不过我们的重点是ansible来部署它,而不是去深究它自身的运行机制)。

1 手动搭建mezzanine

在ansible等配置管理和代码部署的工具出现之前,我们一般是要手动去部署一个系统的。mezzanine算是比较简单化的系统了,我们可以通过下面的步骤在自己的电脑上搭建一个博客系统(我这里的测试环境是macos10.12)。

先安装一下virtualenv。

接着创建一个环境venv并激活,然后安装mezzanine模块,接着创建工程,初始化数据库和工程。输入管理员用户名密码以及邮箱等信息,运行runserver命令就会默认监听在本地的8000端口了,打开浏览器输入http://127.0.0.1:8000即可访问了。

这是一个开发者模式运行的django应用,架构如图1所示:

当然如果要部署到正式环境,有以下几点要考虑:

  • mezzanine默认使用的是sqlite数据库,在正式环境我们希望是一个功能更完善的数据库,比如postgresql或者mysql。
  • 同时开发者模式并没有单独的web服务器,对于静态文件和动态内容都是通过django自带的http server来访问,在正式环境我们更希望通过分离静态动态内容,静态内容通过nginx直接访问,而动态内容通过一个http WSGI服务器如gunicorn或者uwsgi来实现访问。此外,正式环境可能还需要部署好https。
  • 我们希望WSGI进程以守护进程的方式运行,同时能够很方便的控制启动,停止和重启等。使用一个服务管理工具是很方便的,在接下来的实例中我们采用supervisor作为服务管理工具。

2 ansible部署mezzanine

这一节用ansible来部署mezzanine,使用nginx做反向代理,gunicorn做应用服务器,基本架构如下:

2.1 搭建测试环境

为了不影响自己的系统环境,同时也为了后面多服务器测试的方便,我这里使用virtualbox和vagrant搭建了几个虚拟机(测试环境macos10.12),步骤如下:

  • 先下载virtualbox安装。下载地址,当然,如果你用的虚拟机软件是parallel desktop,那么就不需要下载virtualbox了。
  • 再下载vagrant。下载地址
  • 然后下载一个vagrant支持的虚拟机文件xxx.box(注意你如果你的虚拟机软件用的是virtualbox,才跟我这里一样,否则请下载parallel desktop对应的虚拟机文件),本来是可以直接通过vagrant命令下载的,不过速度较慢,我用的是 ubuntu/trusty64(14.04),下载地址在这里,用迅雷下载速度还不错,我下载后放置的目录为 ~/Downloads/virtualbox.box。

安装好后,在virtualbox运行一个ubuntu/trusty64的虚拟机。在运行前,先下载我的测试代码1,然后进入playbooks目录,执行如下命令:

1) vagrant box add ubuntu/trusty64 ~/Downloads/virtualbox.box 添加之前下载的box文件。

2) vagrant init ubuntu/trusty64 这个命令初始化vagrant,在当前目录也就是playbooks目录下会生成Vagrantfile文件。 在原来的Vagrantfile里面增加一行private ip配置,这里的ip设置为192.168.56.18是因为我的virtualbox那个网段为这个,你的virtualbox的网段如果不同设置为你自己的即可,注意这里如果设置错了可就没法访问了。最终除去注释后的Vagrantfile如下所示:

3)vagrant up 启动虚拟机,如果启动没有问题,接下来可以通过vagrant的命令来查看虚拟机的状态了。比如查看ssh配置:

可以看到虚拟机的ssh端口为2222,私钥文件是当前创建目录下的 .vagrant/machines/default/virtualbox/private_key,虚拟机的名字和密钥都是vagrant默认配置好的。后面可以看到自己去编写Vagrantfile,可以指定创建虚拟机的ip以及是否创建私钥。如果设置config.ssh.insert_key = false,则不会在.vagrant目录创建一个单独的私钥,而是用我们的用户目录下面 ~/.vagrant.d/insecure_private_key这个默认私钥。

4) 接下来可以连接虚拟机看看了。在当前目录执行 vagrant ssh,如无意外,你应该已经登录到虚拟机了。登录后默认用户名是vagrant,同时,虚拟机的vagrant用户已经被设置了可以无密码sudo(这都是vagrant的功劳)。

2.2 ansible部署

搭建好配置环境后,可以通过ansible来部署mezzanine了。这里我在raw/playbooks目录下面增加了一个ansible.cfg文件,其中内容如下:

这几个配置项做的事情就是指定hostfile以及登录的用户名,私钥文件的位置以及不检查host的key。因为这个测试机器只有一台,所以hosts文件比较简单如下,只需要指定ssh的主机和端口即可:

接下来可以看下用来部署的playbook文件了,代码如下,只要运行 ansible-playbook mezzanine.yml就可以部署好一个mezzanine,数据库用的postgresql,web服务器用的nginx,WSGI用的是gunicorn,另外采用supervisor管理gunicorn进程。运行成功后,打开 http://192.168.56.18.xip.io 即可访问。

用到的ansible模块由file,template,django_manage,supervisorctl, command, postgresql_db等,模块的参数详解可以见 http://docs.ansible.com/ansible/modules_by_category.html。

3 使用roles重写playbook

上一节是所有的功能都写到了一个playbook,这一节采用标准的role结构来实现相同功能,同时将db和web机器分开部署到两台虚拟机中。与上一节不同的是分开了db和web的play,另外将handler放到了role里面的handlers目录,代码内容基本一致。代码地址: https://github.com/shishujuan/ansible-practice/tree/master/roles。

Vagrantfile内容如下,定义了两个虚拟机。

然后更改了ansible.cfg的配置,设置了private key为我的用户目录下面的那个公用的key。roles的目录结果如下,一共3个role,其中aptsource是我自己加的,看名字也知道就是为了更改sources.list加快安装软件和Python模块的速度。创建角色的目录层次结构可以用ansible-galaxy工具,非常方便。具体文件内容参见代码,应该不用过多注解了。

4 ansible部署docker

由于docker只能在Linux上运行,如果在mac上跑,需要另外安装一个linux的虚拟机。因此,我直接用第一节中的vagrant创建的ubuntu/trusty64(14.04的64位版本)做测试,需要安装的环境包括docker.io, python-dev, ansible。ansible版本为2.2.0,docker的版本为1.18。注意docker-py的版本,我这里安装的是1.2.1,其他的版本会跟docker API版本不兼容。另外我这里没有用书中自带代码中的作者自己写的docker模块,而是用的ansible自带的docker模块,有些语法点有所不同,我已经做了修改适配。如果你的系统不是ubuntu14.04,安装的docker版本不一样,那么需要安装的docker-py可能也会不一样。

另外要注意的是,docker模块在ansible新版本中已经不推荐使用了,取而代之的是docker_container, docker_image模块。

完整的代码地址在这里: https://github.com/shishujuan/ansible-practice/tree/master/docker。分为两个目录,dockerfiles和playbooks。其中dockerfiles中的是Dockerfile,包括四个目录,用来创建镜像文件,启动容器在playbook中执行。进入对应的目录,运行make image即可创建好对应的镜像文件,运行docker images可以看到镜像文件。

运行的playbook完整代码如下:

简单说明几点:

1)这里用到的docker模块主要是启动容器以及运行容器的一些初始化命令。如果要设置docker容器的端口映射,可以用ports参数,如nginx容器。

2)挂载数据卷可以直接用 volumes_from 指定数据卷的名字即可。

3) 要关联各个容器,可以用links参数。使用了links参数后,会在对应容器的/etc/hosts文件中加入一条ip和域名对应的记录,比如mezzanine 172.17.0.12这样。

4)有几个容器带有command的必须设置detach=False,因为detach参数默认为True,这样会导致容器在后台运行,这个时候去运行command里面的命令是会出错的。

5)postgres容器用到了publish_all_ports: True,而mezzanine并没有使用这个参数,是因为我们在mezzanine的Dockerfile里面已经有EXPOSE 8000指定了暴露的端口为8000,而postgres用的是一个官方的镜像,我们并没有设置端口,所以用了publish_all_ports去允许容器中的任意端口暴露。

要测试的话,先是在dockerfiles目录下面创建这几个镜像文件,然后运行 ansible-playbook run-mezzanine.yml即可启动容器和跑起来各个服务。查看容器的命令是 docker ps,进入容器的命令是 docker exec -it xxx /bin/bash,xxx是容器ID或者容器名。

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2017-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kangvcar

手把手教你用1行Python代码实现FTP服务器 -- Pyftpdlib

2056
来自专栏别先生

MongoDB一个基于分布式文件存储的数据库(介于关系数据库和非关系数据库之间的数据库)

1:MongoDB的官方网址:https://www.mongodb.com    MongoDB的中文社区:http://www.mongoing.com/(...

3819
来自专栏网络

手把手教你用1行Python代码实现FTP服务器-Pyftpdlib

元旦快乐 当你想快速共享一个目录的时候,这是特别有用的,只需要1行代码即可实现。 FTP 服务器,在此之前我都是使用Linux的vsftpd软件包来搭建FTP服...

2657
来自专栏Java技术分享

手把手教你用Mysql-Cluster-7.5搭建数据库集群

当你的业务到达一定的当量,肯定需要一定数量的数据库来负载均衡你的数据库请求,我在之前的博客中已经说明了,如何实现负载均衡,但是还有一个问题就是数据同步,因为负...

2698
来自专栏电光石火

vue开发环境搭建

首先,列出来我们需要的东西:  node.js环境(npm包管理器) vue-cli 脚手架构建工具 cnpm npm的淘宝镜像 vue的安装 1.vu...

3854
来自专栏腾讯云实验室

搭建 Git 服务器

腾讯云提供了开发者实验室教你搭建 Git 服务器,教程内容如下,用户可以点击开发者实验室快速上机完成实验。

1K5
来自专栏小狼的世界

CentOS中设置系统级代理

proxy=http://username:password@proxy_ip:port/

1412
来自专栏holer

自定义域名方式访问本地WEB应用

在域名服务商注册并购买的域名必须要完成域名备案,否则无法使用域名访问网站,具体备案细节可以参考域名服务商提供的备案流程指导文档。

2511
来自专栏散尽浮华

linux下的缓存机制及清理buffer/cache/swap的方法梳理

1)缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存...

5168
来自专栏西安-晁州

pm2在node中的应用

pm2 是一个带有负载均衡功能的Node应用的进程管理器,当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, pm2是完美的...

3630

扫码关注云+社区

领取腾讯云代金券