|
| 1 | += Terraform CLI Cheat Sheet |
| 2 | +Aurélie Vache <https://twitter.com/aurelievache> |
| 3 | +:author: Aurélie Vache |
| 4 | +:authorbio: Cloud Dev(Ops) chez Continental |
| 5 | +:pdf-width: 508mm |
| 6 | +:pdf-height: 361mm |
| 7 | +:version: v1.0.2 |
| 8 | + |
| 9 | +== A propos de la Terraform CLI |
| 10 | + |
| 11 | +Terraform, un outil créé par https://www.hashicorp.com/[Hashicorp] en 2014, |
| 12 | +écrit en Go, permet de construire, modifier et controller la version de votre infrastructure. |
| 13 | +Cet outil a une Command Line Interface (CLI) très intuitive et puissante. |
| 14 | + |
| 15 | +== Installation |
| 16 | + |
| 17 | +=== Installation grâce à curl |
| 18 | + |
| 19 | +.... |
| 20 | +$ curl -O https://releases.hashicorp.com/terraform/ |
| 21 | +0.11.10/terraform_0.11.10_linux_amd64.zip |
| 22 | +$ sudo unzip terraform_0.11.10_linux_amd64.zip |
| 23 | + -d /usr/local/bin/ |
| 24 | +$ rm terraform_0.11.10_linux_amd64.zip |
| 25 | +.... |
| 26 | + |
| 27 | +=== Installation possible également grâce à tfenv : un manager de version pour Terraform |
| 28 | + |
| 29 | +Premièrement, téléchargez le binaire de tfenv et mettez le dans votre PATH. |
| 30 | + |
| 31 | +.... |
| 32 | +$ git clone https://github.com/Zordrak/tfenv.git |
| 33 | + ~/.tfenv |
| 34 | +$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' |
| 35 | + >> $HOME/bashrc |
| 36 | +.... |
| 37 | + |
| 38 | +Ensuite, vous pouvez installer la version de Terraform désirée : |
| 39 | + |
| 40 | +.... |
| 41 | +$ tfenv install 0.11.10 |
| 42 | +.... |
| 43 | + |
| 44 | +== Utilisation |
| 45 | + |
| 46 | +=== Afficher la version |
| 47 | + |
| 48 | +.... |
| 49 | +$ terraform --version |
| 50 | + Terraform v0.11.10 |
| 51 | +.... |
| 52 | + |
| 53 | +=== Initialiser Terraform |
| 54 | + |
| 55 | +`$ terraform init` |
| 56 | + |
| 57 | +C'est la première commande que vous devez éxécuter. Sinon, terraform plan, apply, |
| 58 | +destroy et import ne fonctionneront pas. Cette commande terraform init va installer : |
| 59 | + |
| 60 | +* les modules terraform |
| 61 | +* éventuellement un backend |
| 62 | +* et les plugins/providers |
| 63 | + |
| 64 | +=== Initialiser Terraform et forcer de ne pas demander une entrée |
| 65 | + |
| 66 | +`$ terraform init -input=false` |
| 67 | + |
| 68 | +=== Changer la configuration du backend durant l'initialisation |
| 69 | + |
| 70 | +`$ terraform init -backend-config=cfg/s3.dev.tf -reconfigure` |
| 71 | + |
| 72 | +`-reconfigure` est utilisé afin de demander à terraform de ne pas copier le state existant vers le lieu du nouveau remote state. |
| 73 | + |
| 74 | +=== Get |
| 75 | + |
| 76 | +Cette commande est utile lorsque vous avez défini des modules. Les modules sont vendored |
| 77 | +donc lorsque l'on en édite un, il faut encore récupérer (faire un get) du nouveau contenu du module. |
| 78 | + |
| 79 | +`$ terraform get -update=true` |
| 80 | + |
| 81 | +Lorsque vous utilisez des modules, la première chose à faire est de faire un terraform get. La commande va faire un pull des modules dans le répertoire .terraform. A ce moment là vous avez le module vendoré. |
| 82 | + |
| 83 | +=== Plan |
| 84 | + |
| 85 | +L'étape plan vérifie la configuration à exécuter et écrit un plan à appliquer chez le fournisseur d'infrastructure. |
| 86 | + |
| 87 | +`$ terraform plan -out plan.out` |
| 88 | + |
| 89 | +C'est une fonctionnalité importante de Terraform qui permet à l'utilisateur de voir quelles actions |
| 90 | +Terraform exécutera avant d’apporter des modifications, ce qui augmentera la confiance qu’un |
| 91 | +changement aura l'effet désiré une fois appliqué. |
| 92 | + |
| 93 | +Lorsque vous exécutez la commande terraform plan, terraform analyse tous les fichiers *.tf de |
| 94 | +votre répertoire et créé le plan. |
| 95 | + |
| 96 | +=== Apply |
| 97 | + |
| 98 | +Vous avez maintenant le state souhaité donc vous pouvez exécuter le plan. |
| 99 | + |
| 100 | +`$ terraform apply plan.out` |
| 101 | + |
| 102 | +*Bon à savoir :* Depuis terraform v0.11+, en mode interactif (pas exécuter dans une chaine de CI/CD/ dans un pipeline autonome), vous pouvez simplement exécuter la commande `terraform apply` qui |
| 103 | +affichera les actions que TF effectuera. |
| 104 | + |
| 105 | +En générant le plan et en l’appliquant dans la même commande, Terraform peut |
| 106 | +garantir que le plan d'exécution ne changera pas, sans qu'il soit nécessaire de l'écrire sur disque. Cela réduit le risque de laisser des données potentiellement sensibles, ou |
| 107 | +d'accidentellement le versionner. |
| 108 | + |
| 109 | +`$ terraform apply` |
| 110 | + |
| 111 | +==== Appliquer et aprouver automatiquement |
| 112 | + |
| 113 | +`$ terraform apply -auto-approve` |
| 114 | + |
| 115 | +==== Appliquer et définir de nouvelle valeurs de variables |
| 116 | + |
| 117 | +.... |
| 118 | +$ terraform apply -auto-approve |
| 119 | +-var tags-repository_url=${GIT_URL} |
| 120 | +.... |
| 121 | + |
| 122 | +==== Appliquer uniquement un module |
| 123 | + |
| 124 | +.... |
| 125 | +$ terraform apply -target=module.s3 |
| 126 | +.... |
| 127 | + |
| 128 | +Cette option _-target_ fonctionne également avec la commande _terraform plan_. |
| 129 | + |
| 130 | +=== Destroy |
| 131 | + |
| 132 | +`$ terraform destroy` |
| 133 | + |
| 134 | +Supprime toutes les resources ! |
| 135 | + |
| 136 | +Un plan de suppresion peut être créé avant : |
| 137 | + |
| 138 | +`$ terraform plan –destroy` |
| 139 | + |
| 140 | +L'option `-target` permet de détruire uniquement une resource, par exemple un bucket S3 : |
| 141 | + |
| 142 | +.... |
| 143 | +$ terraform destroy -target aws_s3_bucket.my_bucket |
| 144 | +.... |
| 145 | + |
| 146 | +=== Debug |
| 147 | + |
| 148 | +La commande Terraform console est utile pour tester les interpolations avant de les utiliser dans les ressources à créer ou modifier. Terraform console va lire le state confgiuré même si ce dernier est en remote. |
| 149 | + |
| 150 | +.... |
| 151 | +$ echo "aws_iam_user.notif.arn" | terraform console |
| 152 | +arn:aws:iam::123456789:user/notif |
| 153 | +.... |
| 154 | + |
| 155 | +=== Graph |
| 156 | + |
| 157 | +`$ terraform graph | dot –Tpng > graph.png` |
| 158 | + |
| 159 | +Graph visuel des dépendances des ressources Terraform. |
| 160 | + |
| 161 | +=== Validate |
| 162 | + |
| 163 | +La commande validate est utilisée pour valider / vérifier la syntaxe des fichiers Terraform. Une vérification de la syntaxe est effectuée sur tous les fichiers terraform du répertoire et affiche une erreur si l'un des fichiers ne se valide pas. La vérification de la syntaxe ne couvre pas tous les problèmes courants liés à la syntaxe. |
| 164 | + |
| 165 | +.... |
| 166 | +$ terraform validate |
| 167 | +.... |
| 168 | + |
| 169 | +=== Providers |
| 170 | + |
| 171 | +Vous pouvez utiliser un grand nombre de providers/plugins dans vos définition de ressources terraform. Il peut donc être utile de disposer d'un arbre de providers utilisés par les modules de votre projet. |
| 172 | + |
| 173 | +.... |
| 174 | +$ terraform providers |
| 175 | +. |
| 176 | +├── provider.aws ~> 1.54.0 |
| 177 | +├── module.my_module |
| 178 | +│ ├── provider.aws (inherited) |
| 179 | +└── module.elastic |
| 180 | + └── provider.aws (inherited) |
| 181 | +.... |
| 182 | + |
| 183 | +== State |
| 184 | + |
| 185 | +=== Pull le remote state dans une copie locale |
| 186 | + |
| 187 | +.... |
| 188 | +$ terraform state pull > terraform.tfstate |
| 189 | +.... |
| 190 | + |
| 191 | +=== Push state dans un stockage de backend remote |
| 192 | + |
| 193 | +.... |
| 194 | +$ terraform state push |
| 195 | +.... |
| 196 | + |
| 197 | +Cette commande est utile si par exemple à l'origine vous avez utilisé un tf state en local et qu'ensuite vous definissez un stockage de backend, dans un bucket S3 ou avec COonsul par exemple. |
| 198 | + |
| 199 | +=== Comment demander à Terraform que vous avez déplacé une ressource dans un module ? |
| 200 | + |
| 201 | +Si vous avez déplacé une ressource existante , vous devez mettre a jour le state : |
| 202 | + |
| 203 | +.... |
| 204 | +$ terraform state mv aws_iam_role.role1 module.mymodule |
| 205 | +.... |
| 206 | + |
| 207 | +=== Comment importer une ressource existante dans Terraform ? |
| 208 | + |
| 209 | +Si vous avez une ressource existante dans votre provider d’infrastructure, vous pouvez l'importer |
| 210 | +dans votre state Terraform : |
| 211 | + |
| 212 | +.... |
| 213 | +$ terraform import aws_iam_policy.elastic_post |
| 214 | +arn:aws:iam::123456789:policy/elastic_post |
| 215 | +.... |
| 216 | + |
| 217 | +== Workspaces |
| 218 | + |
| 219 | +Terraform workspace est une fonctionnalité qui permet de gérer plusieurs environnements distincts. |
| 220 | + |
| 221 | +Au lieu de créer un répertoire pour chaque environnement à gérer, nous devons simplement |
| 222 | +créer l'espace de travail/le workspace nécessaire et l'utiliser : |
| 223 | + |
| 224 | +=== Créer un workspace |
| 225 | + |
| 226 | +Cette commande créé un nouveau workspace et le sélectionne |
| 227 | + |
| 228 | +`$ terraform workspace new dev` |
| 229 | + |
| 230 | +=== Sélectionner un workspace |
| 231 | + |
| 232 | +`$ terraform workspace select dev` |
| 233 | + |
| 234 | +=== Lister les workspaces |
| 235 | + |
| 236 | +.... |
| 237 | +$ terraform workspace list |
| 238 | + default |
| 239 | +* dev |
| 240 | + prelive |
| 241 | +.... |
| 242 | + |
| 243 | +=== Afficher le workspace courant |
| 244 | + |
| 245 | +.... |
| 246 | +$ terraform workspace show |
| 247 | +dev |
| 248 | +.... |
| 249 | + |
| 250 | +== Outils |
| 251 | + |
| 252 | +=== jq |
| 253 | + |
| 254 | +jq est une "command-line JSON processor" légère. Combiné avec les outputs Terraform cela peut être très puissant. |
| 255 | + |
| 256 | +==== Installation |
| 257 | + |
| 258 | +Pour Linux : |
| 259 | + |
| 260 | +`$ sudo apt-get install jq` |
| 261 | + |
| 262 | +ou |
| 263 | + |
| 264 | +`$ yum install jq` |
| 265 | + |
| 266 | +Pour OS X : |
| 267 | + |
| 268 | +`$ brew install jq` |
| 269 | + |
| 270 | +==== Utilisation |
| 271 | + |
| 272 | +Il suffit de définir des outputs dans un module, et lorsque vous exécutez _terraform apply_, les outputs sont affichés : |
| 273 | + |
| 274 | +.... |
| 275 | +$ terraform apply |
| 276 | +... |
| 277 | +Apply complete! Resources: 0 added, 0 changed, |
| 278 | + 0 destroyed. |
| 279 | +
|
| 280 | +Outputs: |
| 281 | +
|
| 282 | +elastic_endpoint = vpc-toto-12fgfd4d5f4ds5fngetwe4. |
| 283 | +eu-central-1.es.amazonaws.com |
| 284 | +.... |
| 285 | + |
| 286 | +Vous pouvez extraire la valeur désirée afin de l'utiliser dans un script par exemple. Avec jq c'est facile : |
| 287 | + |
| 288 | +.... |
| 289 | +$ terraform output -json |
| 290 | +{ |
| 291 | + "elastic_endpoint": { |
| 292 | + "sensitive": false, |
| 293 | + "type": "string", |
| 294 | + "value": "vpc-toto-12fgfd4d5f4ds5fngetwe4. |
| 295 | + eu-central-1.es.amazonaws.com" |
| 296 | + } |
| 297 | +} |
| 298 | +
|
| 299 | +$ terraform output -json | jq '.elastic_endpoint.value' |
| 300 | +"vpc-toto-12fgfd4d5f4ds5fngetwe4.eu-central-1. |
| 301 | +es.amazonaws.com" |
| 302 | +.... |
| 303 | + |
| 304 | +=== Terraforming |
| 305 | + |
| 306 | +Si vous avez un compte AWS existant avec des composants existants tels que |
| 307 | +des buckets S3, SNS, VPC… Vous pouvez utiliser l’outil terraforming, un outil écrit en Ruby, |
| 308 | +qui extrait les ressources AWS existantes et les convertissent en fichiers Terraform ! |
| 309 | + |
| 310 | +==== Installation |
| 311 | + |
| 312 | +`$ sudo apt install ruby` |
| 313 | +ou |
| 314 | +`$ sudo yum install ruby` |
| 315 | + |
| 316 | +et |
| 317 | +.... |
| 318 | +$ gem install terraforming |
| 319 | +.... |
| 320 | + |
| 321 | +==== Utilisation |
| 322 | + |
| 323 | +Pré-requis : |
| 324 | + |
| 325 | +Comme avec Terraform, vous devez settez les credentials AWS |
| 326 | + |
| 327 | +.... |
| 328 | +$ export AWS_ACCESS_KEY_ID="an_aws_access_key" |
| 329 | +$ export AWS_SECRET_ACCESS_KEY="a_aws_secret_key" |
| 330 | +$ export AWS_DEFAULT_REGION="eu-central-1" |
| 331 | +.... |
| 332 | + |
| 333 | +Vous pouvez également spécifier le profile des credentials dans _~/.aws/credentials_ avec l'option _–profile_. |
| 334 | + |
| 335 | +.... |
| 336 | +$ cat ~/.aws/credentials |
| 337 | +[aurelie] |
| 338 | +aws_access_key_id = xxx |
| 339 | +aws_secret_access_key = xxx |
| 340 | +aws_default_region = eu-central-1 |
| 341 | +.... |
| 342 | + |
| 343 | +.... |
| 344 | +$ terraforming s3 --profile aurelie |
| 345 | +.... |
| 346 | + |
| 347 | +Utilisation |
| 348 | + |
| 349 | +.... |
| 350 | +$ terraforming --help |
| 351 | +Commands: |
| 352 | +terraforming alb # ALB |
| 353 | +... |
| 354 | +terraforming vpc # VPC |
| 355 | +.... |
| 356 | + |
| 357 | +Exemple : |
| 358 | + |
| 359 | +`$ terraforming s3 > aws_s3.tf` |
| 360 | + |
| 361 | +Remarques : terraforming ne peut pas extraire, pour le moment, les ressources de type API Gateway donc vous devez les écrire manuellement. |
0 commit comments