packer Cheat Sheet
CLI
packer init # Install required plugins
packer plugins required # List plugins that will be installed by 'packer init'
packer plugins installed # List installed plugins
packer plugins install <plugin> [<version>]
packer plugins remove <plugin>
packer build
packer build -force # Auto-clean left resources
packer fmt # Pretty-print HCL2 config
packer hcl2_upgrade # Convert JSPN to HCL2
Templating
{{ env `HOME` }} # Insert environment variable from build env
{{ user `SOME_CONFIG` }} # Insert a user variable from the packer.json
curl http://{{ .HTTPIP }}:{{ .HTTPPort }}/some/path -o out # Use the internal webserver (VirtualBox only)
Provisioners Examples
Shell with env and script transfer
{
"type": "powershell",
"environment_vars": [
"ENV_VAR1=value1",
"ENV_VAR2=value2"
],
"scripts": [
"scripts/myscript.ps1"
]
},
Inline multiple shell commands with parameters (no script transfer)
{
"type": "bash",
"inline": [
"apt-get -y install curl",
"curl https://example.com/download.tar.gz",
"tar zxvf download.tar.gz"
]
}
Local shell (on packer host)
{
"type": "local-shell",
"inline": [
"rm somefile.txt"
]
}
Debugging with Null Builder
You can define an additional null
builder pointing to an SSH endpoint of an existing machine. Using such a builder you do not provision a new system, but use an existing one. This makes it easier to debug faulty provisioners.
{
"builders": [
{
"communicator": "ssh",
"type": "null",
"ssh_username": "<user>",
"ssh_host": "<host>",
"ssh_private_key_file": "<private key file>"
}
],
"provisioners": [
{
"type": "bash",
"inline": [ "ip -a" ]
}
]
}
Above packer.json will run ip -a
on the SSH target.
File Transfer
Copying files into build
{
"type": "file",
"source": "data/some-software.tar.gz",
"destination": "/some-software.tar.gz"
},
Extracting files from build
Useful to get logs or scan results
{
"type": "file",
"direction": "download",
"source": "/report.zip",
"destination": "results/report.zip"
},
Windows
Using WinRM
For Windows you want to use WinRM instead of SSH
"builders": [
{
"communicator": "winrm",
"winrm_use_ssl": true,
"winrm_insecure": false,
"winrm_use_ntlm": true,
"winrm_timeout": "10m",
"winrm_username": "packer",
[...]
}
]
Opening WinRM for CIS hardened images
On hardened images you might have to force enable WinRM before being able to use it. For example on Azure
az vm run-command invoke \
--command-id RunPowerShellScript \
--name "<vm>" \
-g "<resource group>" \
--scripts @<script>
with the script containing something like
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' -Name 'FilterAdministratorToken' -Value 0 -Force
& GPUpdate /Force
Note that you need to run this only after packer say Waiting for WinRM to become available
in its output. Finally: do not forget to close this again after your are done building the image.