Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

OS::Heat::SoftwareDeployment and Image Requirements aka Disk image builder

I'm attempting to launch a simple example template found in the Openstack/heat-templates repo, "example-script-template.yaml" Example Script Template

What I find is that the tools required to run this are not found inside the default cloud-image for CentOS-7.

I note that the instructions for prepairing a image with both the git repo's "test image" (Found Here) and the Software Deployment "Custom Image Script" (Found Here) both depend on using disk-image-builder.

The Script for diskimage-builder looks like the following, with CentOS7 and puppet:

# Clone the required repositories. Some of these are also available
# via pypi or as distro packages.
git clone https://git.openstack.org/openstack/diskimage-builder.git
git clone https://git.openstack.org/openstack/tripleo-image-elements.git
git clone https://git.openstack.org/openstack/heat-templates.git

# Required by diskimage-builder to discover element collections
export ELEMENTS_PATH=tripleo-image-elements/elements:heat-templates/hot/software-config/elements

# The base operating system element(s) provided by the diskimage-builder
# elements collection. Other values which may work include:
# centos7, debian, opensuse, rhel, rhel7, or ubuntu
export BASE_ELEMENTS="centos7 selinux-permissive"

# Install and configure the os-collect-config agent to poll the metadata
# server (heat service or zaqar message queue and so on) for configuration
# changes to execute
export AGENT_ELEMENTS="os-collect-config os-refresh-config os-apply-config"


# heat-config installs an os-refresh-config script which will invoke the
# appropriate hook to perform configuration. The element heat-config-script
# installs a hook to perform configuration with shell scripts
export DEPLOYMENT_BASE_ELEMENTS="heat-config heat-config-script"

# Install a hook for any other chosen configuration tool(s).
# Elements which install hooks include:
# heat-config-cfn-init, heat-config-puppet, or heat-config-salt
export DEPLOYMENT_TOOL="heat-config-puppet"

# The name of the qcow2 image to create, and the name of the image
# uploaded to the OpenStack image registry.
export IMAGE_NAME=centos-7-software-config

# Create the image
diskimage-builder/bin/disk-image-create vm $BASE_ELEMENTS $AGENT_ELEMENTS \
     $DEPLOYMENT_BASE_ELEMENTS $DEPLOYMENT_TOOL -o $IMAGE_NAME.qcow2

# Upload the image, assuming valid credentials are already sourced
glance image-create --disk-format qcow2 --container-format bare \
    --name $IMAGE_NAME < $IMAGE_NAME.qcow2

The example from docs.openstack.org uses virtualenv (which seems entirely unnecessary?) Is there a way to disable that?

So when launching a stack based off the above image created there's a few things that go wrong, the first and foremost is that the application jq is required by os-collect-config to report back to heat (I think?) and looks like the following in the logs:

dib-run-parts Wed Jan 18 19:56:03 UTC 2017 55-heat-config completed
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 ----------------------- PROFILING -----------------------
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Target: configure.d
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Script                                     Seconds
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 ---------------------------------------  ----------
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 20-os-apply-config                            0.186
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 55-heat-config                                0.084
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 --------------------- END PROFILING ---------------------
[2017-01-18 19:56:03,667] (os-refresh-config) [INFO] Completed phase configure
[2017-01-18 19:56:03,667] (os-refresh-config) [INFO] Starting phase post-configure
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Running /usr/libexec/os-refresh-config/post-configure.d/99-refresh-completed
++ os-apply-config --key completion-handle --type raw --key-default ''
+ HANDLE=
++ os-apply-config --key completion-signal --type raw --key-default ''
+ SIGNAL=
++ os-apply-config --key instance-id --type raw --key-default ''
+ ID=i-000000b7
+ '[' -n i-000000b7 ']'
+ '[' -n '' ']'
+ '[' -n '' ']'
++ os-apply-config --key deployments --type raw --key-default ''
++ jq -r 'map(select(.group == "os-apply-config") |
select(.inputs[].name == "deploy_signal_id") |
.id + (.inputs | map(select(.name == "deploy_signal_id")) | .[].value)) |
.[]'
/usr/libexec/os-refresh-config/post-configure.d/99-refresh-completed: line 66: jq: command not found

The second is that puppet is required much earlier on in the process:

