»Only and Except

only and except are keywords used to filter what runs in your Packer build, they can be seen as a command line argument:

  • -except=foo,bar,baz - Run all the builds and post-processors except those with the given comma-separated names. Build and post-processor names by default are their type, unless a specific name attribute is specified within the configuration. Any post-processor following a skipped post-processor will not run. Because post-processors can be nested in arrays a different post-processor chain can still run. A post-processor with an empty name will be ignored.
  • -only=foo,bar,baz - Only run the builds with the given comma-separated names. Build names by default are their type, unless a specific name attribute is specified within the configuration. -only does not apply to post-processors.

They can also be seen in a template to run or skip provisioners and/or post-processors for a specific source:

build {
  name = "my_build"
  sources [
    "source.amazon-ebs.first-example",
  ]
  source "source.amazon-ebs.second-example" {
    // setting the name field allows to rename the source only for this build
    // section.
    name = "second-example-local-name"
  }

  provisioner "shell-local" {
    only = ["source.amazon-ebs.first-example"]
    inline = ["echo I will only run for the second example source"]
  }

  provisioner "shell-local" {
    except = ["source.amazon-ebs.second-example-local-name"]
    inline = ["echo I will never run for the second example source"]
  }
}

build {
  sources [
    "source.amazon-ebs.third-example",
  ]
}

# this file will result in Packer creating three builds named:
#  my_build.amazon-ebs.first-example
#  my_build.amazon-ebs.second-example
#  amazon-ebs.third-example

Note that cli arguments can be used with a glob operator, using the previous configuration: