Introduction

Vault, de Hashicorp, est un outil open-source permettant de stocker en toute sécurité des secrets et des données sensibles dans des environnements cloud dynamiques. Packer et Terraform, également développés par Hashicorp, peuvent être utilisés ensemble pour créer et déployer des images de Vault.

Dans ce tutoriel, vous utiliserez Packer pour créer un instantané immuable du système avec Vault installé, et orchestrer son déploiement à l'aide de Terraform.

Pour obtenir une version plus détaillée de ce tutoriel, veuillez vous reporter à Comment construire un serveur Hashicorp Vault en utilisant Packer et Terraform sur the cloud provider.

Conditions préalables

cloud provider illustration for: Conditions préalables
  • Une clé SSH que vous utiliserez pour vous authentifier avec les droplets Vault déployés ; elle est disponible sur votre machine locale et ajoutée à votre compte the cloud provider. Vous aurez également besoin de l'empreinte digitale associée, que vous pourrez copier à partir de la page de sécurité de votre compte une fois que vous l'aurez ajoutée. Consultez la documentation de the cloud provider pour obtenir des instructions détaillées, ou encore le tutoriel Comment configurer les clés SSH.

Étape 1 - Création d'un modèle Packer

Créez le répertoire ~/vault-orchestration et accédez à celui-ci pour stocker vos fichiers Vault :

				
					
mkdir ~/vault-orchestration

cd ~/vault-orchestration

				
			

Créez des répertoires distincts pour Packer et pour la configuration Terraform en exécutant :

				
					
mkdir packer terraform

				
			

Naviguez vers le répertoire Packer :

				
					
cd packer

				
			

Utilisation des variables du modèle

Créez un objet variables.json dans votre sous-répertoire packer pour stocker vos données variables privées :

				
					
nano variables.json

				
			

Ajoutez les lignes suivantes :

				
					
[label ~/vault-orchestration/packer/variables.json]

{

  "do_token": "<^>your_do_api_key<^>",

  "base_system_image": "ubuntu-18-04-x64",

  "region": "nyc3",

  "size": "s-1vcpu-1gb"

}

				
			

Vous utiliserez ces variables dans le modèle que vous êtes sur le point de créer. Vous pouvez modifier les valeurs de l'image de base, de la région et de la taille des Droplets, en fonction des developer docs.

Remplacez <^>your_do_api_key<^> par votre clé API, puis enregistrez et fermez le fichier.

Création de constructeurs et de fournisseurs

Créez votre modèle Packer pour Vault dans un fichier nommé template.json :

				
					
nano template.json

				
			

Ajoutez les lignes suivantes :

				
					
[label ~/vault-orchestration/packer/template.json]

{

   "builders": [{

       "type": "the cloud provider",

       "api_token": "{{user `do_token`}}",

       "image": "{{user `base_system_image`}}",

       "region": "{{user `region`}}",

       "size": "{{user `size`}}",

       "ssh_username": "root"

   }],

   "provisioners": [{

       "type": "shell",

       "inline": [

           "sleep 30",

           "sudo apt-get update",

           "sudo apt-get install unzip -y",

           "curl -L &lt;^&gt;https://releases.hashicorp.com/vault/1.3.2/vault_1.3.2_linux_amd64.zip&lt;^&gt; -o vault.zip",

           "unzip vault.zip",

           "sudo chown root:root vault",

           "mv vault /usr/local/bin/",

           "rm -f vault.zip"

       ]

}]

}

				
			

Vous définissez un constructeur the cloud provider unique. Packer créera un droplet temporaire de la taille, de l'image et de la région définis en utilisant la clé API fournie.

Le provisionneur s'y connectera en utilisant SSH avec le nom d'utilisateur spécifié et exécutera séquentiellement tous les provisionneurs définis avant de créer un instantané the cloud provider à partir du Droplet et de le supprimer.

Il est de type shell, qui va exécuter les commandes données sur la cible. Les commandes du modèle attendront 30 secondes que le système démarre, puis téléchargeront et décompresseront Vault <^>1.3.2<^>. Consultez la page officielle de téléchargement de Vault afin d'obtenir la version la plus récente pour Linux.

Enregistrez et fermez le fichier.

Vérifiez la validité de votre modèle :

				
					
packer validate -var-file=variables.json template.json

				
			

Vous verrez la sortie suivante :

				
					
[secondary_label Output]

Template validated successfully.

				
			

Étape 2 - Création de l'instantané

Construisez votre instantané avec la commande Packer build :

				
					
packer build -var-file=variables.json template.json

				
			

Vous verrez beaucoup de sorties qui ressembleront à ceci :

				
					
[secondary_label Output]

the cloud provider: output will be in this color.



==&gt; the cloud provider: Creating temporary ssh key for droplet...

==&gt; the cloud provider: Creating droplet...

==&gt; the cloud provider: Waiting for droplet to become active...

==&gt; the cloud provider: Using ssh communicator to connect: ...

==&gt; the cloud provider: Waiting for SSH to become available...

==&gt; the cloud provider: Connected to SSH!

==&gt; the cloud provider: Provisioning with shell script: /tmp/packer-shell035430322

...

==&gt; the cloud provider:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

==&gt; the cloud provider:                                  Dload  Upload   Total   Spent    Left  Speed

  the cloud provider: Archive:  vault.zip

==&gt; the cloud provider: 100 45.5M  100 45.5M    0     0   154M      0 --:--:-- --:--:-- --:--:--  153M

  the cloud provider:   inflating: vault

==&gt; the cloud provider: Gracefully shutting down droplet...

==&gt; the cloud provider: Creating snapshot: packer-1581537927

==&gt; the cloud provider: Waiting for snapshot to complete...

==&gt; the cloud provider: Destroying droplet...

==&gt; the cloud provider: Deleting temporary ssh key...

Build 'the cloud provider' finished.



==&gt; Builds finished. The artifacts of successful builds are:

--&gt; the cloud provider: A snapshot was created: 'packer-1581537927' &lt;^&gt;(ID: 58230938)&lt;^&gt; in regions '...'

				
			

La dernière ligne contient le nom de l'instantané (tel que packer-1581537927) et son ID entre parenthèses, mis en évidence ici. Notez votre ID de l'instantané, car vous en aurez besoin à l'étape suivante.

Si le processus de construction échoue à cause d'erreurs d'API, attendez quelques minutes puis réessayez.

Étape 3 - Rédaction de la configuration de Terraform

Naviguez vers le sous-répertoire terraform :

				
					
cd ~/vault-orchestration/terraform

				
			

Créez un fichier nommé do-provider.tf pour stocker le fournisseur :

				
					
nano do-provider.tf

				
			

Ajoutez les lignes suivantes :

				
					
[label ~/vault-orchestration/terraform/do-provider.tf]

variable "do_token" {

}



variable "ssh_fingerprint" {

}



variable "instance_count" {

default = "1"

}



variable "do_snapshot_id" {

}



variable "do_name" {

default = "vault"

}



variable "do_region" {

}



variable "do_size" {

}



variable "do_private_networking" {

default = true

}



provider "the cloud provider" {

token = var.do_token

}

				
			

Ce fichier fournit une clé API au fournisseur the cloud provider. Pour spécifier les valeurs de ces variables, vous allez créer un _fichier de définitions de variables_, de la même manière que Packer. Le nom de fichier doit se terminer par .tfvars ou .tfvars.json.

Enregistrez et fermez le fichier.

Créez un fichier de définitions variables :

				
					
nano definitions.tfvars

				
			

Ajoutez les lignes suivantes :

				
					
[label ~/vault-orchestration/terraform/definitions.tf]

do_token         = "&lt;^&gt;your_do_api_key&lt;^&gt;"

ssh_fingerprint  = "&lt;^&gt;your_ssh_key_fingerprint&lt;^&gt;"

do_snapshot_id   = &lt;^&gt;your_do_snapshot_id&lt;^&gt;

do_name          = "vault"

do_region        = "nyc3"

do_size          = "s-1vcpu-1gb"

instance_count   = 1

				
			