dib-run-parts Wed Jan 18 19:37:08 UTC 2017 Running /usr/libexec/os-refresh-config/configure.d/20-os-apply-config
[2017/01/18 07:37:08 PM] [INFO] writing /var/run/heat-config/heat-config
[2017/01/18 07:37:08 PM] [INFO] writing /etc/os-collect-config.conf
[2017/01/18 07:37:08 PM] [INFO] success
dib-run-parts Wed Jan 18 19:37:08 UTC 2017 20-os-apply-config completed
dib-run-parts Wed Jan 18 19:37:08 UTC 2017 Running /usr/libexec/os-refresh-config/configure.d/55-heat-config
[2017-01-18 19:37:08,789] (heat-config) [WARNING] Skipping config fee46ec2-d0cc-4083-a22a-46feb88374ea, already deployed
[2017-01-18 19:37:08,789] (heat-config) [WARNING] To force-deploy, rm /var/lib/heat-config/deployed/fee46ec2-d0cc-4083-a22a-46feb88374ea.json
[2017-01-18 19:37:08,790] (heat-config) [DEBUG] Running /var/lib/heat-config/hooks/puppet < /var/lib/heat-config/deployed/f6897ead-1e2c-465c-80dc-782b321548dd.json
[2017-01-18 19:37:08,951] (heat-config) [INFO]
[2017-01-18 19:37:08,951] (heat-config) [DEBUG] [2017-01-18 19:37:08,946] (heat-config) [DEBUG] Running FACTER_deploy_stack_id="example-puppet/3f6dbae7-61eb-49f3-8ccc-66f9a1ecb246"  
[2017-01-18 19:37:08,948] (heat-config) [WARNING] puppet not installed yet
[2017-01-18 19:37:08,951] (heat-config) [INFO] Completed /var/lib/heat-config/hooks/puppet
[2017-01-18 19:37:08,951] (heat-config) [DEBUG] Running heat-config-notify /var/lib/heat-config/deployed/f6897ead-1e2c-465c-80dc-782b321548dd.json < /var/lib/heat-config/deployed/f68
[2017-01-18 19:37:12,962] (heat-config) [INFO]
[2017-01-18 19:37:12,963] (heat-config) [DEBUG] [2017-01-18 19:37:09,358] (heat-config-notify) [DEBUG] Signaling to http://10.1.6.100:8000/v1/signal/arn%3Aopenstack%3Aheat%3A%3A05ce
[2017-01-18 19:37:12,943] (heat-config-notify) [DEBUG] Response <Response [200]>
[2017-01-18 19:37:12,963] (heat-config) [DEBUG] Running /var/lib/heat-config/hooks/puppet < /var/lib/heat-config/deployed/a9b02065-32d8-4a78-b7d8-a98ae8dc5701.json
[2017-01-18 19:37:13,069] (heat-config) [INFO]
[2017-01-18 19:37:13,070] (heat-config) [DEBUG] [2017-01-18 19:37:13,064] (heat-config) [DEBUG] Running FACTER_deploy_stack_id="example-puppet/3f6dbae7-61eb-49f3-8ccc-66f9a1ecb246"  
[2017-01-18 19:37:13,067] (heat-config) [WARNING] puppet not installed yet
[2017-01-18 19:37:13,070] (heat-config) [INFO] Completed /var/lib/heat-config/hooks/puppet
[2017-01-18 19:37:13,070] (heat-config) [DEBUG] Running heat-config-notify /var/lib/heat-config/deployed/a9b02065-32d8-4a78-b7d8-a98ae8dc5701.json < /var/lib/heat-config/deployed/a9b
[2017-01-18 19:37:17,003] (heat-config) [INFO]
[2017-01-18 19:37:17,003] (heat-config) [DEBUG] [2017-01-18 19:37:13,518] (heat-config-notify) [DEBUG] Signaling to http://10.1.6.100:8000/v1/signal/arn%3Aopenstack%3Aheat%3A%3A05ce
[2017-01-18 19:37:16,982] (heat-config-notify) [DEBUG] Response <Response [200]>

I've tried to work around this by having a heat resource that installs epel-release, then jq, then puppet but this all seems to happen _after_ the failures and then os-collect-config giving up on running the puppet exec.

OS::Heat::SoftwareDeployment and Image Requirements aka Disk image builder

