使用 Ansible Container 构建和测试应用程序

使用 Ansible Container 构建和测试应用程序

容器是一个日益流行的开发环境。作为一名开发人员,你可以选择多种工具来管理你的容器。本文将向你介绍 Ansible Container,并展示如何在类似生产环境中运行和测试你的应用程序。

入门

这个例子使用了一个简单的 Flask Hello World 程序。这个程序就像在生产环境中一样由 Apache HTTP 服务器提供服务。首先,安装必要的 docker 包:

  1. sudo dnf install docker

Ansible Container 需要通过本地套接字与 Docker 服务进行通信。以下命令将更改套接字所有者,并将你添加到可访问此套接字的 docker 用户组:

  1. sudogroupadd docker &&sudo gpasswd -a $USER docker
  2. MYGRP=$(id-g);newgrp docker ;newgrp $MYGRP

运行 id 命令以确保 docker 组在你的组成员中列出。最后,使用 sudo 启用并启动 docker 服务:

  1. sudosystemctl enable docker.service
  2. sudosystemctl start docker.service

设置 Ansible Container

Ansible Container 使你能够构建容器镜像并使用 Ansible playbook 进行编排。该程序在一个 YAML 文件中描述,而不是使用 Dockerfile,列出组成容器镜像的 Ansible 角色。

  1. mkdir ansible-container-flask-example
  2. cd ansible-container-flask-example
  3. python3 -m venv .venv
  4. source .venv/bin/activate
  5. pip install ansible-container[docker]

这些命令将安装 Ansible Container 及 Docker 引擎。 Ansible Container 提供三种引擎:Docker、Kubernetes 和 Openshift。

设置项目

现在已经安装了 Ansible Container,接着设置这个项目。Ansible Container 提供了一个简单的命令来创建启动所需的所有文件:

  1. ansible-container init

来看看这个命令在当前目录中创建的文件:

  • ansible.cfg
  • ansible-requirements.txt
  • container.yml
  • meta.yml
  • requirements.yml

该项目仅使用 container.yml 来描述程序服务。有关其他文件的更多信息,请查看 Ansible Container 的入门文档。

定义容器

如下更新 container.yml

  1. version:"2"
  2. settings:
  3. conductor:
  4. #TheConductor container does the heavy lifting,and provides a portable
  5. #Python runtime for building your target containers.It should be derived
  6. #from the same distribution as you're building your target containers with.
  7. base: fedora:26
  8. # roles_path: # Specify a local path containing Ansible roles
  9. # volumes: # Provide a list of volumes to mount
  10. # environment: # List or mapping of environment variables
  11. # Set the name of the project. Defaults to basename of the project directory.
  12. # For built services, concatenated with service name to form the built image name.
  13. project_name: flask-helloworld
  14. services:
  15. # Add your containers here, specifying the base image you want to build from.
  16. # To use this example, uncomment it and delete the curly braces after services key.
  17. # You may need to run `docker pull :trusty` for this to work.
  18. web:
  19. from: "fedora:26"
  20. roles:
  21. - base
  22. ports:
  23. - "5000:80"
  24. command: ["/usr/bin/dumb-init", "httpd", "-DFOREGROUND"]
  25. volumes:
  26. - $PWD/flask-helloworld:/flaskapp:Z

conductor 部分更新了基本设置以使用 Fedora 26 容器基础镜像。

services 部分添加了 web 服务。这个服务使用 Fedora 26,后面有一个名为 base 的角色。它还设置容器和主机之间的端口映射。Apache HTTP 服务器为容器的端口 80 上的 Flask 程序提供服务,该容器重定向到主机的端口 5000。然后这个文件定义了一个卷,它将 Flask 程序源代码挂载到容器中的 /flaskapp 中。

最后,容器启动时运行 command 配置。这个例子中使用 dumb-init,一个简单的进程管理器并初始化系统启动 Apache HTTP 服务器。

Ansible 角色

现在已经设置完了容器,创建一个 Ansible 角色来安装并配置 Flask 程序所需的依赖关系。首先,创建 base 角色。

  1. mkdir-p roles/base/tasks
  2. touch roles/base/tasks/main.yml

现在编辑 main.yml ,它看起来像这样:

  1. ---
  2. - name:Install dependencies
  3. dnf: pkg={{item}} state=present
  4. with_items:
  5. - python3-flask
  6. - dumb-init
  7. - httpd
  8. - python3-mod_wsgi
  9. - name: copy the apache configuration
  10. copy:
  11. src: flask-helloworld.conf
  12. dest:/etc/httpd/conf.d/flask-helloworld.conf
  13. owner: apache
  14. group: root
  15. mode:655

这个 Ansible 角色是简单的。首先它安装依赖关系。然后,复制 Apache HTTP 服务器配置。如果你对 Ansible 角色不熟悉,请查看角色文档

Apache HTTP 配置

接下来,通过创建 flask-helloworld.conf 来配置 Apache HTTP 服务器:

  1. $ mkdir-p roles/base/files
  2. $ touch roles/base/files/flask-helloworld.conf

最后将以下内容添加到文件中:

  1. <VirtualHost *>
  2. ServerName example.com
  3. WSGIDaemonProcess hello_world user=apache group=root
  4. WSGIScriptAlias / /flaskapp/flask-helloworld.wsgi
  5. <Directory/flaskapp>
  6. WSGIProcessGroup hello_world
  7. WSGIApplicationGroup %{GLOBAL}
  8. Require all granted
  9. </Directory>
  10. </VirtualHost>

这个文件的重要部分是 WSGIScriptAlias。该指令将脚本 flask-helloworld.wsgi 映射到 /。有关 Apache HTTP 服务器和 mod_wsgi 的更多详细信息,请阅读 Flask 文档

Flask “hello world”

最后,创建一个简单的 Flask 程序和 flask-helloworld.wsgi 脚本。

  1. mkdir flask-helloworld
  2. touch flask-helloworld/app.py
  3. touch flask-helloworld/flask-helloworld.wsgi

将以下内容添加到 app.py

  1. from flask importFlask
  2. app =Flask(__name__)
  3. @app.route("/")
  4. def hello():
  5. return"Hello World!"

然后编辑 flask-helloworld.wsgi ,添加这个:

  1. import sys
  2. sys.path.insert(0,'/flaskapp/')
  3. from app import app as application

构建并运行

现在是时候使用 ansible-container buildansible-container run 命令来构建和运行容器。

  1. ansible-container build

这个命令需要一些时间来完成,所以要耐心等待。

  1. ansible-container run

你现在可以通过以下 URL 访问你的 flask 程序: http://localhost:5000/

结论

你现在已经看到如何使用 Ansible Container 来管理、构建和配置在容器中运行的程序。本例的所有配置文件和源代码在 Pagure.io 上。你可以使用此例作为基础来开始在项目中使用 Ansible Container。

下面关于Ansible的文章您也可能喜欢,不妨参考下:

Ansible 的详细介绍请点这里
Ansible 的下载地址请点这里


via: https://fedoramagazine.org/build-test-applications-ansible-container/

作者:Clement Verna 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

猜你喜欢

转载自www.linuxidc.com/Linux/2017-11/148799.htm