如何使用多个虚拟主机模块化Ansible剧本?

时间:2018-08-28 10:56:13

标签: ansible

(编辑:根据评论中的反馈对问题进行了彻底的重写,旨在遵循使用“更多代码,更少说话”的建议)

我已经积累了一些有趣的剧本来设置我们的主机。我想开始模块化。当前情况大致如下:

  

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

我强烈希望不必在webserverfoo上都明确列出虚拟主机作为bar的参数;对我来说这将是太多重复。 是否可以从同一服务器上配置的其他角色中webserver自动检测“虚拟主机”的名称

还是我以错误的方式进行模块化,而Ansible的惯用方法是在模块化时将其沿其他轴分开?


如果不可能完全自动完成,我希望只需最少的布线即可完成;我可能会勉强接受下面的内容,尽管它对我来说看起来太长且太丑了(但我仍然不知道如何在Ansible中做到这一点):

- hosts: foo
  roles:
  - docker_registry
  - role: webserver
    vars:
      vhosts: [ "docker_registry" ]

1 个答案:

答案 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或许多其他地方设置变量