I'm attempting to launch a simple example template found in the Openstack/heat-templates repo, "example-script-template.yaml" Example Script Template

What I find is that the tools required to run this are not found inside the default cloud-image for CentOS-7.

I note that the instructions for prepairing a image with both the git repo's "test image" (Found Here) and the Software Deployment "Custom Image Script" (Found Here) both depend on using disk-image-builder.

The Script for diskimage-builder looks like the following, with CentOS7 and puppet:

# Clone the required repositories. Some of these are also available
# via pypi or as distro packages.
git clone https://git.openstack.org/openstack/diskimage-builder.git
git clone https://git.openstack.org/openstack/tripleo-image-elements.git
git clone https://git.openstack.org/openstack/heat-templates.git

# Required by diskimage-builder to discover element collections
export ELEMENTS_PATH=tripleo-image-elements/elements:heat-templates/hot/software-config/elements

# The base operating system element(s) provided by the diskimage-builder
# elements collection. Other values which may work include:
# centos7, debian, opensuse, rhel, rhel7, or ubuntu
export BASE_ELEMENTS="centos7 selinux-permissive"

# Install and configure the os-collect-config agent to poll the metadata
# server (heat service or zaqar message queue and so on) for configuration
# changes to execute
export AGENT_ELEMENTS="os-collect-config os-refresh-config os-apply-config"


# heat-config installs an os-refresh-config script which will invoke the
# appropriate hook to perform configuration. The element heat-config-script
# installs a hook to perform configuration with shell scripts
export DEPLOYMENT_BASE_ELEMENTS="heat-config heat-config-script"

# Install a hook for any other chosen configuration tool(s).
# Elements which install hooks include:
# heat-config-cfn-init, heat-config-puppet, or heat-config-salt
export DEPLOYMENT_TOOL="heat-config-puppet"

# The name of the qcow2 image to create, and the name of the image
# uploaded to the OpenStack image registry.
export IMAGE_NAME=centos-7-software-config

# Create the image
diskimage-builder/bin/disk-image-create vm $BASE_ELEMENTS $AGENT_ELEMENTS \
     $DEPLOYMENT_BASE_ELEMENTS $DEPLOYMENT_TOOL -o $IMAGE_NAME.qcow2

# Upload the image, assuming valid credentials are already sourced
glance image-create --disk-format qcow2 --container-format bare \
    --name $IMAGE_NAME < $IMAGE_NAME.qcow2

The example from docs.openstack.org uses virtualenv (which seems entirely unnecessary?) Is there a way to disable that?

So when launching a stack based off the above image created there's a few things that go wrong, the first and foremost is that the application jq is required by os-collect-config to report back to heat (I think?) and looks like the following in the logs:

dib-run-parts Wed Jan 18 19:56:03 UTC 2017 55-heat-config completed
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 ----------------------- PROFILING -----------------------
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Target: configure.d
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Script                                     Seconds
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 ---------------------------------------  ----------
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 20-os-apply-config                            0.186
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 55-heat-config                                0.084
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 --------------------- END PROFILING ---------------------
[2017-01-18 19:56:03,667] (os-refresh-config) [INFO] Completed phase configure
[2017-01-18 19:56:03,667] (os-refresh-config) [INFO] Starting phase post-configure
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Running /usr/libexec/os-refresh-config/post-configure.d/99-refresh-completed
++ os-apply-config --key completion-handle --type raw --key-default ''
+ HANDLE=
++ os-apply-config --key completion-signal --type raw --key-default ''
+ SIGNAL=
++ os-apply-config --key instance-id --type raw --key-default ''
+ ID=i-000000b7
+ '[' -n i-000000b7 ']'
+ '[' -n '' ']'
+ '[' -n '' ']'
++ os-apply-config --key deployments --type raw --key-default ''
++ jq -r 'map(select(.group == "os-apply-config") |
select(.inputs[].name == "deploy_signal_id") |
.id + (.inputs | map(select(.name == "deploy_signal_id")) | .[].value)) |
.[]'
/usr/libexec/os-refresh-config/post-configure.d/99-refresh-completed: line 66: jq: command not found

The second is that puppet is required much earlier on in the process:

