运用“Ansible+Docker”高效简化复杂任务

第十期 启迪云解决方案架构师 蒋运龙 译

Ansible 是一个自动化工具,旨在减轻IT 人员的重复性工作。包括配置管理、应用程序部署和服务内部编排等工作。

Ansible 更像是一个配置管理和应用程序部署系统(同样它可以在其他很多场景使用),同样的配置管理工具还有Puppet、SaltStack 和Chef 等。它们通过简化复杂任务,使开发人员能大幅提高工作效率。

在进入Ansible 的精彩细节之前,让我们看一下Docker 如何与Ansible 合作。同时在阅读这篇文章之前,您必须熟悉Docker 及其使用。开发人员喜欢Docker 的主要原因是:Docker 能在操作系统(物理机或者虚拟机)上运行多个隔离的应用程序,从而有助于提高计算密度。而Ansible 模块附带的Playbooks,则有助于将应用配置和部署到远程机器。

Ansible 可帮助您自动化操作容器构建和部署过程。当您使用Ansible 自动化Docker 工具时,您将享受到许多优势,如可移植性、可审计性、环境的管理等。在详细介绍Ansible 和Docker 的组合如何在软件产品管理中取得最佳效果之前,让我们先来看看 Ansible。

什么是Ansible?

Ansible 由Michael DeHaan 于2016 年1 月开发。它使用Python 和PowerShell 编写,并在Linux、Unix 和Windows 操作系统上运行。

正如前面提到的,Ansible 是一个简单的自动化IT 引擎,专门为复杂部署设计,它是IT 基础设施的完美解决方案,因为它涉及到如何使系统相互关联,并且专注于如何一次性管理一个系统。

Ansible 使用一种称为YAML(Ansible Playbooks)的简单语言来帮助开发人员描述自动化任务。它通过连接服务节点并将执行过程拆分为一个个称之为Ansible 模块的小程序来发挥作用。这些小程序充当资源模型,在任务执行期间部署,并在任务完成后删除。

这些模块都保存在一个库中,它可以独立运行在任何机器中而不需要额外的依赖,如服务器或数据库。你可以使用版本控制系统跟踪内容的变化。默认情况下,Ansible 使用SSH 密钥来代替密码。

作为无代理架构,Ansible 通过提供安全的隧道功能和各种身份验证方法,通过网络流量加密使用OpenSSH 和WinRM 进行安全的网络连接。

OpenSSH 也称为OpenBSD Secure Shell,基于Secure Shell(SSH)协议。它是一种常见的连接工具,开发人员可以通过SSH 协议进行远程登录。

为什么使用Ansible

虚拟机为进程提供高度隔离,因为它们在自己的操作系统实例中运行。该操作系统也不必与主机上运行的操作系统相同。Windows 虚拟机可以在 Linux 管理程序上运行,反之亦然。

Ansible可以自动化您的网络、自动化您的应用程序部署。使用Ansible 有两个主要原因:

在IT 环境中工作需要您反复执行相同的任务,这可能会导致工作中的无价值的重复性劳动。在使用Ansible 后这个问题可以得到解决。它可以消除工作环境中的复杂性并加速DevOps 的流水线。

Ansible 与Puppet,Chef 和SaltStack 等其他自动化工具相比,具有明显的优势。Ansible 是无代理的,意味着Ansible没有运行特定操作所需的守护进程或代理。它通过SSH 协议推送命令自动进行配置。因此意味着在客户端不需要额外安装应用或者代理程序。

由于其他工具不是无代理的,因此需要在每台被控节点上单独安装每个工具的代理程序。

Ansible优势

无代理架构

Ansible 这样的无代理架构在网络自动化中非常重要。目前许多网络设备没有API 接口。而API 在自动化中非常重要,它可以更轻松地自动化和管理传统设备。

与需要防火墙配置的代理管理工具相反,Ansible 通过WinRM 和SSH 以无代理方式工作。所有连接都是通过预先配置的远程访问服务执行的,这是一种以非常有效的执行操作方式,并且具有最少量的网络流量。无代理管理方法通过将所有自动生成的模块传输到远程计算机,来利用Windows 和SSH 远程管理功能执行命令。

