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: ocata
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}
186 {{role.name}}GenerateConfigDeployment:
187 type: OS::Heat::SoftwareDeploymentGroup
188 depends_on: [{{role.name}}GenPuppetDeployment, {{role.name}}ArtifactsDeploy, {{role.name}}CreateConfigDirDeployment, {{role.name}}HostPrepDeployment]
190 name: {{role.name}}GenerateConfigDeployment
191 servers: {get_param: [servers, {{role.name}}]}
192 config: {get_resource: {{role.name}}GenerateConfig}
194 {{role.name}}PuppetStepConfig:
195 type: OS::Heat::Value
201 # select 'step_config' only from services that do not have a docker_config
202 $.data.service_names.zip($.data.step_config, $.data.docker_config).where($[2] = null).where($[1] != null).select($[1]).join("\n")
204 service_names: {get_param: [role_data, {{role.name}}, service_names]}
205 step_config: {get_param: [role_data, {{role.name}}, step_config]}
206 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
208 {{role.name}}DockerConfig:
209 type: OS::Heat::Value
215 # select 'docker_config' only from services that have it
216 $.data.service_names.zip($.data.docker_config).where($[1] != null).select($[1]).reduce($1.mergeWith($2), {})
218 service_names: {get_param: [role_data, {{role.name}}, service_names]}
219 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
221 # Here we are dumping all the docker container startup configuration data
222 # so that we can have access to how they are started outside of heat
223 # and docker-cmd. This lets us create command line tools to start and
224 # test these containers.
225 {{role.name}}DockerConfigJsonStartupData:
226 type: OS::Heat::StructuredConfig
230 /var/lib/docker-container-startup-configs.json:
231 {get_attr: [{{role.name}}DockerConfig, value]}
233 {{role.name}}DockerConfigJsonStartupDataDeployment:
234 type: OS::Heat::SoftwareDeploymentGroup
236 config: {get_resource: {{role.name}}DockerConfigJsonStartupData}
237 servers: {get_param: [servers, {{role.name}}]}
239 {{role.name}}KollaJsonConfig:
240 type: OS::Heat::StructuredConfig
244 {get_param: [role_data, {{role.name}}, kolla_config]}
246 {{role.name}}KollaJsonDeployment:
247 type: OS::Heat::SoftwareDeploymentGroup
249 name: {{role.name}}KollaJsonDeployment
250 config: {get_resource: {{role.name}}KollaJsonConfig}
251 servers: {get_param: [servers, {{role.name}}]}
253 # BEGIN BAREMETAL CONFIG STEPS
255 {% if role.name == 'Controller' %}
257 type: OS::TripleO::Tasks::ControllerPrePuppet
259 servers: {get_param: [servers, Controller]}
261 update_identifier: {get_param: DeployIdentifier}
265 type: OS::TripleO::{{role.name}}Config
267 StepConfig: {get_attr: [{{role.name}}PuppetStepConfig, value]}
269 {% for step in range(1, deploy_steps_max) %}
271 {{role.name}}Deployment_Step{{step}}:
272 type: OS::Heat::StructuredDeploymentGroup
274 depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
277 {% for dep in roles %}
278 - {{dep.name}}Deployment_Step{{step -1}}
279 - {{dep.name}}ContainersDeployment_Step{{step -1}}
281 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
284 name: {{role.name}}Deployment_Step{{step}}
285 servers: {get_param: [servers, {{role.name}}]}
286 config: {get_resource: {{role.name}}Config}
289 update_identifier: {get_param: DeployIdentifier}
292 # END BAREMETAL CONFIG STEPS
294 # BEGIN CONTAINER CONFIG STEPS
295 {% for step in range(1, deploy_steps_max) %}
297 {{role.name}}ContainersConfig_Step{{step}}:
298 type: OS::Heat::StructuredConfig
302 {get_attr: [{{role.name}}DockerConfig, value, step_{{step}}]}
304 {{role.name}}ContainersDeployment_Step{{step}}:
305 type: OS::Heat::StructuredDeploymentGroup
308 - {{role.name}}PreConfig
309 - {{role.name}}KollaJsonDeployment
310 - {{role.name}}GenPuppetDeployment
311 - {{role.name}}GenerateConfigDeployment
314 {% for dep in roles %}
315 - {{dep.name}}ContainersDeployment_Step{{step -1}}
316 - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
317 - {{dep.name}}Deployment_Step{{step -1}}
319 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
322 name: {{role.name}}ContainersDeployment_Step{{step}}
323 servers: {get_param: [servers, {{role.name}}]}
324 config: {get_resource: {{role.name}}ContainersConfig_Step{{step}}}
327 # END CONTAINER CONFIG STEPS
329 {{role.name}}PostConfig:
330 type: OS::TripleO::Tasks::{{role.name}}PostConfig
332 {% for dep in roles %}
333 - {{dep.name}}Deployment_Step5
334 - {{primary_role_name}}DockerPuppetTasksDeployment5
337 servers: {get_param: servers}
339 update_identifier: {get_param: DeployIdentifier}
341 # Note, this should come last, so use depends_on to ensure
342 # this is created after any other resources.
343 {{role.name}}ExtraConfigPost:
345 {% for dep in roles %}
346 - {{dep.name}}PostConfig
348 type: OS::TripleO::NodeExtraConfigPost
350 servers: {get_param: [servers, {{role.name}}]}
352 {% if role.name == 'Controller' %}
353 ControllerPostPuppet:
355 - ControllerExtraConfigPost
356 type: OS::TripleO::Tasks::ControllerPostPuppet
358 servers: {get_param: [servers, Controller]}
360 update_identifier: {get_param: DeployIdentifier}