dib-run-parts Wed Jan 18 19:37:08 UTC 2017 Running /usr/libexec/os-refresh-config/configure.d/20-os-apply-config
[2017/01/18 07:37:08 PM] [INFO] writing /var/run/heat-config/heat-config
[2017/01/18 07:37:08 PM] [INFO] writing /etc/os-collect-config.conf
[2017/01/18 07:37:08 PM] [INFO] success
dib-run-parts Wed Jan 18 19:37:08 UTC 2017 20-os-apply-config completed
dib-run-parts Wed Jan 18 19:37:08 UTC 2017 Running /usr/libexec/os-refresh-config/configure.d/55-heat-config
[2017-01-18 19:37:08,789] (heat-config) [WARNING] Skipping config fee46ec2-d0cc-4083-a22a-46feb88374ea, already deployed
[2017-01-18 19:37:08,789] (heat-config) [WARNING] To force-deploy, rm /var/lib/heat-config/deployed/fee46ec2-d0cc-4083-a22a-46feb88374ea.json
[2017-01-18 19:37:08,790] (heat-config) [DEBUG] Running /var/lib/heat-config/hooks/puppet < /var/lib/heat-config/deployed/f6897ead-1e2c-465c-80dc-782b321548dd.json
[2017-01-18 19:37:08,951] (heat-config) [INFO]
[2017-01-18 19:37:08,951] (heat-config) [DEBUG] [2017-01-18 19:37:08,946] (heat-config) [DEBUG] Running FACTER_deploy_stack_id="example-puppet/3f6dbae7-61eb-49f3-8ccc-66f9a1ecb246"  
[2017-01-18 19:37:08,948] (heat-config) [WARNING] puppet not installed yet
[2017-01-18 19:37:08,951] (heat-config) [INFO] Completed /var/lib/heat-config/hooks/puppet
[2017-01-18 19:37:08,951] (heat-config) [DEBUG] Running heat-config-notify /var/lib/heat-config/deployed/f6897ead-1e2c-465c-80dc-782b321548dd.json < /var/lib/heat-config/deployed/f68
[2017-01-18 19:37:12,962] (heat-config) [INFO]
[2017-01-18 19:37:12,963] (heat-config) [DEBUG] [2017-01-18 19:37:09,358] (heat-config-notify) [DEBUG] Signaling to http://10.1.6.100:8000/v1/signal/arn%3Aopenstack%3Aheat%3A%3A05ce
[2017-01-18 19:37:12,943] (heat-config-notify) [DEBUG] Response <Response [200]>
[2017-01-18 19:37:12,963] (heat-config) [DEBUG] Running /var/lib/heat-config/hooks/puppet < /var/lib/heat-config/deployed/a9b02065-32d8-4a78-b7d8-a98ae8dc5701.json
[2017-01-18 19:37:13,069] (heat-config) [INFO]
[2017-01-18 19:37:13,070] (heat-config) [DEBUG] [2017-01-18 19:37:13,064] (heat-config) [DEBUG] Running FACTER_deploy_stack_id="example-puppet/3f6dbae7-61eb-49f3-8ccc-66f9a1ecb246"  
[2017-01-18 19:37:13,067] (heat-config) [WARNING] puppet not installed yet
[2017-01-18 19:37:13,070] (heat-config) [INFO] Completed /var/lib/heat-config/hooks/puppet
[2017-01-18 19:37:13,070] (heat-config) [DEBUG] Running heat-config-notify /var/lib/heat-config/deployed/a9b02065-32d8-4a78-b7d8-a98ae8dc5701.json < /var/lib/heat-config/deployed/a9b
[2017-01-18 19:37:17,003] (heat-config) [INFO]
[2017-01-18 19:37:17,003] (heat-config) [DEBUG] [2017-01-18 19:37:13,518] (heat-config-notify) [DEBUG] Signaling to http://10.1.6.100:8000/v1/signal/arn%3Aopenstack%3Aheat%3A%3A05ce
[2017-01-18 19:37:16,982] (heat-config-notify) [DEBUG] Response <Response [200]>

I've tried to work around this by having a heat resource that installs epel-release, then jq, then puppet but this all seems to happen _after_ the failures and then os-collect-config giving up on running the puppet exec.

OS::Heat::SoftwareDeployment and Image Requirements aka Disk image Diskimage builder

