(编辑:根据评论中的反馈对问题进行了彻底的重写,旨在遵循使用“更多代码,更少说话”的建议)
我已经积累了一些有趣的剧本来设置我们的主机。我想开始模块化。当前情况大致如下:
docker-registry-playbook.yml:
- hosts: foo tasks: - name: install docker # ... - name: copy config files # ... - name: start docker registry # ...etc...
issue-tracker-playbook.yml:
- hosts: foo tasks: - name: install issue tracker # ...etc...
tools-playbook.yml:
- hosts: foo tasks: - name: configure nginx virtual hosts copy: src: "{{ item }}" dest: /etc/nginx/sites-available/ # ... with_items: - docker.example.com - issues.example.com - name: start nginx # ... - name: configure letsencrypt # ...
我的第一个想法是将其划分为多个角色,如下所示:
- hosts: foo
roles: webserver docker_registry issue_tracker
但是,在这种情况下,我不知道如何使webserver
角色“自动检测”主机名(虚拟主机)它应该公开? 我希望能够轻松移动例如docker_registry
角色到其他主机(bar
),并且当我将新剧本更改为以下内容时,让webserver
自动检测更改并相应地更新虚拟主机:
- hosts: foo
roles: webserver docker_registry
- hosts: bar
roles: webserver issue_tracker
我强烈希望不必在webserver
和foo
上都明确列出虚拟主机作为bar
的参数;对我来说这将是太多重复。 是否可以从同一服务器上配置的其他角色中webserver
自动检测“虚拟主机”的名称?
还是我以错误的方式进行模块化,而Ansible的惯用方法是在模块化时将其沿其他轴分开?
如果不可能完全自动完成,我希望只需最少的布线即可完成;我可能会勉强接受下面的内容,尽管它对我来说看起来太长且太丑了(但我仍然不知道如何在Ansible中做到这一点):
- hosts: foo
roles:
- docker_registry
- role: webserver
vars:
vhosts: [ "docker_registry" ]
答案 0 :(得分:0)
我不确定我是否正确理解您的问题。为什么在所有角色中都必须有一个公共变量 virtual_hosts ?
...最初,我以为我可以在service1和service2中分别设置一个变量,例如virtual_hosts:而Ansible会将重复的变量合并为一个...
例如:
- hosts: foo
vars:
virtual_host_service1: docker.example.com
virtual_host_service2: issues.example.com
webserver_vm:
- "{{ virtual_host_service1 }}"
- "{{ virtual_host_service2 }}"
roles:
- webserver
- service1
- service2
您可能想根据precedens
在剧本,host_vars或许多其他地方设置变量