使用 ansible 部署 dockerized 测试环境和普通 ubuntu 用于生产

使用 ansible 部署 dockerized 测试环境和普通 ubuntu 用于生产

我需要一些帮助来部署一个我已经使用了一年半的系统。为了让您了解我的担忧,我将稍微解释一下我们的基础设施。

我们有一台服务器(我们称之为 TESTING_SERVER),其中为我们的系统提供了不同的测试环境。每个环境都完全使用 docker 运行。每个测试环境实例都包含:1. 带有 nginx 作为代理的 Docker 容器 2. 带有 Django web 的 Docker 容器 3. 带有 mysql 的 Docker 容器

每次我们需要为测试目的构建新环境时(例如:QA 想要测试新功能),我们都会使用 ansible playbook 在 TESTING_SERVER 上运行这些任务:

  1. 创建 docker 网络
  2. 创建数据库容器
  3. 在 TESTING_SERVER 中的某个位置克隆或更新 django git repo
  4. 创建 django 容器
  5. 在 django 容器内运行 django collectstatic 命令
  6. 在 django 容器内运行 django migration 命令
  7. 创建 nginx 容器

在我们的生产环境中,我们有一个运行 mysql、django 和 nginx 的普通 ubuntu 服务器 (PRODUCTION_SERVER)。每次我们必须部署到生产环境时,我们都会运行一个 ansible playbook,它(几乎)重复上面列出的步骤:

  1. 检查 mysql 连接(数据库在另一台服务器上)
  2. 在 PRODUCTION_SERVER 中的某个位置克隆或更新 django git repo
  3. 检查并重启gunicorn(相当于创建django容器)
  4. 运行 django collectstatic
  5. 运行 django 迁移
  6. 检查 nginx 配置

这两个剧本虽然有很多共同点,但还是有所不同。我原本想将每个步骤转换为 ansible 任务,并使用条件来了解应该运行哪些任务(dockerized 或 direct)。但我仍然会为每个步骤设置不同的任务(剧本相同,但似乎有点棘手)。

我的问题是:有没有办法“合并”这些剧本,使其只保留一个而不重复?

答案1

我将为每个“任务”创建一个角色并在剧本中使用它,类似于最佳实践文档中所述。

http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#directory-layout

例如

roles/  
  create_a_docker_network/  
    tasks/  
      main.yml  
  create_database_container/...
  ...  
  Create_nginx_container/

并在剧本中调用角色

测试.yml

- hosts: testserver
  roles:
    - create_a_docker_network
    - create_database_container
    - ...

相关内容