I'm attempting to launch a simple example template found in the Openstack/heat-templates repo, "example-script-template.yaml" "example-puppet-template.yaml" Example Script Template

What I find is that the tools required to run this are not found inside the default cloud-image for CentOS-7.

I note that the instructions for prepairing a image with both the git repo's "test image" (Found Here) and the Software Deployment "Custom Image Script" (Found Here) both depend on using disk-image-builder.

The Script for diskimage-builder looks like the following, with CentOS7 and puppet:

# Clone the required repositories. Some of these are also available
# via pypi or as distro packages.
git clone https://git.openstack.org/openstack/diskimage-builder.git
git clone https://git.openstack.org/openstack/tripleo-image-elements.git
git clone https://git.openstack.org/openstack/heat-templates.git

# Required by diskimage-builder to discover element collections
export ELEMENTS_PATH=tripleo-image-elements/elements:heat-templates/hot/software-config/elements

# The base operating system element(s) provided by the diskimage-builder
# elements collection. Other values which may work include:
# centos7, debian, opensuse, rhel, rhel7, or ubuntu
export BASE_ELEMENTS="centos7 selinux-permissive"

# Install and configure the os-collect-config agent to poll the metadata
# server (heat service or zaqar message queue and so on) for configuration
# changes to execute
export AGENT_ELEMENTS="os-collect-config os-refresh-config os-apply-config"


# heat-config installs an os-refresh-config script which will invoke the
# appropriate hook to perform configuration. The element heat-config-script
# installs a hook to perform configuration with shell scripts
export DEPLOYMENT_BASE_ELEMENTS="heat-config heat-config-script"

# Install a hook for any other chosen configuration tool(s).
# Elements which install hooks include:
# heat-config-cfn-init, heat-config-puppet, or heat-config-salt
export DEPLOYMENT_TOOL="heat-config-puppet"

# The name of the qcow2 image to create, and the name of the image
# uploaded to the OpenStack image registry.
export IMAGE_NAME=centos-7-software-config

# Create the image
diskimage-builder/bin/disk-image-create vm $BASE_ELEMENTS $AGENT_ELEMENTS \
     $DEPLOYMENT_BASE_ELEMENTS $DEPLOYMENT_TOOL -o $IMAGE_NAME.qcow2

# Upload the image, assuming valid credentials are already sourced
glance image-create --disk-format qcow2 --container-format bare \
    --name $IMAGE_NAME < $IMAGE_NAME.qcow2

The example from docs.openstack.org uses virtualenv (which seems entirely unnecessary?) Is there a way to disable that?

So when launching a stack based off the above image created there's a few things that go wrong, the first and foremost is that the application jq is required by os-collect-config to report back to heat (I think?) and looks like the following in the logs:

dib-run-parts Wed Jan 18 19:56:03 UTC 2017 55-heat-config completed
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 ----------------------- PROFILING -----------------------
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Target: configure.d
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Script                                     Seconds
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 ---------------------------------------  ----------
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 20-os-apply-config                            0.186
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 55-heat-config                                0.084
dib-run-parts Wed Jan 18 19:56:03 UTC 2017
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 --------------------- END PROFILING ---------------------
[2017-01-18 19:56:03,667] (os-refresh-config) [INFO] Completed phase configure
[2017-01-18 19:56:03,667] (os-refresh-config) [INFO] Starting phase post-configure
dib-run-parts Wed Jan 18 19:56:03 UTC 2017 Running /usr/libexec/os-refresh-config/post-configure.d/99-refresh-completed
++ os-apply-config --key completion-handle --type raw --key-default ''
+ HANDLE=
++ os-apply-config --key completion-signal --type raw --key-default ''
+ SIGNAL=
++ os-apply-config --key instance-id --type raw --key-default ''
+ ID=i-000000b7
+ '[' -n i-000000b7 ']'
+ '[' -n '' ']'
+ '[' -n '' ']'
++ os-apply-config --key deployments --type raw --key-default ''
++ jq -r 'map(select(.group == "os-apply-config") |
select(.inputs[].name == "deploy_signal_id") |
.id + (.inputs | map(select(.name == "deploy_signal_id")) | .[].value)) |
.[]'
/usr/libexec/os-refresh-config/post-configure.d/99-refresh-completed: line 66: jq: command not found

