O que eu faria é ter papéis para cada serviço do sistema que seu aplicativo precisa, um play e um role para cada aplicativo / microservice e variáveis de grupo e / ou host e variáveis de função e padrões que definem o que fazer.
Eu implanto um monte de aplicativos baseados em PHP, de modo que se parece muito com isso:
Eu terei uma peça app_microservice.yml
:
---
- hosts: app_microservice_servers
roles:
- nginx
- mariadb
- php-fpm
- app_microservice
Então, vou ter uma função roles/app_microservice
, que implanta o código. Quando executo essa peça, os pré-requisitos nginx, mariadb e php-fpm serão instalados e configurados primeiro, se ainda não tiverem sido.
Além de chamar roles
, uma reprodução também pode ser executada arbitrariamente em tasks
. Sinta-se à vontade para misturá-los e combiná-los se algo for simples o suficiente para que não seja necessário um papel completo.
Esta jogada também vai para all.yml
, juntamente com todas as outras reproduções, para que eu possa ocasionalmente fazer ansible-playbook all.yml
. Lembre-se de que o ansible não garante a idempotência como o fantoche tenta, então isso é algo que você deve tomar cuidado.
- include: app_microservice.yml
Eu uso variáveis group para definir coisas que são comuns a um grupo (embora existam algumas poucas que não caberão nas variáveis role ou padrões ), variáveis de all
do grupo para material global e variáveis host para qualquer coisa que seja exclusiva de um host.
Por exemplo, eu dou uma senha de root do MySQL para todos os hosts, mas tenho cifras e protocolos SSL definidos em group_vars/all/main.yml
para que, se precisarem ser alterados, haja uma fonte de verdade para eles.