Introduce heat as new provisioner

This change introduces OpenStack Heat as new provisioner.

Notes about how it is expected to work.
- Below heat templates are created without parameter defaults
as they differ depending on OpenStack Cloud where the instances
are created and number of instances to be created.
  - provisioner/heat/playbooks/roles/install-configure-heat/files/heat-template.yaml
  - provisioner/heat/playbooks/roles/install-configure-heat/files/heat-server.yaml
- Parameters in provided heat-template.yaml are expected to be set by the user
provided heat environment file using argument -e <uri to heat environment file> as
they are specific to OpenStack Cloud and the scenario. If user does not provide
heat environment file, the engine will use the default environment file to set
the parameter values which is pretty conservative.
  - provisioner/heat/playbooks/roles/install-configure-heat/files/heat-environment.yaml
- As the instances are provisioned from OpenStack Cloud and also due to
not having PDF and IDF for them, configure-network role is skipped
for these instances. This could be looked into in future when the need
arises.

Another thing to note is that even though the engine is run within Python virtualenv,
Ansible OpenStack module doesn't seem to respect to this and uses system Python. This
causes execution of engine with Heat as provisioner fail with below error.

  fatal: [localhost]: FAILED! => {"changed": false, "msg": "openstacksdk is required for this module"}

This is due to that Ansible OpenStack module looks in system Python which doesn't have
the package openstacksdk installed since we install it in virtualenv.

This change explicitly sets ansible_python_interpreter to be the one that is in
in virtualenv.

Change-Id: I1d9e5c722d4a0fe4dfd14ef3fa06b1e01c44aabc
2 files changed