rednaks
rednaks

Reputation: 2042

how can I make ansible config less tied

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 !

Upvotes: 1

Views: 89

Answers (2)

seshadri_c
seshadri_c

Reputation: 7340

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

Upvotes: 0

idriss Eliguene
idriss Eliguene

Reputation: 897

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.

Upvotes: 1

Related Questions