与基于代理的体系结构相比,无代理的体系结构优势明显,因为它更简单、更安全并且满足了IT 的需求。它仅在有要执行的工作时才启动通信。无代理在物联网中也非常有用,特别是在无法安装代理程序的领域。

团队的可复用性

Ansible 使用户能够在YAML 语言的帮助下,整个团队共享自动化的解决方案。无论您属于哪个IT 组织团队开发团队或运维团队),使用Ansible 后可以使用一种通用语言自动化您的IT 基础架构甚至DevOps 工具。

统一应用程序和操作系统配置

Ansible通过统一应用软件和操作系统配置,可以减少过去IT配置更改中曾经发生的人工错误。

高度安全可靠

Ansible非常可靠和安全,Ansible使用了OpenSSH,特别是远程的OpenSSH。由于OpenSSH是使用最广泛的协议,因此很容易被发现和修复漏洞。

一致性

这是与Ansible 脚本相关的重要概念。一致性已经发展成为软件开发中不断使用的词。当Ansible 执行脚本确认后,不需要任何干预行动,只执行一次操作就能完成相应任务。

极佳的可扩展性

Ansible 提供出色的可扩展性,无论模块是在本地运行还是远程运行、是配置OS 参数还是配置应用程序和服务器。它允许使用日志记录回调用于执行,也可以从云或者其他系统中收集所有的数据,并可以与外部数据存储集成。

低学习曲线

任何人都可以学习使用Ansible。 Ansible 以其微调简单而着称;它的学习曲线较低,因为它使用YAML 语言作为其配置脚本。由于不需要编码技能,对于那些没有技术知识基础的人来说并不困难。

社区成长

由于Ansible 是免费和开源的,这意味着您可以通过Github 和Meetup 等社区公开访问所有代码。

Ansible Tower

Ansible 的可用性功能通过Ansible Tower 得到增强,Ansible Tower 是Ansible 的产品,支持多租户,基于角色的访问控制或RBAC,Web UI,REST API 等等。

Ansible Tower 是一个非常强大的用户界面和RESTful API,是Red Hat 公司的企业级商业产品。它有能力管理复杂的多层部署,提高生产力并轻松扩展IT 自动化。

Ansible Tower 有一个仪表板,允许开发人员查看所有库存详细信息并调整作业状态更新。开发人员可以访问Ansible Tower 的仪表盘,用于Ansible 环境的内容监控,包括所有最近的工作活动,以及包含日期和时间范围的屏幕截图。它允许您详细和实时地查看每个成功和每个故障。

由于整个过程是自动化的,开发人员可以看到队列的内容。此外,它可以查看谁正在执行什么任务,以及记录所有任务。Tower工作流程非常适合复杂的任务,支持多个工作流程,只需运行一次,或使用不同的凭据运行多次。

Ansible Tower仪表板

Tower 的另一个主要功能是系统跟踪。有了这个,开发人员可以审核并验证所有机器是否相互兼容。它还可以帮助他们跟踪随时间变化的机器,比较变化以及如何根据需求配置和部署它们。

Tower 集成了一个非常简单的门户模式和手动功能,可以增强各种用户的自动化任务,并直接从LDAP,Active Directory 等目录进行同步。

跟踪库存是Tower 附加的另一项主要简单任务。开发人员可以从许多云服务器(如Microsoft Azure,Amazon Web 服务器)收集库存,并将它们连接到Red Hat Satellite 或Red Hat CloudForms 环境,也可以用于自定义CMDB(配置管理数据库)等数据存储库。

使用Ansible来管理Docker

Ansible 与Docker 的完美结合使您能够成功实现软件开发的自动化。除了操作Docker 容器外,您还可以自动完成构建和部署应用程序的过程。

Ansible 为管理基础架构提供了可靠的框架。它可以远程处理DevOps 中涉及的SSH 连接和复杂性。当Docker 和Ansible 一起工作时,您可以获得许多好处:

·可移植性- 当Docker 与Ansible Playbook 结合使用时,可确保可移植性。使用纯Dockerfile,您必须在Docker 容器中重现该应用程序。但是当使用Ansible Playbook 构建容器时,您可以在任何地方重现环境- 在Docker 中、或您喜欢的任何云实例。即使是复杂的容器描述也可以轻松移植。

