我正在寻找最模块化的方式来使用ansible来配置一个服务器,该服务器将在其上托管多个node.js应用程序。我目前的设置不可扩展。
我拥有的角色是common
,nginx
,nodejs
,mongodb
,apps
。
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.yml
和production.yml
个剧本都设置为运行所有上述角色。这意味着两台服务器都会安装{strong>所有在apps
dict中配置的应用。
我需要为roles/apps
找出更模块化的模式,以便我可以在不同的环境中安装不同的应用程序。理想情况下,我希望能够直接在staging.yml
和production.yml
中指定哪些应用转到哪台应用。
知道如何实现这一目标吗?随意提出完全不同的配置多个应用程序的方法。
答案 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
字典中。
然后,在apps
或staging.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文件参数(如原始答案中所示)文件。