packerpy
Pythonic abstractions for HashiCorp Packer. Build, configure, and execute Packer templates entirely from Python code — no hand-written JSON or HCL required.
Requirements
- Python >= 3.10
- Packer CLI
Installation
pip install PackerBuilder
Quick Start
import os
from packerpy import PackerBuilder, AmazonEbs, ShellProvisioner
class AmiBuilder(PackerBuilder):
def configure(self):
source = AmazonEbs(
name="my-ami",
ami_name="custom-image",
region="us-east-1",
access_key=os.environ["AWS_ACCESS_KEY_ID"],
secret_key=os.environ["AWS_SECRET_ACCESS_KEY"],
source_ami=os.environ["SOURCE_AMI"],
instance_type="t3.micro",
ssh_username="ec2-user",
)
self.config.add_builder_source(source)
self.config.builder.add_provisioner(
ShellProvisioner(inline=["echo 'Hello from Packer!'"])
)
AmiBuilder("my-ami").run()
Usage
Core Classes
| Class | Description |
|---|---|
PackerBuilder |
Abstract base class — subclass and implement configure() to define your build |
PackerClient |
Thin wrapper around the Packer CLI (init, validate, build, etc.) |
PackerConfig |
Top-level config that serializes to a .pkr.json template |
Builder Sources
Builder sources define what to build. Each maps to a Packer builder plugin.
| Class | Packer Type | Description |
|---|---|---|
AmazonEbs |
amazon-ebs |
Build EBS-backed Amazon AMIs |
DockerBuilder |
docker |
Build Docker images |
from packerpy import AmazonEbs
source = AmazonEbs(
name="web-server",
ami_name="web-server-{{timestamp}}",
region="us-east-1",
access_key="AKIA...",
secret_key="...",
instance_type="t3.micro",
source_ami="ami-0abcdef1234567890",
ssh_username="ec2-user",
launch_block_device_mappings=AmazonEbs.LaunchBlockDeviceMappings(
volume_type="gp3",
volume_size=20,
delete_on_termination=True,
),
)
Provisioners
Provisioners define how to configure the build instance.
| Class | Packer Type | Description |
|---|---|---|
ShellProvisioner |
shell |
Run shell commands on the build instance |
ShellLocalProvisioner |
shell-local |
Run shell commands on the machine running Packer |
FileProvisioner |
file |
Upload files to the build instance |
from packerpy import ShellProvisioner, FileProvisioner
# Run inline commands
shell = ShellProvisioner(inline=["apt-get update", "apt-get install -y nginx"])
# Upload a file then run it
upload = FileProvisioner(source="setup.sh", destination="/tmp/setup.sh")
run = ShellProvisioner(inline=["chmod +x /tmp/setup.sh", "/tmp/setup.sh"])
Post-Processors
Post-processors run after a successful build.
| Class | Packer Type | Description |
|---|---|---|
Manifest |
manifest |
Write build artifact metadata to a JSON file |
DockerImport |
docker-import |
Import a Docker container as an image |
DockerTag |
docker-tag |
Tag a Docker image |
DockerPush |
docker-push |
Push a Docker image to a registry |
Loading Existing Configs
Load a Packer config from a JSON file, HCL file, dict, or raw string:
from packerpy import PackerConfig
# From a file
config = PackerConfig.load_config("my-build", config_path="packer.pkr.json")
# From a dict
config = PackerConfig.load_config("my-build", config_content={...})
# From a raw HCL string
config = PackerConfig.load_config("my-build", config_content=hcl_str, config_type="hcl")
Requirements & Plugins
Declare required Packer versions and plugins:
from packerpy import PackerConfig, Requirements, Plugin
config = PackerConfig("my-build")
config.requirements.set_version_constraint(">=1.7.0")
config.requirements.add_plugin(
Plugin("amazon", "1.2.0", ">=", "github.com/hashicorp/amazon")
)
Restricting to Specific Sources
Provisioners and post-processors can be restricted to run only for specific sources:
provisioner = ShellProvisioner(inline=["echo 'only on this source'"])
provisioner.add_only_sources(source)
Architecture
PackerConfig
├── Requirements
│ ├── version_constraint
│ └── plugins: [Plugin, ...]
├── builder_sources: {name: BuilderSourceConfig, ...}
│ ├── AmazonEbs
│ ├── DockerBuilder
│ └── ...
└── Builder
├── sources: [str, ...]
├── provisioners: [Provisioner, ...]
│ ├── ShellProvisioner
│ ├── ShellLocalProvisioner
│ └── FileProvisioner
└── post_processors: [PostProcessor, ...]
├── Manifest
├── DockerImport
├── DockerTag
└── DockerPush
License
BSD 3-Clause License
Metadata
Release files for PackerBuilder 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| packerbuilder-3.0.0.tar.gz | 19.3 kB | Without provenance | Details for packerbuilder-3.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| packerbuilder-3.0.0-py3-none-any.whl | Python 3 | none | any | Details for packerbuilder-3.0.0-py3-none-any.whl |
Total release size: 36.7 kB
Release files / packerbuilder-3.0.0.tar.gz
| Download URL | packerbuilder-3.0.0.tar.gz |
|---|---|
| Size | 19.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
79d07da4e7149532dd49eec7fa6688c1d7f801500ee25fb5deb15d02ae93ea1a
|
|
BLAKE2b-256 checksum How to use checksums |
cf4188d807826f63a847c275db4547de3cbcaac89e73712ffaf15f0420c84aae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Release files / packerbuilder-3.0.0-py3-none-any.whl
| Download URL | packerbuilder-3.0.0-py3-none-any.whl |
|---|---|
| Size | 17.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
80b2e95115e32a6549e2440a03a801600a9113f46b4e23d78957572d1bfcd791
|
|
BLAKE2b-256 checksum How to use checksums |
d46771f771159724fdfdfba73e15e8c0aa37576c3e947053d64d457ac313fc59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Security for PackerBuilder 3.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.