简体   繁体   中英

How to modularize Ansible playbook with multiple virtual hosts?

(EDIT: the question was thoroughly rewritten based on feedback in comments, aiming to follow a suggestion to use "more code, less talk")

I've accumulated some ansible playbooks for setting up our host(s). I want to start modularizing them. The current situation is roughly like below:

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 # ... 

My first idea was to split it into roles like below:

- hosts: foo
  roles: webserver docker_registry issue_tracker

However, in such case, I don't know how to make the webserver role "auto-detect" the host names (virtual hosts) it should expose? I would like to be easily able to move eg docker_registry role to a different host ( bar ), and have the webserver auto-detect the change and update virtual hosts accordingly when I change the new playbook to:

- hosts: foo
  roles: webserver docker_registry
- hosts: bar
  roles: webserver issue_tracker

I would strongly prefer not having to explicitly list virtual hosts as parameters to webserver both on foo and bar ; this would be too much duplication for me. Is it possible to have webserver autodetect names of "virtual hosts" from the other roles configured on the same server?

Or am I approaching the modularization in a wrong way, and the idiomatic approach in Ansible is to split it along some other axis when modularizing?


If not possible to do fully automatically, I'd like it to be done with minimal wiring; I could maybe grudgingly accept something like below, though it already looks much too long and ugly to me (but I still don't know how to do this in Ansible):

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

I'm not sure if I understand your problem correctly. Why is it necessary to have a common variable virtual_hosts in all roles?

... Initially, I thought I could set a variable in each of service1 and service2, named eg virtual_hosts: and Ansible would merge the duplicated variables into one...

For example:

- 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

You might want to set the variables in the playbook, or in the host_vars, or in many other places according to the precedens

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM