3 votes

Comment créer une machine EC2 avec Packer ?

Dans AWS, pour créer un nouvel AMI, j'exécute généralement des commandes manuellement pour vérifier qu'elles fonctionnent, puis je crée une image de cette boîte pour créer un AMI. Mais il existe des alternatives comme packer.io Si vous avez besoin d'une AMI, quel serait un exemple minimal d'utilisation de ce service pour créer une simple AMI personnalisée ?

3voto

Ele Munjeli Points 287

https://github.com/devopracy/devopracy-base/blob/master/packer/base.json Il y a un fichier packer qui ressemble beaucoup à ce que j'utilise au travail pour une image de base. Il n'est pas testé, mais nous pouvons l'examiner un peu. L'image de base est ma propre base - tous les services sont construits en l'utilisant comme ami source. De cette façon, je contrôle mes dépendances et je m'assure qu'il y a un os cohérent sous mes services. Vous pouvez simplement ajouter des cookbooks du supermarché chef pour voir comment le provisionnement d'un service fonctionne avec ce fichier, ou l'utiliser comme base. En tant que base, vous feriez une construction similaire, moins détaillée pour le service et l'appelleriez ami source.

Cette première partie déclare les variables que j'utilise pour emballer. Les variables sont injectées avant la construction à partir d'un fichier bash que je ne vérifie pas dans SOURCE CONTROL. Je garde le bash script dans mon répertoire personnel et le source avant d'appeler packer build. Notez qu'il y a un chemin pour le livre de recettes pour le provisionneur chef. J'utilise le base_dir comme l'emplacement sur ma boîte de développement ou le serveur de construction. J'utilise une clé bootstrap pour construire ; packer créera sa propre clé pour ssh si vous n'en spécifiez pas, mais il est agréable de créer une clé sur aws et de lancer vos constructions avec. Cela facilite le débogage de Packer à la volée.

"variables": {
"aws_access_key_id": "{{env `AWS_ACCESS_KEY`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}",
"ssh_private_key_file": "{{env `SSH_PRIVATE_KEY_FILE`}}",
"cookbook_path": "{{env `CLOUD_DIR`}}/ops/devopracy-base/cookbooks",
"base_dir": "{{env `CLOUD_DIR`}}"
},

La partie suivante du fichier contient le constructeur. J'utilise amazon-ebs au travail et en dehors du travail aussi, c'est plus simple de créer un seul fichier, et souvent les plus grands types d'instance ne sont disponibles que sous forme d'ebs. Dans ce fichier, je redimensionne le volume pour avoir un peu plus de place pour installer des trucs. Notez que l'ami source n'est pas spécifié ici, je cherche la dernière version ici ou là. Ubuntu a un site très pratique si vous l'utilisez, il suffit de googler ec2 ubuntu locator. Vous devez mettre une image source pour construire dessus.

"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key_id`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "us-west-2",
"source_ami": "",
"instance_type": "t2.small",
"ssh_username": "fedora",
"ami_name": "fedora-base-{{isotime \"2006-01-02\"}}",
"ami_description": "fedora 21 devopracy base",
"security_group_ids": [ "" ],
"force_deregister": "true",
"ssh_keypair_name": "bootstrap",
"ssh_private_key_file": "{{user `ssh_private_key_file`}}",
"subnet_id": "",
"ami_users": [""],
"ami_block_device_mappings": [{
  "delete_on_termination": "true",
  "device_name": "/dev/sda1",
  "volume_size": 30
}],
"launch_block_device_mappings": [{
  "delete_on_termination": "true",
  "device_name": "/dev/sda1",
  "volume_size": 30
}], 
"tags": {
  "stage": "dev",
  "os": "fedora 21",
  "release": "latest",
  "role": "base",
  "version": "0.0.1",
  "lock": "none"
}
}],

Il est très utile de marquer vos images lorsque vous commencez à faire des automatisations sur le nuage. Ces étiquettes vous permettront de gérer vos déploiements et autres. fedora est l'utilisateur par défaut de fedora, ubuntu pour ubuntu, ec2-user pour amazon linux, etc. Vous pouvez les consulter dans la documentation de votre distribution.

De même, vous devez ajouter un groupe de sécurité à ce fichier, et un sous-réseau pour le lancement. Packer utilisera les valeurs par défaut d'aws si vous ne les spécifiez pas, mais si vous construisez sur un serveur de construction ou un vpc non par défaut, vous devez les spécifier. Force deregister se débarrassera d'un ami avec le même nom lors d'une construction réussie - je nomme par date, ainsi je peux itérer sur les constructions quotidiennes et ne pas empiler un tas d'images.

Enfin, j'utilise le chef provisioner. J'ai le livre de recettes dans un autre dépôt, et le chemin vers celui-ci sur le serveur de construction est une variable en haut. Ici, nous regardons chef-zero pour le provisionnement, qui n'est techniquement pas supporté mais qui fonctionne bien avec le provisionneur client chef et une commande personnalisée. En plus de l'exécution de chef, je fais quelques scripts de mon propre chef, et je le suis en exécutant des tests serverspec pour m'assurer que tout va bien.

  "provisioners": [

{
    "type": "shell",
    "inline": [

    ]
   },
   {
    "type": "shell",
    "script": "{{user `base_dir`}}/ops/devopracy-base/files/ext_disk.sh"
   },
   {
    "type": "shell",
    "inline": [
      "sudo reboot",
      "sleep 30",
      "sudo resize2fs /dev/xvda1"
   ]
   },
   {
    "type": "shell",
    "inline": [
      "sudo mkdir -p /etc/chef && sudo chmod 777 /etc/chef",
      "sudo mkdir -p /tmp/packer-chef-client && sudo chmod 777 /tmp/packer-chef-client"
    ]
   },
   {
    "type": "file",
    "source": "{{user `cookbook_path`}}",
    "destination": "/etc/chef/cookbooks"
   },
   {
    "type": "chef-client",
    "execute_command": "cd /etc/chef && sudo chef-client --local-mode -c /tmp/packer-chef-client/client.rb -j /tmp/packer-chef-client/first-boot.json",
    "server_url": "http://localhost:8889",
    "skip_clean_node": "true",
    "skip_clean_client": "true",
    "run_list": ["recipe[devopracy-base::default]"]
   },
   {
    "type": "file",
    "source": "{{user `base_dir`}}/ops/devopracy-base/test/spec",
    "destination": "/home/fedora/spec/"
   },
   {
    "type": "file",
    "source": "{{user `base_dir`}}/ops/devopracy-base/test/Rakefile",
    "destination": "/home/fedora/Rakefile"
   },
   {
    "type": "shell",
    "inline": ["/opt/chef/embedded/bin/rake spec"]
   },
   {
    "type": "shell",
    "inline": ["sudo chmod 600 /etc/chef"]
   }
  ]
}

Naturellement, il y a quelques affaires loufoques ici autour du chmodage du répertoire chef, et ce n'est pas évidemment sécurisé - je fais tourner mes constructions dans un sous-réseau privé. J'espère que cela vous aidera à vous lancer dans l'utilisation de Packer, qui est en fait un logiciel étonnant et très amusant ! Si vous avez des questions, posez-les moi dans les commentaires ou sur github. Tout le matériel de dévopratie est un WIP, mais ces fichiers seront probablement mûrs quand j'aurai plus de temps pour travailler dessus :P

Bonne chance !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X