Je suis également en train de migrer l'infrastructure AWS existante vers Terraform, je vais donc essayer de mettre à jour la réponse au fur et à mesure de mon développement.
Je me suis fortement appuyé sur les exemples officiels de Terraform et sur de multiples essais et erreurs pour étoffer les domaines dans lesquels j'étais incertain.
.tfstate
des dossiers
Terraform config peut être utilisé pour provisionner de nombreuses boîtes sur différentes infrastructures, chacune pouvant avoir un état différent. Comme il peut également être exécuté par plusieurs personnes, cet état doit être dans un emplacement centralisé (comme S3) mais pas git.
Cela peut être confirmé en regardant le Terraform .gitignore
.
Contrôle développeur
Notre objectif est de fournir plus de contrôle de l'infrastructure aux développeurs tout en maintenant un audit complet (git log) et la possibilité de vérifier les modifications (pull requests). Dans cet esprit, le nouveau flux de travail d'infrastructure que je vise est:
- Base de base des AMI communes qui incluent des modules réutilisables, par exemple des marionnettes.
- Infrastructure de base fournie par DevOps à l'aide de Terraform.
- Les développeurs modifient la configuration de Terraform dans Git selon les besoins (nombre d'instances; nouveau VPC; ajout de région / zone de disponibilité, etc.).
- La configuration Git a été poussée et une demande d'extraction soumise à une vérification de validité par un membre de l'équipe DevOps.
- S'il est approuvé, appelle le webhook à CI pour créer et déployer (ne sait pas comment partitionner plusieurs environnements pour le moment)
Edit 1 - Mise à jour sur l'état actuel
Depuis que j'ai commencé cette réponse, j'ai écrit beaucoup de code TF et je me sens plus à l'aise dans notre situation. Nous avons rencontré des bogues et des restrictions en cours de route, mais j'accepte que ce soit une caractéristique de l'utilisation de nouveaux logiciels en évolution rapide.
Disposition
Nous avons une infrastructure AWS compliquée avec plusieurs VPC, chacun avec plusieurs sous-réseaux. La clé pour gérer facilement cela était de définir une taxonomie flexible qui englobe la région, l'environnement, le service et le propriétaire que nous pouvons utiliser pour organiser notre code d'infrastructure (à la fois terraform et marionnette).
Modules
L'étape suivante a été de créer un référentiel git unique pour stocker nos modules terraform. Notre structure de répertoire de niveau supérieur pour les modules ressemble à ceci:
tree -L 1 .
Résultat:
├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates
Chacun définit des valeurs par défaut saines mais les expose comme des variables qui peuvent être écrasées par notre "glue".
La colle
Nous avons un deuxième référentiel avec notre glue
qui utilise les modules mentionnés ci-dessus. Il est présenté conformément à notre document de taxonomie:
.
├── README.md
├── clientA
│ ├── eu-west-1
│ │ └── dev
│ └── us-east-1
│ └── dev
├── clientB
│ ├── eu-west-1
│ │ ├── dev
│ │ ├── ec2-keys.tf
│ │ ├── prod
│ │ └── terraform.tfstate
│ ├── iam.tf
│ ├── terraform.tfstate
│ └── terraform.tfstate.backup
└── clientC
├── eu-west-1
│ ├── aws.tf
│ ├── dev
│ ├── iam-roles.tf
│ ├── ec2-keys.tf
│ ├── prod
│ ├── stg
│ └── terraform.tfstate
└── iam.tf
Au niveau du client, nous avons des .tf
fichiers spécifiques au compte AWS qui fournissent des ressources globales (comme les rôles IAM); Vient ensuite le niveau de la région avec les clés publiques EC2 SSH; Enfin , dans notre environnement ( dev
, stg
, prod
etc.) sont nos configurations de VPC, la création d'instance et de connexions de peering etc. sont stockés.
Note latérale: comme vous pouvez le voir, je vais à l'encontre de mes propres conseils ci-dessus en gardant terraform.tfstate
dans git. C'est une mesure temporaire jusqu'à ce que je passe à S3 mais me convient car je suis actuellement le seul développeur.
Prochaines étapes
Il s'agit toujours d'un processus manuel et pas encore dans Jenkins, mais nous portons une infrastructure assez grande et compliquée et jusqu'à présent tout va bien. Comme je l'ai dit, peu de bugs mais ça va bien!
Edit 2 - Modifications
Cela fait presque un an que j'ai écrit cette première réponse et l'état de Terraform et de moi-même a considérablement changé. Je suis maintenant à une nouvelle position en utilisant Terraform pour gérer un cluster Azure et Terraform l'est maintenant v0.10.7
.
Etat
Les gens m'ont dit à plusieurs reprises que l'État ne devrait pas entrer dans Git - et ils ont raison. Nous avons utilisé cela comme mesure provisoire avec une équipe de deux personnes qui reposait sur la communication et la discipline des développeurs. Avec une équipe plus importante et distribuée, nous exploitons désormais pleinement l'état distant dans S3 avec le verrouillage fourni par DynamoDB. Idéalement, cela sera migré vers consul maintenant, c'est la v1.0 pour couper les fournisseurs de cloud cross.
Modules
Auparavant, nous avons créé et utilisé des modules internes. C'est toujours le cas, mais avec l'avènement et la croissance du registre Terraform, nous essayons de les utiliser au moins comme base.
Structure des fichiers
La nouvelle position a une taxonomie beaucoup plus simple avec seulement deux environnements infx - dev
et prod
. Chacun a ses propres variables et sorties, réutilisant nos modules créés ci-dessus. Le remote_state
fournisseur aide également à partager les sorties des ressources créées entre les environnements. Notre scénario consiste en des sous-domaines de différents groupes de ressources Azure vers un TLD géré globalement.
├── main.tf
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
Planification
Encore une fois, avec les défis supplémentaires d'une équipe distribuée, nous sauvegardons désormais toujours notre sortie de la terraform plan
commande. Nous pouvons inspecter et savoir ce qui sera exécuté sans risque de changements entre les étapes plan
et apply
(bien que le verrouillage aide à cela). N'oubliez pas de supprimer ce fichier de plan car il pourrait contenir des variables "secrètes" en texte brut.
Dans l'ensemble, nous sommes très satisfaits de Terraform et continuons à apprendre et à nous améliorer grâce aux nouvelles fonctionnalités ajoutées.