TripleO deployment is primarily based on Heat orchestration to co-ordinates the creation and deployment of different resources an OpenStack cluster deployment. TripleO is a feature rich installer, which is highly customizable for specific requirements and hardware dependency. This post is going to explain the usage of Heat templates in TripleO installer.
Heat Orchestration Templates (HOT) Format
The format of the HOT template is:
heat_template_version: ocata
description:
# a description of the template
parameter_groups:
# a declaration of input parameter groups and order
parameters:
# declaration of input parameters
resources:
# declaration of template resources
outputs:
# declaration of output parameters
conditions:
# declaration of conditions
The explanation of each section and its functionalities can be found in the HOT Spec.
Types of Resources
-
Heat Pre-defined Resource Type - Example:
OS::Heat::SoftwareConfig
-
OpenStack specific Pre-defined Resource Type - Example:
OS::Nova::Server
-
Custom Resource Type - Example:
OS::TripleO::Network::External
. It will reference to another heat template file itself, a kind of nested templating
Jinja Templating
A important concept to know before going in deep of TripleO templates, is the usage of Jinja templating in the heat templates. With the introduction of composable roles in newton cycle, which is an architectural change of bringing feature association with any node instead of static association, it brings in the requirement of defining the heat resources dynamically for a deployment. For this dynamic heat resource definition, Jinja templating engine is used to define the heat resources based on the role definition. More about the detailed explanation of composable roles and its entities will be explained in following posts.
TripleO Heat Template - Files to Know
overcloud.j2.yaml
Top-level heat template file for TripleO deployment. This file contains the
overcloud
stack definition template.
overcloud-resource-registry-puppet.j2.yaml
Custom resource type definition of TripleO heat templates are listed in this file. Note, that deployer can define their own custom type which can be associated with any file or pre-define resource and provide as input to the deployment.
roles_data.yaml
A file which contains the roles and its definition. This file need to be customized in order to define the customized roles for a deployment. Each role is associated with a set of features (services), which are pre-defined.
environments
directory
Adding a feature in TripleO deployment involves defining the custom heat
resource type and the required parameters for the features. An environment file
is provided for each feature available with TripleO installer in this
environments
directory. Deployer can use this environment file during the
plan creation (stack deployment).
Understanding Nested Templates in TripleO
TripleO initiates the heat stack deployment with a top level template
overcloud.j2.yaml
which is of Jinja template. Before the heat stack
creation, all the .j2.yaml
files in the templates folder will be applied
to Jinja templating with the input from the roles_data.yaml
file (which
contains the role definition).
Then the top-level stack creation is initiated which will build all the resources of this stack. Based on the resources types, the corresponding action will be taken by the heat engine. In case of custom resource types, the associated templates file to the resource type will be created as a nested stack to the resource and the parent stack which has this resource.
Sample Stack Output Tree
Lets take an example to understand the nested stacks.
overcloud:
resources:
Networks:
type: OS::TripleO::Network
stacks:
overcloud-Networks-f53ijhkio762:
resources:
ExternalNetwork:
type: OS::TripleO::Network::External
stacks:
overcloud-Networks-f53ijhkio762-ExternalNetwork-h5w3sdi4wzbm:
resources:
ExternalNetwork:
type: OS::Neutron::Net
ExternalSubnet:
type: OS::Neutron::Subnet
The top level stack is named as overcloud
which is represened by the
file overcloud.j2.yaml
, which contains lots of resources under its
definitiong. Lets take one of the resource, Networks
, whic is defined as
custom heat resource type OS::TripleO::Networks
. This custom resource
type is mapped to a heat template file network/networks.yaml
in the
resource registry file. This will create a nested stack under the resource
Networks
with stack name as overcloud-Networks-xxxxxx
.
This nested stack, which is in the second level, contains multiple resource
defined in the template file, as ExternalNetwork, TenantNetwork,
InternalNetwork, etc,. Consider the resource ExternaleNetwork
, which is
also a custom heat resource type, which is defined in the registry file as
OS::TripleO::Network::External
. This resource type can be be mapped to
different template files based on the type of the deployment based on IPV4 or
IPv6. For IPv4 deployment, the template file environments/network- isolation.yaml
provides the mapping to this custom type of the template
file network/external.yaml
. This template file will create a nested
stack under the resource ExternalNetwork
with stack name as
overcloud-Networks-xxxxxx-ExternalNetwork-yyyyyy
.
This nested stack, which is in the third level, also contains two resource
defined in the template file as ExternelNetwork and ExternalSubnet. Consider
the resource ExternalNetwork
, which is a heat defined resource type
OS::Neutron::Net
(provided by OpenStack resource definitions). This
resource definition is embedded with in the heat engine.
Useful Commands
-
openstack stack resource list overcloud
provides the list of resources defined in the top level stackovercloud
-
openstack stack resource show overcloud Networks
provides the details of the resourceNetworks
from the top level stack. The attributelinks
in the detailed view of the resource provides the resource’s and its associated stack heat engine HTTP links. This link is a JSON list with an Object containinghref
(heat engine HTTP link) andrel
(type of the link). The list of possible types of links are:self
- Provides the HTTP link of this resourcestack
- Provides the HTTP link of the stack to which this resource belongs toonested
- Provides the HTTP link of the nested stack of this resource. The name of the nested stack can be found from this link itself. With this link, in the sample show below, the nested stack name can be identified asovercloud-Networks-f53ijhkio762
.
[
{
"href": "http://172.18.0.1:8004/v1/8094ede366ef4c6f8dd7d8e6876fa910/stacks/overcloud/ea2098fb-f41e-400c-ad19-1ed8f83476b3/resources/Networks",
"rel": "self"
},
{
"href": "http://172.18.0.1:8004/v1/8094ede366ef4c6f8dd7d8e6876fa910/stacks/overcloud/ea2098fb-f41e-400c-ad19-1ed8f83476b3",
"rel": "stack"
},
{
"href": "http://172.18.0.1:8004/v1/8094ede366ef4c6f8dd7d8e6876fa910/stacks/overcloud-Networks-f53ijhkio762/aadaf2af-a1b9-412a-a152-1e2ac0488a1c",
"rel": "nested"
}
]
-
openstack stack resource list overcloud-Networks-f53ijhkio762
provides the list of resource’s associated with this nested stack -
openstack stack list --nested
provides the list of all stacks including the nested stacks -
openstack stack resource list overcloud -n2
provides the list of all the resources associated with top-level and the nested stack with 2 level.