如何为多个应用程序使用构建ansible角色?

时间:2014-12-02 14:35:29

标签: python node.js deployment ansible

我正在寻找最模块化的方式来使用ansible来配置一个服务器,该服务器将在其上托管多个node.js应用程序。我目前的设置不可扩展。

我拥有的角色是commonnginxnodejsmongodbapps

apps哈希/字典

我在apps中维护了一个名为roles/apps/defaults/main.yml的词典,这既是解决方案也是问题:

- apps:
    shark:
      repo: git@example.com:shark.git
      subdomain: shark
      port: 3001
    tiger:
      repo: git@example.com:tiger.git
      subdomain: tiger
      port: 3002

apps中如何使用roles/apps/tasks/main.yml字典的示例:

- name: clone repos
  git: repo={{ item.value.repo }}
  with_dict: apps

- name: create vhost
  template:
    src=vhost.j2
    dest=/etc/nginx/sites-available/{{ item.value.subdomain }}
  with_dict: apps
  sudo: yes

playbook.yml

staging.ymlproduction.yml个剧本都设置为运行所有上述角色。这意味着两台服务器都会安装{strong>所有在apps dict中配置的应用。

我需要为roles/apps找出更模块化的模式,以便我可以在不同的环境中安装不同的应用程序。理想情况下,我希望能够直接在staging.ymlproduction.yml中指定哪些应用转到哪台应用。

知道如何实现这一目标吗?随意提出完全不同的配置多个应用程序的方法。

2 个答案:

答案 0 :(得分:2)

我想到的另一个解决方案是为roles/apps/defaults/main.yml中的各种应用创建字典:

shark:
  repo: git@example.com:shark.git
  subdomain: shark
  port: 3001

tiger:
  repo: git@example.com:tiger.git
  subdomain: tiger
  port: 3002

请注意,它们并未包含在apps字典中。

然后,在appsstaging.yml中指定production.yml dict内容:

- hosts: example
  vars:
    apps:
      - '{{ shark }}'
      - '{{ tiger }}'

这允许您指导哪些应用程序包含在哪个剧本中。

答案 1 :(得分:1)

如果您愿意维护另一个字典,可以将with_dict参数化为:

- name: clone repos
  git: repo={{ item.value.repo }}
  with_dict: {{env_app_dict}}

并在清单文件或命令行中指定env_app_dict

编辑:或者,尝试我编写的lookup plugin并指定apps_common,apps_production和apps_staging的文件夹。

使用此插件,您可以在apps_common中添加一些常用项目,并且:

- name: clone common repos
  git: repo="{{item.repo}}"
  fileglob_to_dict:
    - "{{ 'apps_common/*' }}"

然后只需通过主机模式定位(例如播放中的- hosts: staging)或通过在命令行或库存中指定参数来指定您想要的apps_env文件参数(如原始答案中所示)文件。