The second is that puppet is required much earlier on in the process:

dib-run-parts Wed Jan 18 19:37:08 UTC 2017 Running /usr/libexec/os-refresh-config/configure.d/20-os-apply-config
[2017/01/18 07:37:08 PM] [INFO] writing /var/run/heat-config/heat-config
[2017/01/18 07:37:08 PM] [INFO] writing /etc/os-collect-config.conf
[2017/01/18 07:37:08 PM] [INFO] success
dib-run-parts Wed Jan 18 19:37:08 UTC 2017 20-os-apply-config completed
dib-run-parts Wed Jan 18 19:37:08 UTC 2017 Running /usr/libexec/os-refresh-config/configure.d/55-heat-config
[2017-01-18 19:37:08,789] (heat-config) [WARNING] Skipping config fee46ec2-d0cc-4083-a22a-46feb88374ea, already deployed
[2017-01-18 19:37:08,789] (heat-config) [WARNING] To force-deploy, rm /var/lib/heat-config/deployed/fee46ec2-d0cc-4083-a22a-46feb88374ea.json
[2017-01-18 19:37:08,790] (heat-config) [DEBUG] Running /var/lib/heat-config/hooks/puppet < /var/lib/heat-config/deployed/f6897ead-1e2c-465c-80dc-782b321548dd.json
[2017-01-18 19:37:08,951] (heat-config) [INFO]
[2017-01-18 19:37:08,951] (heat-config) [DEBUG] [2017-01-18 19:37:08,946] (heat-config) [DEBUG] Running FACTER_deploy_stack_id="example-puppet/3f6dbae7-61eb-49f3-8ccc-66f9a1ecb246"  
[2017-01-18 19:37:08,948] (heat-config) [WARNING] puppet not installed yet
[2017-01-18 19:37:08,951] (heat-config) [INFO] Completed /var/lib/heat-config/hooks/puppet
[2017-01-18 19:37:08,951] (heat-config) [DEBUG] Running heat-config-notify /var/lib/heat-config/deployed/f6897ead-1e2c-465c-80dc-782b321548dd.json < /var/lib/heat-config/deployed/f68
[2017-01-18 19:37:12,962] (heat-config) [INFO]
[2017-01-18 19:37:12,963] (heat-config) [DEBUG] [2017-01-18 19:37:09,358] (heat-config-notify) [DEBUG] Signaling to http://10.1.6.100:8000/v1/signal/arn%3Aopenstack%3Aheat%3A%3A05ce
[2017-01-18 19:37:12,943] (heat-config-notify) [DEBUG] Response <Response [200]>
[2017-01-18 19:37:12,963] (heat-config) [DEBUG] Running /var/lib/heat-config/hooks/puppet < /var/lib/heat-config/deployed/a9b02065-32d8-4a78-b7d8-a98ae8dc5701.json
[2017-01-18 19:37:13,069] (heat-config) [INFO]
[2017-01-18 19:37:13,070] (heat-config) [DEBUG] [2017-01-18 19:37:13,064] (heat-config) [DEBUG] Running FACTER_deploy_stack_id="example-puppet/3f6dbae7-61eb-49f3-8ccc-66f9a1ecb246"  
[2017-01-18 19:37:13,067] (heat-config) [WARNING] puppet not installed yet
[2017-01-18 19:37:13,070] (heat-config) [INFO] Completed /var/lib/heat-config/hooks/puppet
[2017-01-18 19:37:13,070] (heat-config) [DEBUG] Running heat-config-notify /var/lib/heat-config/deployed/a9b02065-32d8-4a78-b7d8-a98ae8dc5701.json < /var/lib/heat-config/deployed/a9b
[2017-01-18 19:37:17,003] (heat-config) [INFO]
[2017-01-18 19:37:17,003] (heat-config) [DEBUG] [2017-01-18 19:37:13,518] (heat-config-notify) [DEBUG] Signaling to http://10.1.6.100:8000/v1/signal/arn%3Aopenstack%3Aheat%3A%3A05ce
[2017-01-18 19:37:16,982] (heat-config-notify) [DEBUG] Response <Response [200]>

I've tried to work around this by having a heat resource that installs epel-release, then jq, then puppet but this all seems to happen _after_ the failures and then os-collect-config giving up on running the puppet exec. exec.