·可组合性- Docker 发布了一些工具,用于消除容器世界中的复杂性。但是仍然存在一些编排问题。Ansible 有助于解决这个问题。它甚至使复杂的Playbook 看起来很简单。

·可审计性- 由于Ansible 剧本是可审计,可重复,Docker和Ansible的组合可以更好的构建容器,帮助追踪潜在漏洞和监测代码。您可以轻松跟踪每个容器的部署人员以及容器的内容。

·管理现有应用程序的可行性- 容器管理是Ansible 的标准功能。在使用Ansible之前,管理和自动化现有应用程序是开发人员面临的挑战。

·管理完整环境- Ansible不仅可以管理容器,还可以管理容器的运行环境的环境。即使对于复杂的生产环境也是如此。

·容器和非容器的同时构建- 容器和非容器可以同时构建。这是一个巨大的好处,因为容器化与非容器化的应用经常需要一起被部署,比如容器化的应用程序经常与数据库、存储等组件一起部署(它们通常是非容器化运行)。

·Docker 和Ansible的语法几乎相同- 虽然Docker 有自己的脚本,Ansible Playbook 使用YAML 文件,但它们几乎完全相同。两者都可以做几乎相同的事情,特别是在管理Docker 组件时。

Ansible管理Docker的模块介绍

1.docker——用于管理docker容器

docker是用于运行Docker容器生命周期的原生Ansible模块,它运行所需的条件是:

– python >=2.6

– docker-py >=0.3.0

– the docker server >=0.10.0

2.docker_image——用于管理Docker镜像

镜像在创建容器时被获取,可以将镜像打tag并push保存镜像库中,或者将其存到.tar文件里。

环境要求:

– python >=2.6

– docker-py >=1.7.0

– Docker API >=1.20

3.docker_network——用于管理Docker网络

通过使用docker_network模块,可以创建或删除Docker网络,将容器连接到网络,或者创建一个带有选项的网络。也可以在断开所有容器的同时删除网络。

这个模块执行的功能与“docker network”的功能差不多相同。

环境要求:

– python >=2.6

– docker-py >=1.7.0

– The Docker server >=1.9.0

4.docker_service——用于管理Docker服务和容器

对应docker compose的功能,支持compose的版本包括version1和version2,可以打开docker-compose.yml(或.yaml)查看详细信息。

环境要求:

– python >=2.6

– docker-compose >=1.7.0

– Docker API >=1.20

– PyYAML >=3.11

5.docker_login

对于docker的login功能,登陆镜像仓库。

使用Ansible和Docker进行持续部署

Docker 和Ansible 协同工作,提供持续交付和持续部署。由于Ansible 适用于多节点软件部署,配置管理和临时任务执行,因此被广泛用于软件开发。Ansible 中的模块使用JSON,而您可以使用任何编程语言进行标准输出。

以下是使用Ansible 时要考虑的5 个主要角色,如 bdd.yml 中所述:

- hosts: all

remote_user: vagrant

sudo: yes

roles:

- etcd

- confd

- docker

- nginx

- bdd

这是前四个角色etcd, confd, docker 和nginx ,他们确保蓝绿色的部署工具都存在。以下是解释Docker 角色的方法:

- name: Docker is present

apt: name=docker.io state=present

tags: [docker]

- name: Python-pip is present

apt: name=python-pip state=present

tags: [docker]

- name: Docker-py is present

pip: name=docker-py version=0.4.0 state=present

tags: [docker]

Ansible的Docker模块对于管理容器非常重要。它可以通过apt-get,Python pip 和Docker-py的方式安装。通过查看上面的代码片段,您可以看到使用Ansible 非常容易。与Puppet 和Chef 相比,它提供了许多优势。

安装工具之后,接下来将执行Ansible rolebdd。在此步骤中,您将执行部署(遵循蓝绿部署方式)。测试对于确保正确完成部署非常重要。执行以下操作以确保应用程序的正确部署。

• 获取最新版本的应用程序容器

• 与新应用程序容器并行运行旧应用程序

• 运行部署后测试

• 通知etcd 新版本(端口,名称等)

• 将nginx 配置转换为指向新版本

• 最后,停止旧版本