Remplacez <^>your_do_api_key<^>, <^>your_ssh_key_fingerprint<^> et <^>your_do_snapshot_id<^> (l'ID de l'instantané que vous avez noté à l'étape précédente). Les paramètres do_region et do_size doivent porter les mêmes valeurs que dans le fichier de variables Packer.

Enregistrez et fermez le fichier.

Créez le fichier suivant pour stocker la configuration de déploiement de l'instantané Vault :

				
					
nano deployment.tf

				
			

Ajoutez les lignes suivantes :

				
					
[label ~/vault-orchestration/terraform/deployment.tf]

resource "the cloud provider_droplet" "vault" {

count              = var.instance_count

image              = var.do_snapshot_id

name               = var.do_name

region             = var.do_region

size               = var.do_size

private_networking = var.do_private_networking

ssh_keys = [

  var.ssh_fingerprint

]

}



output "instance_ip_addr" {

value = {

  for instance in the cloud provider_droplet.vault:

  instance.id =&gt; instance.ipv4_address

}

description = "The IP addresses of the deployed instances, paired with their IDs."

}

				
			

Vous définissez ici une _ressource_ unique du type the cloud provider_droplet nommée vault. Vous définissez ses paramètres en fonction des valeurs des variables et ajoutez une clé SSH (en utilisant son empreinte digitale) de votre compte the cloud provider à la ressource droplet. Vous fournissez à la console les adresses IP de toutes les instances nouvellement déployées.

Enregistrez et fermez le fichier.

Initialisez le répertoire en tant que projet Terraform :

				
					
terraform init

				
			

Vous verrez la sortie suivante :

				
					
[secondary_label Output]



Initializing the backend...



Initializing provider plugins...



The following providers do not have any version constraints in configuration,

so the latest version was installed.



To prevent automatic upgrades to new major versions that may contain breaking

changes, it is recommended to add version = "..." constraints to the

corresponding provider blocks in configuration, with the constraint strings

suggested below.



* provider.the cloud provider: version = "~&gt; 1.14"



Terraform has been successfully initialized!



You may now begin working with Terraform. Try running "terraform plan" to see

any changes that are required for your infrastructure. All Terraform commands

should now work.



If you ever set or change modules or backend configuration for Terraform,

rerun this command to reinitialize your working directory. If you forget, other

commands will detect it and remind you to do so if necessary.

				
			

Étape 4 - Déploiement de Vault à l'aide de Terraform

Testez la validité de votre configuration :

				
					
terraform validate

				
			

Vous verrez la sortie suivante :

				
					
[secondary_label Output]

Success! The configuration is valid.

				
			

Exécutez la commande plan pour savoir ce que Terraform tentera lorsqu'il s'agira de provisionner l'infrastructure :

				
					
terraform plan -var-file="definitions.tfvars"

				
			

Le résultat sera similaire à :

				
					
[secondary_label Output]

Refreshing Terraform state in-memory prior to plan...

The refreshed state will be used to calculate this plan, but will not be

persisted to local or remote state storage.





------------------------------------------------------------------------



An execution plan has been generated and is shown below.

Resource actions are indicated with the following symbols:

+ create



Terraform will perform the following actions:



# the cloud provider_droplet.vault[0] will be created

+ resource "the cloud provider_droplet" "vault" {

  ...

  }



Plan: 1 to add, 0 to change, 0 to destroy.



------------------------------------------------------------------------



Note: You didn't specify an "-out" parameter to save this plan, so Terraform

can't guarantee that exactly these actions will be performed if

"terraform apply" is subsequently run.

				
			

Exécutez le plan :

				
					
terraform apply -var-file="definitions.tfvars"

				
			

Le droplet se terminera et vous verrez une sortie similaire à ceci :

				
					
[secondary_label Output]

An execution plan has been generated and is shown below.

Resource actions are indicated with the following symbols:

+ create



Terraform will perform the following actions:



+ the cloud provider_droplet.vault-droplet



...



Plan: 1 to add, 0 to change, 0 to destroy.



...



the cloud provider_droplet.vault-droplet: Creating...



...



Apply complete! Resources: 1 added, 0 changed, 0 destroyed.



Outputs:



instance_ip_addr = {

"181254240" = "&lt;^&gt;your_new_server_ip&lt;^&gt;"

}

				
			

Étape 5 - Vérification de votre droplet déployé

Exécutez ce qui suit pour vous connecter à votre nouveau droplet :

				
					
ssh root@&lt;^&gt;your_server_ip&lt;^&gt;

				
			

Une fois que vous êtes connecté, exécutez Vault avec :

				
					
vault

				
			

Vous verrez sa sortie "help" :

				
					
[secondary_label Output]

Usage: vault &lt;command&gt; [args]



Common commands:

  read        Read data and retrieves secrets

  write       Write data, configuration, and secrets

  delete      Delete secrets and configuration

  list        List data or secrets

  login       Authenticate locally

  agent       Start a Vault agent

  server      Start a Vault server

  status      Print seal and HA status

  unwrap      Unwrap a wrapped secret



Other commands:

  audit          Interact with audit devices

  auth           Interact with auth methods

  debug          Runs the debug command

  kv             Interact with Vault's Key-Value storage

  lease          Interact with leases

  namespace      Interact with namespaces

  operator       Perform operator-specific tasks

  path-help      Retrieve API help for paths

  plugin         Interact with Vault plugins and catalog

  policy         Interact with policies

  print          Prints runtime configurations

  secrets        Interact with secrets engines

  ssh            Initiate an SSH session

  token          Interact with tokens

				
			

Conclusion

Vous disposez maintenant d'un système automatisé pour déployer Vault de Hashicorp sur les droplets the cloud provider en utilisant Terraform et Packer. Pour commencer à utiliser Vault, vous devez l'initialiser et le configurer davantage. Pour savoir comment procéder, consultez les documents officiels.

Pour accéder à d'autres tutoriels sur l'utilisation de Terraform, consultez notre page de contenu Terraform.