skip to Main Content

I’m trying to build an ansible configuration with less tied roles. but I’m struggling to find the best config ..

First of all I created many roles as elementary as possible and here what my ansible folder looks like:

.
├── group_vars
│   └── all
├── inventory.yml
├── playbook.yml
└── roles
    ├── app_1
    │   └── defaults
    ├── app_2
    │   └── defaults
    ├── postgres
    │   └── defaults
    ├── rabbitmq
    │   └── defaults
    └── redis
        └── defaults

inventory.yml

all:
  children:
    db:
      hosts:
        db.domain.com:
    app1:
      hosts:
        app1.domain.com:
    app2:
      hosts:
        app2.domain.com:
    cache:
      hosts:
        cache.domain.com:

playbook.yml

- name: "play db"
  hosts: db
  roles:
    - postgres

- name: "play cache"
  hosts: cache
  roles:
    - redis

- name: "play app1"
  hosts: app1
  roles:
    - app_1
    - rabbitmq

- name: "play app2"
  hosts: app2
  roles:
    - app_2
    - rabbitmq

the problem here is that I have no idea how different roles can share variables because they’re in different hosts. app_1 and app_2 needs variables defined in redis and postgres for example.

I have two solutions:

  1. Define all variables in group_vars/all => the problem is that there are a lot of variable and my file will be too big besides the duplication of variables (locally in the role + globally)
  2. in each role I could say, If you need a variable from postgres then use hostvars from the group "db" but here I think the role is not supposed to know anything about hosts configuration .

I really have no idea how to solve this problem to have a clean config.

thank you !

2

Answers


  1. for the purpose of tests, any role need to have it’s own variables, so you can test them individualy.
    And variables also have a scope and precedence. see: variable precedence
    So when you declare a variable at the role scope, it will not be available for others roles. if you need a variable to be global, add them to group_vars scope, host_vars scope, play scope or extra_vars scope (cli). anyway, you will need to include them.

    Login or Signup to reply.
  2. One way to reuse the variables from other roles or group_vars is to use vars_files to load them for the play you want.

    For example, if your app1 hosts require variables defined in redis/defaults/main.yml:

    - name: "play app1"
      hosts: app1
    
      vars_files:
      - roles/redis/defaults/main.yml
    
      roles:
        - app_1
        - rabbitmq
    

    Or a better option in my opinion would be to have variables segregated into group_vars and load them same way for other hosts.

    - name: "play app2"
      hosts: app2
    
      vars_files:
      - group_vars/db.yml
    
      roles:
        - app_2
        - rabbitmq
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search