Usage as a role dependency
The debops.elasticsearch
role can be used as a dependency by other Ansible
roles to manage Elasticsearch main configuration file idempotently.
Configuration options from multiple roles can be merged together and included
in the configuration file, or removed conditionally.
Dependent role variables
The role exposes three default variables that can be used by other Ansible roles as dependent variables:
elasticsearch__dependent_role
Required. Name of the role that uses the
debops.elasticsearch
as a dependency. This will be used to store the configuration in its own YAML dictionary. The selected name shouldn't be changed, otherwise configuration will be desynchronized.elasticsearch__dependent_configuration
Required. List of the Elasticsearch configuration options defined in the same format as the main configuration. See elasticsearch__configuration for more details.
elasticsearch__dependent_state
Optional. If not specified or
present
, the configuration will be included in the/etc/elasticsearch/elasticsearch.yml
configuration file and stored as Ansible local fact. Ifabsent
, the configuration will be removed from the generated configuration file.
Dependent configuration storage and retrieval
The dependent configuration from other roles is stored in the secret/
directory on the Ansible Controller (see debops.secret for more details) in
a JSON file, with each role configuration in a separate dictionary. The
debops.elasticsearch
reads this file when Ansible local facts indicate that
the Elasticsearch service is installed, otherwise a new empty file is created.
This ensures that the stale configuration is not present on a new or
re-installed host.
The YAML dictionaries from different roles are be merged with the main
configuration in the elasticsearch__combined_configuration
variable
that is used to generate the final configuration. The merge order of the
different elasticsearch__*_configuration
variables allows to further affect
the dependent configuration through Ansible inventory if necessary, therefore
the Ansible roles that use this method don't need to provide additional
variables for this purpose themselves.
Example role variables
This file shows an example set of default variables included in a role that
uses the debops.elasticsearch
role as a dependency:
---
# State of the application deployment
application__deploy_state: 'present'
# Elasticsearch configuration for application
application__elasticsearch__dependent_configuration:
- name: 'application.option'
value: True
- 'application.other.option': False
Example role playbook
This file shows an example playbook for a role that uses the
debops.elasticsearch
role as a dependency:
---
- name: Manage application
collections: [ 'debops.debops' ]
hosts: [ 'debops_service_elasticsearch_application' ]
become: True
environment: '{{ inventory__environment | d({})
| combine(inventory__group_environment | d({}))
| combine(inventory__host_environment | d({})) }}'
pre_tasks:
- name: Prepare elasticsearch environment
ansible.builtin.import_role:
name: 'elasticsearch'
tasks_from: 'main_env'
tags: [ 'role::elasticsearch', 'role::secret', 'role::elasticsearch:config' ]
roles:
- role: secret
tags: [ 'role::secret', 'role::elasticsearch', 'role::elasticsearch:config' ]
secret__directories:
- '{{ elasticsearch__secret__directories }}'
- role: elasticsearch
tags: [ 'role::elasticsearch' ]
elasticsearch__dependent_role: 'application'
elasticsearch__dependent_state: '{{ application__deploy_state }}'
elasticsearch__dependent_configuration:
- '{{ application__elasticsearch__dependent_configuration }}'
- role: application
tags: [ 'role::application' ]