Packer: Utiliser HCL

Créé le 16 déc. 2014  ·  48Commentaires  ·  Source: hashicorp/packer

Ce serait génial d'avoir YAML (ou le HCL ) pour moins de bêtises et permettre également les commentaires. (Voir https://github.com/mitchellh/packer/issues/283)

Si JSON doit être le format de configuration, alors il serait bien d'autoriser des clés/valeurs de type commentaire (peut-être là où les noms sont préfixés par un glyphe de type commentaire). Par exemple:

{
  "builders": [
...
  ],
  "provisioners": [
      {
      "#TODO": "turn this into a puppet manifest",
      "type": "shell",
      "script": "setup.sh"
    },
    {
      "type": "shell",
      "execute_command": "sudo -E /bin/bash '{{ .Path }}'",
      "#": "Run as sudo and remove all the things we don't need",
      "inline": ["DEBIAN_FRONTEND=noninteractive apt-get -y clean autoremove"]
    }
  ]
}
core enhancement post-1.0

Commentaire le plus utile

Bonjour à tous ! J'ai une bonne nouvelle 😃

J'ai récemment pris un certain temps pour réaliser le mouvement HCL2 et vous pouvez trouver un PR l'implémentant ici : #8423. Certains binaires peuvent être trouvés ici .
Nous faisons de notre mieux pour tester beaucoup de cas différents pour éviter les bugs mais il y a beaucoup de constructeurs/fournisseurs/post-processeurs et nous sommes une petite équipe donc toute aide sera la bienvenue pour tester cela ! Si vous essayez ceci et trouvez un bogue ; veuillez ouvrir un nouveau problème indiquant qu'il s'agit d'un bogue HCL.

La (ancienne) méthode actuelle de configuration de Packer continuera de fonctionner et nous prévoyons actuellement de prendre pleinement en charge les deux versions pendant un certain temps jusqu'à ce que nous nous sentions suffisamment en confiance pour abandonner l'ancienne.

Exemple de fichier hcl

build {
    sources = [
        "source.amazon-ebs.first",
    ]

    provisioner "shell" {
        inline = [
            "sleep 5"
        ]
    }

    post-processor "shell-local" {
        inline = [
            "sleep 5"
        ]
    }
}

source "amazon-ebs" "first" {
    // access_key = "{{user `aws_access_key`}}"
    // secret_key = "{{user `aws_secret_key`}}"

    ami_name = "hcl2-test"
    region = "us-east-1"
    instance_type = "t2.micro"

    kms_key_id = "c729958f-c6ba-44cd-ab39-35ab68ce0a6c"
    encrypt_boot = true
    source_ami_filter {
        filters {
          virtualization-type = "hvm"
          name =  "amzn-ami-hvm-????.??.?.????????-x86_64-gp2"
          root-device-type = "ebs"
        }
        most_recent = true
        owners = ["amazon"]
    }
    launch_block_device_mappings {
        device_name = "/dev/xvda"
        volume_size = 20
        volume_type = "gp2"
        delete_on_termination = "true"
    }
    launch_block_device_mappings {
        device_name = "/dev/xvdf"
        volume_size = 500
        volume_type = "gp2"
        delete_on_termination = true
        encrypted = true
    }

    ami_regions = ["eu-central-1"]
    run_tags {
        Name = "packer-solr-something"
        stack-name = "DevOps Tools"
    }

    communicator = "ssh"
    ssh_pty = true
    ssh_username = "ec2-user"
    associate_public_ip_address = true
}

PS : les docs et la gestion des variables arrivent !

Tous les 48 commentaires

cc @pandacalculus

HCL arrive bientôt :sourire:

@delitescere Ce numéro n'est-il pas un doublon du #283 ? J'ai remarqué que vous y étiez lié dans le message initial, mais la distinction entre les deux problèmes n'est pas claire.

Ici, les clés inconnues seraient traitées différemment de ce qu'elles sont actuellement. Celui-ci propose des touches de type "commentaire" qui sont ignorées. Le commentaire est indiqué par un préfixe de commentaire généralement connu à fermeture automatique (à savoir : # , // , ; )

C'était une suggestion alternative étant donné le changement de code plus important pour prendre en charge les commentaires en JSON non standard, ou JSON5 ou YAML ou HCL.

Le commentaire de @sethvargo à propos de la prise en charge de HCL résout le problème.

@sethvargo

