Il s'agit d'une question très large sur les méthodes et les conseils concernant les variables / structure de l'environnement. Mais en fin de compte, je cherche des réponses à la question très spécifique de "Comment dois-je stocker mes variables d'environnement?"
Tout d'abord quelques clarifications:
- Un environnement pour moi peut être de 3 à 10 serveurs et est un moyen de contenir l'infrastructure d'un client spécifique.
- À l'intérieur de chaque environnement, il y a quelques variables qui sont pour la plupart générées automatiquement à partir de quelques entrées clés (nom, taille, etc.).
Dans l'état actuel des choses, nous stockons toutes nos variables d'environnement dans une structure comme celle-ci:
<playbook>.yml # Various playbooks for deployment
roles/windows # Ansible role for Ubuntu
roles/ubuntu # Ansible role for Ubuntu
config/hosts/<name>.yml # Ansible inventory
config/hosts/vars/<name>.json # Environment specific variables
À l'heure actuelle, la configuration est initialisée en tant que sous-module dans le référentiel git ci-dessus. Comme le fichier de variables change assez fréquemment, cela a provoqué des problèmes de modification des données, une, deux ou même trois fois entre les validations, rendant les modifications de plus en plus difficiles à suivre.
Comme je le vois personnellement, nous devrions chercher à stocker toutes nos variables client de manière centralisée / évolutive, puis à s'y connecter avec un inventaire dynamique avec ansible .
Je comprends qu'il existe quelques technologies qui semblent faire une partie de ce qui pourrait être nécessaire, comme Consul, mais elles semblent fonctionner mieux dans un environnement qui sert une grande application plutôt que de nombreuses petites plus légèrement différentes.
Je vois essentiellement que nous devons écrire un script d'inventaire, puis simplement pousser toutes nos données dans une base de données construite à des fins non spécifiques, puis continuer comme si rien n'avait changé. Je vois cela en théorie comme un moyen de réduire potentiellement un grand nombre de données que nous stockons actuellement et peut-être d'examiner différentes façons de stocker les données plutôt que de simplement augmenter ce qui les sert à nouveau.
J'espère que quelqu'un a une certaine expérience dans la mise en œuvre d'une infrastructure en tant que code lorsqu'il doit gérer de nombreux environnements plus petits, par opposition à un, deux ou trois énormes.
Aucune suggestion?
Si vos environnements sont par client, je suggérerais dans votre cas spécifique d'avoir un référentiel par client . (En général, il s'agit d'un référentiel par environnement.) Ce référentiel aurait une structure de répertoire standard pour les variables d'environnement, les variables et inventaires ansibles, les secrets fortement cryptés (jetons d'accès au compte, clés privées, etc.). Vous git sous-modulez le code dans ces référentiels. Je le ferais probablement dans plusieurs référentiels. Un pour les rôles et modules ansibles, un pour les scripts de maintenance et de déploiement, un pour chaque application principale exécutée dans les environnements.
Maintenant, vous pouvez éventuellement fourcher le code ou épingler le sous-module à une balise spécifique pour la publication , en vous assurant que le code gérant l'environnement du client ne changera pas à moins qu'il ne soit testé et publié.
Si vous utilisez un référentiel d'artefacts , assurez-vous que les artefacts sont correctement versionnés et que ces versions sont correctement spécifiées dans les variables d'environnement.
L'automatisation est importante car les variables d'environnement ne doivent pas être mises à jour par les humains dans la mesure du possible, mais générées par des scripts. Assurez-vous qu'il n'y a presque pas de mises à jour manuelles dans l'inventaire par client et que les développeurs ne mettent à jour que les référentiels de code. S'ils souhaitent modifier la configuration, cela doit être fait pour l'un des scripts de génération, qui est ensuite exécuté pour générer les variables et le diff est validé dans le référentiel client. Il est avantageux de configurer une intégration continue pour ce processus. Sans cela à un moment donné, il y aura trop de référentiels à maintenir .
la source