Une astuce Ansible souvent méconnue qui permet de factoriser un projet complexe au travers des group_vars
.
Astuce
Utiliser un répertoire comme group_var
au lieu d’un fichier. Cela permet de lire tous les fichiers directement contenus dans ce répertoire.
Les fichiers qui composent ce répertoire (qui fait référence à un group_var) soient des fichiers physiques ou des liens symboliques vers d’autres fichiers.
Pratique pour factoriser le code quand on manipule plusieurs vecteurs d’approche d’une application : env, pays, composants génériques et spécifiques, etc.
Contexte projet
Un projet ecommerce construit sa plateforme en tenant compte des éléments suivants :
- Le pays dans il est déployé (country),
- Les composants à intégrer (stock et price) qui dépendent du pays ou d’autre service
- L’environnement dans lequel il est déployé (dev)
On cumule ainsi 4 composantes à variabiliser.
Arboresence du projet Ansible
ansible/ ├── inventories/ │ └── dev.ini └── group_vars/ └── ecommerce/ ├── country.yaml ├── stock.yaml ├── price.yaml └── environment.yaml
Inventories
api01 stock01 price01 [stock] stock01 [price] price01 [ecommerce] api01 [ecommerce:children] stock price [dev:children] ecommerce
Group vars
env: dev
country: France country_code: FR
ecommerce_stock_api_url: https://dev.stock.ecommerce.fr/api/v1
ecommerce_price_api_url: https://dev.price.ecommerce.fr/api/v1
Playbook
- hosts: price tasks: - debug: var: env - debug: var: country - debug: var: ecommerce_stock_api_url
Exécution
ansible-playbook -i inventories/dev.ini ecommerce.yaml
Résultat :
TASK [debug] **************************************************************************ok: [price01] => { "env": "dev" } TASK [debug] **************************************************************************ok: [price01] => { "country": "France" } TASK [debug] **************************************************************************ok: [price01] => { "ecommerce_stock_api_url": "https://dev.stock.ecommerce.fr/api/v1" }
Factorisation des configurations
La déclinaison des 3 composantes de la plateforme (country, stock, price) par environnement démultiplierait les configurations.
Plusieurs ficheirsde configuration stock, price et country avec les mêmes informations.
Pour éviter la multiplication des fichiers à éditer pour modifier la configuration, il est parfaitement possible de créer des liens symboliques vers des fichiers plus haut dans l’arborescence.
ansible/ ├── inventories/ │ └── dev.ini └── group_vars/ ├── ecommerce/ │ ├── country.yaml > ../country/fr.yaml │ └── stock.yaml > ../dev-stock.yaml ├── country/ │ └── fr.yaml ├── dev-stock.yaml └── dev/ ├── price.yaml └── environment.yaml
J’ai volontairement effectué plusieurs changements :
- Lien symbolique du fichier
ecommerce/country.yaml
pour lire le fichiercountry/fr.yaml
- Lien symbolique du fichier
ecommerce/stock.yaml
pour lire le fichierdev-stock.yaml
- Déplacement du fichier
ecommerce/environment.yaml
dans le group_vardev
(qui correspond à un groupe dans l’inventaire) - Déplacement du fichier
ecommerce/price.yaml
dans le group_vardev
(qui correspond à un groupe dans l’inventaire)
On simplifie ainsi la structure dans le cas où le nombre de composantes explosent : env, country, stock, price, etc…