HCL arrive bientôt :sourire:

Désolé de vous déranger, des mises à jour à ce sujet ?

Ça arrive encore :sourire:

Nous avons décidé de retarder un peu cela, car nous n'avons pas encore de rédacteur HCL et nous aimerions conserver packer fix en option pour les deux prochaines versions.

J'ai bu le HCL kool-aid. :+1:

Maintenant que https://github.com/hashicorp/hcl existe, pouvons-nous obtenir une alternative à json ? :)

@jevonearth qui existe depuis pas mal de temps : smile:. HCL arrive encore !

Étant donné qu'il est toujours à venir, est-ce le bon moment pour proposer des fichiers d'inclusion de demande ? voir https://github.com/mkheironimus/packergen

@jevonearth voici une alternative jusqu'à ajouter hcl

encore bientôt?

@mitchellh @sethvargo est-ce l'écrivain HCL que vous avez mentionné : https://github.com/hashicorp/hcl/tree/master/hcl/printer

En attente de YAML. Pas vraiment dans HCL

C'est un peu trivial d'envelopper le packer avec une fonction bash et de convertir yaml en json .

Pour commencer :

ruby -r json -r yaml -e "yaml = YAML.load(File.read(\"$1\")); print yaml.to_json"

(et l'inverse)

ruby -r json -r yaml -e "json = JSON.parse(File.read(\"$1\")); print YAML::dump(json)"

J'ai déjà fait ça. Ce serait bien de ne pas avoir à le faire. C'est pourquoi ce ticket existe pour HCL

Le 16 janvier 2017, à 12h31, Rickard von Essen [email protected] a écrit :

C'est assez trivial d'envelopper le packer avec une fonction bash et de convertir yaml en json.

Pour commencer :

ruby -r json -r yaml -e "yaml = YAML.load(File.read(\"$1\")); print yaml.to_json"
(et l'inverse)

ruby -r json -r yaml -e "json = JSON.parse(File.read(\"$1\")); print YAML::dump(json)"
??
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub ou coupez le fil de discussion.

HCL

HashiCorp doit faire preuve d'un peu de foi en elle-même et utiliser HCL partout où elle le peut. Soit HCL était une bonne idée et ils devraient l'utiliser, soit HCL était une erreur et Terraform est un désastre. Il est clair que ce dernier n'est pas vrai. Donc, en tant que nouvel évaluateur/adoptant, je dois dire qu'il est préoccupant que ces 2 produits se sentent comme "deux agences de renseignement qui ne se parlent pas".

Je suis avec @sethvargo. Enfilons notre sceau de loup géant et proclamons que "HCL arrive". (Non seulement cela, faites-le aussi arriver.)

JSON

Il n'est pas nécessaire d'apporter des modifications aux commentaires en chausse-pied dans JSON. La solution nous a été donnée par Douglas Crockford et illustrée par Nicholas Chammas dans The Notorious Two Eight Three https://github.com/mitchellh/packer/issues/283#issuecomment -60039068

YAML

Les mineurs de Ruby adorent le YAML et nous ont donné une solution pour l'utiliser dès sa création. Ceci a été merveilleusement illustré par Rickard von Essen il y a 2 commentaires https://github.com/mitchellh/packer/issues/1768#issuecomment -272921740 (bien que je préfère utiliser ARGF.read comme je le fais ci-dessous)

Etc

J'aime que HashiCorp facilite l'utilisation d'autant ou aussi peu de leurs produits que vous en avez besoin. Cela correspond bien à la philosophie unix (comme résumé par Peter H. Salus dans A Quarter-Century of Unix (1994)):

  • Écrivez des programmes qui font une chose et le font bien.
  • Écrire des programmes pour travailler ensemble.
  • Ecrivez des programmes pour gérer les flux de texte, car il s'agit d'une interface universelle.

Nous devrions être d'accord avec :

JSON

$ cat > example.json <<'EOF'
// from: https://www.packer.io/intro/getting-started/vagrant.html
{
    // can't we take this out?
    "variables": {
        "aws_access_key": "", // why is this blank?
        "aws_secret_key": ""  // ditto
    },
    "builders": [{
        "type": "amazon-ebs",
        "access_key": "{{user `aws_access_key`}}",
        "secret_key": "{{user `aws_secret_key`}}",
        "region": "us-west-2",
        "source_ami": "ami-b7a114d7",
        "instance_type": "t2.micro",
        "ssh_username": "ubuntu",
        "ami_name": "packer-example {{timestamp}}",
        "tags": {
            "created_by": "Packer.io/example"
        }
    }],
    "provisioners": [{
        "type": "shell",
        "inline": [
            "sleep 30",
            "sudo apt-get update",
            "sudo apt-get install -y redis-server"
        ]
    }],
    "post-processors": ["vagrant"]
}
EOF

$ packer validate <(jsmin < example.json)
Template validated successfully.

YAML

$ cat > example.yaml <<'EOF'
---
# from: https://www.packer.io/intro/getting-started/vagrant.html

# can't we take this out?
variables:
  aws_access_key: '' # why is this blank?
  aws_secret_key: '' # ditto

builders:
- type: amazon-ebs
  access_key: '{{user `aws_access_key`}}'
  secret_key: '{{user `aws_secret_key`}}'
  region: us-west-2
  source_ami: ami-b7a114d7
  instance_type: t2.micro
  ssh_username: ubuntu
  ami_name: packer-example {{timestamp}}
  tags:
    created_by: Packer.io/example

provisioners:
- type: shell
  inline:
  - sleep 30
  - sudo apt-get update
  - sudo apt-get install -y redis-server

post-processors:
- vagrant
EOF

$ packer validate <(ruby -r json -r yaml -e "print YAML.load(ARGF.read).to_json" < example.yaml)
Template validated successfully.

bitmoji

je crée un petit pr pour les modèles yaml, pour mes tests limités, cela fonctionne bien pour moi.

Certainement quelque chose que nous prévoyons d'enquêter. Pour l'instant, cependant, puisque ce n'est pas quelque chose que nous visons pour 1.0, je vais fermer ceci. Veuillez consulter la liste de diffusion pour plus de détails sur la version 1.0.

Il est temps de rouvrir le problème. HCL devrait certainement être la langue de configuration par défaut dans Packer.

PS : Je ne sais toujours pas pourquoi presque tous les problèmes ont été fermés, il existe des projets, des jalons et des balises pour gérer les problèmes.

C'est quelque chose que nous prévoyons de faire. Comme il s'agit d'une refonte massive, nous voulons nous assurer que nous le faisons bien. La prochaine étape pour nous est de passer par notre processus RFC, qui serait sur une question distincte.

Je souhaite la bienvenue à JSON5, YAML et HCL. Le JSON pur est douloureux.

@darkn3rd Nous ressentons votre douleur et il est suffisamment douloureux que nous, Joyent, maintenions une branche JSON5 qui suit master car la situation actuelle est intenable pour quiconque utilise et gère réellement une quantité réelle de modèles de packer : https : //github.com/joyent/packer/tree/f-json5

/me fait une note mentale pour mettre à jour la branche cette semaine

Nous sommes près de 3 ans de "coming soon"... Je suis un débutant avec packer et je suis pour le moins étonné qu'il ne supporte pas HCL. J'ai hâte de le tester.

Je viens de dire à mon ami "hé, migrez cet horrible json vers HCL, c'est un outil hashicorp, non?". Comme j'avais tort...

Si cela vous intéresse, yacker (un utilitaire Python) encapsule Packer dans un interpréteur YAML vers JSON. Cela n'a rien de bouleversant - il vous fournit simplement un wrapper YAML qui convertit temporairement les fichiers de modèles et de variables en JSON avant de passer le contrôle à Packer.

https://yacker.readthedocs.io/en/latest/

Équipe d'emballeur ? Pourquoi ne fournissez-vous toujours pas HCL ? Je crée un petit correctif pour le support YAML il y a presque plus d'un an, cela fonctionne bien et vous le rejetez avec raison, que HCL arrive. Mais après un an, rien n'a changé !
Ce que tu dis?

Toujours à venir :wink:

@vtolstov voir #7023

Les responsables produits internes de HashiCorp ont décidé que nous allions sauter directement sur HCL1 et implémenter HCL2 à la place ; désolé, cela n'a jamais été mis en œuvre, mais je vous promets que nous travaillons activement sur le support HCL2 en ce moment.

Merci pour la mise à jour. Nous n'avons pas renoncé à cela.

Merci @SwampDragons ! Étant donné que cela fait l'objet d'un travail actif, ce problème doit-il être rouvert ?

Bon point; il a été fermé accidentellement lorsque nous avons fermé le PR associé sans fusion.

Vraiment excité pour le support HCL2 avec Packer !

@SwampDragons Des nouvelles sur HCL s'il vous plaît ?

Nous espérons (mais ne promettons pas) le sortir avec la version 1.5.0. L'équipe a un prototype fonctionnel dans une succursale mais il n'est pas encore poli ou durci et avec @azr sur le point d'être en congé parental, nous pourrions devoir le glisser un peu plus tard. L'objectif est d'ici la fin de l'année, de préférence plus près de septembre que de décembre.

Je suis revenu après quelques années et j'ai été surpris que ce soit toujours ouvert.
Content qu'il soit en route pour la 1.5.

@SwampDragons Avez-vous des délais approximatifs pour la disponibilité de la version 1.5.0 (même en version bêta) ?

Si le changement est compliqué (et il peut y avoir de très bonnes raisons à cela), alors n'est-ce pas un risque et un coût de développement beaucoup plus faibles de laisser un outil parfaitement bon seul et à la place, plutôt que de changer le format de définition de base, fournissez des _adaptateurs_ qui convertissent format-X en JSON ?

Juste une pensée.

Je ne veux pas banaliser le problème et vous pouvez avoir des raisons très importantes de changer le format de base mais, compte tenu du temps et des efforts consacrés à cela, s'il s'agit uniquement de la façon dont les utilisateurs définissent leurs fichiers, alors, en tant que projet, c'est y a-t-il un besoin de _language adapters_ comme yacker ?

@alanbchristie Pour être juste, cela n'a pas été activement travaillé pendant tout ce temps; c'est un problème "nous devrions réfléchir à ce sujet" depuis très longtemps, plus récemment parce que nous voulions regarder et voir comment le déploiement de HCL2 s'est déroulé avec Terraform 0.12 afin que nous puissions apprendre de leur processus avant d'essayer de le refaire nous-mêmes . Je ne pense pas que ce sera un processus aussi ardu que pour Terraform, mais je ne peux pas parler des détails car, comme je l'ai dit, c'est un projet sur lequel @azr travaillait et il est en train de ressentir le bonheur parental en ce moment. ;) Quand il reviendra, je lui demanderai s'il peut écrire une petite mise à jour pour vous tous.

@NickLarsenNZ La feuille de route que je montre à mon patron

Je suis nouveau chez Packer... mais je vais être honnête, le fait que ce problème reste sans réponse depuis 5 à 6 ans est non seulement assez décourageant, mais extrêmement frustrant.

L'utilisation de jq pour supprimer les commentaires lors d'une solution de contournement signifie qu'il y a probablement 99 commentaires qui n'ont pas été écrits pour chaque commentaire écrit avec jq à supprimer.

Je pourrais continuer pendant des jours comment json, tel qu'implémenté par packer, n'est pas adapté à cette tâche, mais le fait qu'il n'autorise pas les commentaires et encourage la duplication de code/config (pourquoi ai-je l'impression de devoir écrire un packer json pseudo-compilateur pour permettre la réutilisation de la configuration).

Verrouillé pour réduire le bruit; @azr est de retour et je lui demanderai de faire le point sur ce problème, notamment en fournissant des versions bêta, lorsqu'il en aura l'occasion.

Bonjour à tous ! J'ai une bonne nouvelle 😃

J'ai récemment pris un certain temps pour réaliser le mouvement HCL2 et vous pouvez trouver un PR l'implémentant ici : #8423. Certains binaires peuvent être trouvés ici .
Nous faisons de notre mieux pour tester beaucoup de cas différents pour éviter les bugs mais il y a beaucoup de constructeurs/fournisseurs/post-processeurs et nous sommes une petite équipe donc toute aide sera la bienvenue pour tester cela ! Si vous essayez ceci et trouvez un bogue ; veuillez ouvrir un nouveau problème indiquant qu'il s'agit d'un bogue HCL.

La (ancienne) méthode actuelle de configuration de Packer continuera de fonctionner et nous prévoyons actuellement de prendre pleinement en charge les deux versions pendant un certain temps jusqu'à ce que nous nous sentions suffisamment en confiance pour abandonner l'ancienne.

Exemple de fichier hcl

build {
    sources = [
        "source.amazon-ebs.first",
    ]

    provisioner "shell" {
        inline = [
            "sleep 5"
        ]
    }

    post-processor "shell-local" {
        inline = [
            "sleep 5"
        ]
    }
}

source "amazon-ebs" "first" {
    // access_key = "{{user `aws_access_key`}}"
    // secret_key = "{{user `aws_secret_key`}}"

    ami_name = "hcl2-test"
    region = "us-east-1"
    instance_type = "t2.micro"

    kms_key_id = "c729958f-c6ba-44cd-ab39-35ab68ce0a6c"
    encrypt_boot = true
    source_ami_filter {
        filters {
          virtualization-type = "hvm"
          name =  "amzn-ami-hvm-????.??.?.????????-x86_64-gp2"
          root-device-type = "ebs"
        }
        most_recent = true
        owners = ["amazon"]
    }
    launch_block_device_mappings {
        device_name = "/dev/xvda"
        volume_size = 20
        volume_type = "gp2"
        delete_on_termination = "true"
    }
    launch_block_device_mappings {
        device_name = "/dev/xvdf"
        volume_size = 500
        volume_type = "gp2"
        delete_on_termination = true
        encrypted = true
    }

    ami_regions = ["eu-central-1"]
    run_tags {
        Name = "packer-solr-something"
        stack-name = "DevOps Tools"
    }

    communicator = "ssh"
    ssh_pty = true
    ssh_username = "ec2-user"
    associate_public_ip_address = true
}

PS : les docs et la gestion des variables arrivent !

C'est une excellente nouvelle @azr , merci à vous et à l'équipe.

WRT : dépréciation de JSON.
Est-il juste que vous envisagiez de tirer parti de la prise en charge JSON intégrée de HCL / HCL2 ?

Existe-t-il un convertisseur json2hcl ? J'ai des scripts packer bien faits à partir de Netflix OSS que j'aimerais convertir en HCL.

Salut tout le monde, je suis enthousiasmé par ce changement !

@ darkn3rd Je prévois de faire un convertisseur spécifique à l'emballeur afin que les utilisateurs puissent l'essayer rapidement sans trop de travail de copier-coller et d'édition.

@mexisme La bibliothèque HCL comprend parfaitement JSON mais le format a un peu changé, il va donc falloir quelques modifications. Je vais essayer de faire en sorte que le convertisseur convertisse également un fichier en JSON (ou quelque chose du genre).


⚠️ mon premier exemple a changé et ressemble un peu plus à la terraforme.

Exemple de fichier hcl

build {
    sources = [
        "source.amazon-ebs.first",
    ]

    provisioner "shell" {
        inline = [
            "sleep 5"
        ]
    }

    post-processor "shell-local" {
        inline = [
            "sleep 5"
        ]
    }
}

source "amazon-ebs" "first" {
    // access_key = "{{user `aws_access_key`}}"
    // secret_key = "{{user `aws_secret_key`}}"

    ami_name = "hcl2-test"
    region = "us-east-1"
    instance_type = "t2.micro"

    kms_key_id = "c729958f-c6ba-44cd-ab39-35ab68ce0a6c"
    encrypt_boot = true
    source_ami_filter {
        filters {
          virtualization-type = "hvm"
          name =  "amzn-ami-hvm-????.??.?.????????-x86_64-gp2"
          root-device-type = "ebs"
        }
        most_recent = true
        owners = ["amazon"]
    }
    launch_block_device_mappings {
        device_name = "/dev/xvda"
        volume_size = 20
        volume_type = "gp2"
        delete_on_termination = "true"
    }
    launch_block_device_mappings {
        device_name = "/dev/xvdf"
        volume_size = 500
        volume_type = "gp2"
        delete_on_termination = true
        encrypted = true
    }

    ami_regions = ["eu-central-1"]
    run_tags {
        Name = "packer-solr-something"
        stack-name = "DevOps Tools"
    }

    communicator = "ssh"
    ssh_pty = true
    ssh_username = "ec2-user"
    associate_public_ip_address = true
}

De nouveaux binaires peuvent être trouvés ici

Je vais verrouiller ce problème car il est fermé depuis _30 jours_ ⏳. Cela aide nos responsables à trouver et à se concentrer sur les problèmes actifs.

Si vous avez trouvé un problème qui semble similaire à celui-ci, veuillez ouvrir un nouveau problème et remplir le modèle de problème afin que nous puissions capturer tous les détails nécessaires pour approfondir l'enquête.

Cette page vous a été utile?
0 / 5 - 0 notes