1 # certain initialization steps (run in a container) will occur
2 # on the role marked as primary controller or the first role listed
3 {%- set primary_role = [roles[0]] -%}
4 {%- for role in roles -%}
5 {%- if 'primary' in role.tags and 'controller' in role.tags -%}
6 {%- set _ = primary_role.pop() -%}
7 {%- set _ = primary_role.append(role) -%}
10 {%- set primary_role_name = primary_role[0].name -%}
11 # primary role is: {{primary_role_name}}
12 {% set deploy_steps_max = 6 -%}
14 heat_template_version: pike
17 Post-deploy configuration steps via puppet for all roles,
18 as defined in ../roles_data.yaml
23 description: Mapping of Role name e.g Controller to a list of servers
26 description: Mapping of Role name e.g Controller to the per-role data
31 Setting this to a unique value will re-run any deployment tasks which
32 perform configuration on a Heat stack-update.
35 description: Mapping of service endpoint -> protocol. Typically set
36 via parameter_defaults in the resource registry.
41 # These utility tasks use docker-puppet.py to execute tasks via puppet
42 # We only execute these on the first node in the primary role
43 {{primary_role_name}}DockerPuppetTasks:
50 $.data.default_tasks + dict($.data.docker_puppet_tasks.where($1 != null).selectMany($.items()).groupBy($[0], $[1]))
52 docker_puppet_tasks: {get_param: [role_data, {{primary_role_name}}, docker_puppet_tasks]}
54 {%- for step in range(1, deploy_steps_max) %}
58 # BEGIN primary_role_name docker-puppet-tasks (run only on a single node)
59 {% for step in range(1, deploy_steps_max) %}
61 {{primary_role_name}}DockerPuppetJsonConfig{{step}}:
62 type: OS::Heat::StructuredConfig
66 /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json:
67 {get_attr: [{{primary_role_name}}DockerPuppetTasks, value, 'step_{{step}}']}
69 {{primary_role_name}}DockerPuppetJsonDeployment{{step}}:
70 type: OS::Heat::SoftwareDeployment
72 server: {get_param: [servers, {{primary_role_name}}, '0']}
73 config: {get_resource: {{primary_role_name}}DockerPuppetJsonConfig{{step}}}
75 {{primary_role_name}}DockerPuppetTasksConfig{{step}}:
76 type: OS::Heat::SoftwareConfig
79 config: {get_file: docker-puppet.py}
86 {{primary_role_name}}DockerPuppetTasksDeployment{{step}}:
87 type: OS::Heat::SoftwareDeployment
89 {% for dep in roles %}
90 - {{dep.name}}Deployment_Step{{step}}
91 - {{dep.name}}ContainersDeployment_Step{{step}}
93 - {{primary_role_name}}DockerPuppetJsonDeployment{{step}}
95 name: {{primary_role_name}}DockerPuppetJsonDeployment{{step}}
96 server: {get_param: [servers, {{primary_role_name}}, '0']}
97 config: {get_resource: {{primary_role_name}}DockerPuppetTasksConfig{{step}}}
99 CONFIG: /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json
105 # END primary_role_name docker-puppet-tasks
107 {% for role in roles %}
108 # Post deployment steps for all roles
109 # A single config is re-applied with an incrementing step number
110 # {{role.name}} Role steps
111 {{role.name}}ArtifactsConfig:
112 type: ../puppet/deploy-artifacts.yaml
114 {{role.name}}ArtifactsDeploy:
115 type: OS::Heat::StructuredDeploymentGroup
117 servers: {get_param: [servers, {{role.name}}]}
118 config: {get_resource: {{role.name}}ArtifactsConfig}
120 {{role.name}}PreConfig:
121 type: OS::TripleO::Tasks::{{role.name}}PreConfig
123 servers: {get_param: [servers, {{role.name}}]}
125 update_identifier: {get_param: DeployIdentifier}
127 {{role.name}}CreateConfigDir:
128 type: OS::Heat::SoftwareConfig
131 config: {get_file: create-config-dir.sh}
133 {{role.name}}CreateConfigDirDeployment:
134 type: OS::Heat::SoftwareDeploymentGroup
136 servers: {get_param: [servers, {{role.name}}]}
137 config: {get_resource: {{role.name}}CreateConfigDir}
139 {{role.name}}HostPrepAnsible:
140 type: OS::Heat::Value
149 tasks: {get_param: [role_data, {{role.name}}, host_prep_tasks]}
151 {{role.name}}HostPrepConfig:
152 type: OS::Heat::SoftwareConfig
156 modulepath: /usr/share/ansible-modules
157 config: {get_attr: [{{role.name}}HostPrepAnsible, value]}
159 {{role.name}}HostPrepDeployment:
160 type: OS::Heat::SoftwareDeploymentGroup
162 servers: {get_param: [servers, {{role.name}}]}
163 config: {get_resource: {{role.name}}HostPrepConfig}
165 # this creates a JSON config file for our docker-puppet.py script
166 {{role.name}}GenPuppetConfig:
167 type: OS::Heat::StructuredConfig
171 /var/lib/docker-puppet/docker-puppet.json:
172 {get_param: [role_data, {{role.name}}, puppet_config]}
174 {{role.name}}GenPuppetDeployment:
175 type: OS::Heat::SoftwareDeploymentGroup
177 servers: {get_param: [servers, {{role.name}}]}
178 config: {get_resource: {{role.name}}GenPuppetConfig}
180 {{role.name}}GenerateConfig:
181 type: OS::Heat::SoftwareConfig
184 config: {get_file: docker-puppet.py}
188 {{role.name}}GenerateConfigDeployment:
189 type: OS::Heat::SoftwareDeploymentGroup
190 depends_on: [{{role.name}}GenPuppetDeployment, {{role.name}}ArtifactsDeploy, {{role.name}}CreateConfigDirDeployment, {{role.name}}HostPrepDeployment]
192 name: {{role.name}}GenerateConfigDeployment
193 servers: {get_param: [servers, {{role.name}}]}
194 config: {get_resource: {{role.name}}GenerateConfig}
198 {{role.name}}PuppetStepConfig:
199 type: OS::Heat::Value
205 # select 'step_config' only from services that do not have a docker_config
206 $.data.service_names.zip($.data.step_config, $.data.docker_config).where($[2] = null).where($[1] != null).select($[1]).join("\n")
208 service_names: {get_param: [role_data, {{role.name}}, service_names]}
209 step_config: {get_param: [role_data, {{role.name}}, step_config]}
210 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
212 {{role.name}}DockerConfig:
213 type: OS::Heat::Value
219 # select 'docker_config' only from services that have it
220 $.data.service_names.zip($.data.docker_config).where($[1] != null).select($[1]).reduce($1.mergeWith($2), {})
222 service_names: {get_param: [role_data, {{role.name}}, service_names]}
223 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
225 # Here we are dumping all the docker container startup configuration data
226 # so that we can have access to how they are started outside of heat
227 # and docker-cmd. This lets us create command line tools to start and
228 # test these containers.
229 {{role.name}}DockerConfigJsonStartupData:
230 type: OS::Heat::StructuredConfig
234 /var/lib/docker-container-startup-configs.json:
235 {get_attr: [{{role.name}}DockerConfig, value]}
237 {{role.name}}DockerConfigJsonStartupDataDeployment:
238 type: OS::Heat::SoftwareDeploymentGroup
240 config: {get_resource: {{role.name}}DockerConfigJsonStartupData}
241 servers: {get_param: [servers, {{role.name}}]}
243 {{role.name}}KollaJsonConfig:
244 type: OS::Heat::StructuredConfig
248 {get_param: [role_data, {{role.name}}, kolla_config]}
250 {{role.name}}KollaJsonDeployment:
251 type: OS::Heat::SoftwareDeploymentGroup
253 name: {{role.name}}KollaJsonDeployment
254 config: {get_resource: {{role.name}}KollaJsonConfig}
255 servers: {get_param: [servers, {{role.name}}]}
257 # BEGIN BAREMETAL CONFIG STEPS
259 {{role.name}}PreConfig:
260 type: OS::TripleO::Tasks::{{role.name}}PreConfig
262 servers: {get_param: [servers, {{role.name}}]}
264 update_identifier: {get_param: DeployIdentifier}
267 type: OS::TripleO::{{role.name}}Config
269 StepConfig: {get_attr: [{{role.name}}PuppetStepConfig, value]}
271 {% for step in range(1, deploy_steps_max) %}
273 {{role.name}}Deployment_Step{{step}}:
274 type: OS::Heat::StructuredDeploymentGroup
276 depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
279 {% for dep in roles %}
280 - {{dep.name}}Deployment_Step{{step -1}}
281 - {{dep.name}}ContainersDeployment_Step{{step -1}}
283 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
286 name: {{role.name}}Deployment_Step{{step}}
287 servers: {get_param: [servers, {{role.name}}]}
288 config: {get_resource: {{role.name}}Config}
291 update_identifier: {get_param: DeployIdentifier}
294 # END BAREMETAL CONFIG STEPS
296 # BEGIN CONTAINER CONFIG STEPS
297 {% for step in range(1, deploy_steps_max) %}
299 {{role.name}}ContainersConfig_Step{{step}}:
300 type: OS::Heat::StructuredConfig
304 {get_attr: [{{role.name}}DockerConfig, value, step_{{step}}]}
306 {{role.name}}ContainersDeployment_Step{{step}}:
307 type: OS::Heat::StructuredDeploymentGroup
310 - {{role.name}}KollaJsonDeployment
311 - {{role.name}}GenPuppetDeployment
312 - {{role.name}}GenerateConfigDeployment
313 {%- for dep in roles %}
314 - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
318 {% for dep in roles %}
319 - {{dep.name}}ContainersDeployment_Step{{step -1}}
320 - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
321 - {{dep.name}}Deployment_Step{{step -1}}
323 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
326 name: {{role.name}}ContainersDeployment_Step{{step}}
327 servers: {get_param: [servers, {{role.name}}]}
328 config: {get_resource: {{role.name}}ContainersConfig_Step{{step}}}
331 # END CONTAINER CONFIG STEPS
333 {{role.name}}PostConfig:
334 type: OS::TripleO::Tasks::{{role.name}}PostConfig
336 {% for dep in roles %}
337 - {{dep.name}}Deployment_Step5
338 - {{primary_role_name}}DockerPuppetTasksDeployment5
341 servers: {get_param: servers}
343 update_identifier: {get_param: DeployIdentifier}
345 # Note, this should come last, so use depends_on to ensure
346 # this is created after any other resources.
347 {{role.name}}ExtraConfigPost:
349 {% for dep in roles %}
350 - {{dep.name}}PostConfig
352 type: OS::TripleO::NodeExtraConfigPost
354 servers: {get_param: [servers, {{role.name}}]}