确保先前的容器已通过单元和功能测试非常重要,因为您与旧版本并行运行新版本。

以下是rolebdd 的示范:

- name: TOML is present

copy:

src=bdd.toml

dest=/etc/confd/conf.d/bdd.toml

tags: [bdd]

- name: Config template is present

copy:

src=bdd.conf.tmpl

dest=/etc/confd/templates/bdd.conf.tmpl

tags: [bdd]

- name: Deployment script is present

copy:

src=deploy-bdd.sh

dest=/usr/local/bin/deploy-bdd.sh

mode="0755"

tags: [bdd]

- name: Deployment is run

shell: deploy-bdd.sh

tags: [bdd]

这里有3 个任务:

BLUE_PORT=9001

GREEN_PORT=9002

CURRENT_COLOR=$(etcdctl get /bdd/color)

if [ "$CURRENT_COLOR" = "" ]; then

CURRENT_COLOR="green"

fi

if [ "$CURRENT_COLOR" = "blue" ]; then

PORT=$GREEN_PORT

COLOR="green"

else

PORT=$BLUE_PORT

COLOR="blue"

fi

在此之后,停止并删除任何现有容器。但是,当前版本将继续运行。

docker stop bdd-$COLOR

docker rm bdd-$COLOR

接下来,启动带有新版本的容器并与现有容器并排运行。这里部署了 BDD Assistant 容器 vfarcic / bdd。

docker pull vfarcic/bdd

docker run -d --name bdd-$COLOR -p $PORT:9000 vfarcic/bdd

为了确保部署的应用程序按预期工作,运行集成和压力测试非常重要。最后Ansible将对容器上的应用进行单元测试和功能测试。

使用PhantomJS 运行一组BDD 方案

docker pull vfarcic/bdd-runner-phantomjs

docker run -t --rm --name bdd-runner-phantomjs vfarcic/bdd-runner-phantomjs

--story_path

data/stories/tcbdd/stories/storyEditorForm.story

--composites_path

/opt/bdd/composites/TcBddComposites.groovy

-P url=http://172.17.42.1:$PORT -P

widthHeight=1024,768

在所有测试通过后,使用etcd运行confd以存储有关新版本的信息来更新nginx配置。到此,nginx处理旧版本的所有请求,用户将被重定向到此部署的新版本。

etcdctl set /bdd/color $COLOR

etcdctl set /bdd/port $PORT

etcdctl set /bdd/$COLOR/port $PORT

etcdctl set /bdd/$COLOR/status running

confd -onetime -backend etcd -node 127.0.0.1:4001

Docker和Ansible实操

首先,您可以创建一个Vagrant 文件,该文件包含一个Ubuntu 虚拟机。接下来运行Ansible playbook。这将自动安装和配置所需的一切。

请确保您安装了Git,Vagrant,VirtualBox。

git clone https://github.com/vfarcic/provisioning.git

cd provisioning/ansible

vagrant up

如果您是第一次这样做,因为所有组件都必须先下载,可能需要几分钟。运行以下命令开始部署。

vagrant provision

接下来,您可以通过SSH 连接到VM,然后版本从蓝色(端口9001)更改为绿色(端口9002)。

vagrantssh

sudodockerps

此时,您可以在浏览器中键入 http:// localhost:8000 / 来访问部署的版本。

总结

将Docker与Ansible结合,会简化部署工作。在传统IT环境中安装如JDK、web服务器等,要确保配置文件被正确配置,Docker正常工作。另一方面,通过容器也简化了Ansible的操作,一旦所有组件都已ready,就可以朝着容器化开干了。许多企业目前都在将Ansible和Docker放在一起工作,并收获颇丰。而Ansible和Docker刚好语法也很相近,熟悉docker的基础上也较容易上手Ansible。

互动区

* 你对以上内容有什么看法?你最关注云计算哪个趋势?如果你还有想了解的技术话题,欢迎留言分享。

*「启迪云谈」每周二持续更新,敬请期待。如需转载请联系小编。

-热门阅读-

启迪云计算有限公司 | 依托于清华启迪控股集团雄厚的资本和强大的科技创新及产业服务能力| 国际领先的私有云及行业云解决方案提供商 | 企业数字化转型首选平台

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181023G1LHZ400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券