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 heat_template_version: ocata
15 Post-deploy configuration steps via puppet for all roles,
16 as defined in ../roles_data.yaml
21 description: Mapping of Role name e.g Controller to a list of servers
24 description: Mapping of Role name e.g Controller to the per-role data
29 Setting this to a unique value will re-run any deployment tasks which
30 perform configuration on a Heat stack-update.
33 description: Mapping of service endpoint -> protocol. Typically set
34 via parameter_defaults in the resource registry.
39 # These utility tasks use docker-puppet.py to execute tasks via puppet
40 # We only execute these on the first node in the primary role
41 {{primary_role_name}}DockerPuppetTasks:
48 dict($.data.docker_puppet_tasks.where($1 != null).selectMany($.items()).groupBy($[0], $[1]))
50 docker_puppet_tasks: {get_param: [role_data, {{primary_role_name}}, docker_puppet_tasks]}
52 # BEGIN primary_role_name docker-puppet-tasks (run only on a single node)
53 {% for step in range(1, 6) %}
55 {{primary_role_name}}DockerPuppetJsonConfig{{step}}:
56 type: OS::Heat::StructuredConfig
60 /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json:
61 {get_attr: [{{primary_role_name}}DockerPuppetTasks, value, 'step_{{step}}']}
63 {{primary_role_name}}DockerPuppetJsonDeployment{{step}}:
64 type: OS::Heat::SoftwareDeployment
66 server: {get_param: [servers, {{primary_role_name}}, '0']}
67 config: {get_resource: {{primary_role_name}}DockerPuppetJsonConfig{{step}}}
69 {{primary_role_name}}DockerPuppetTasksConfig{{step}}:
70 type: OS::Heat::SoftwareConfig
73 config: {get_file: docker-puppet.py}
80 {{primary_role_name}}DockerPuppetTasksDeployment{{step}}:
81 type: OS::Heat::SoftwareDeployment
83 {% for dep in roles %}
84 - {{dep.name}}Deployment_Step{{step}}
85 - {{dep.name}}ContainersDeployment_Step{{step}}
87 - {{primary_role_name}}DockerPuppetJsonDeployment{{step}}
89 name: {{primary_role_name}}DockerPuppetJsonDeployment{{step}}
90 server: {get_param: [servers, {{primary_role_name}}, '0']}
91 config: {get_resource: {{primary_role_name}}DockerPuppetTasksConfig{{step}}}
93 CONFIG: /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json
99 # END primary_role_name docker-puppet-tasks
101 {% for role in roles %}
102 # Post deployment steps for all roles
103 # A single config is re-applied with an incrementing step number
104 # {{role.name}} Role steps
105 {{role.name}}ArtifactsConfig:
106 type: ../puppet/deploy-artifacts.yaml
108 {{role.name}}ArtifactsDeploy:
109 type: OS::Heat::StructuredDeploymentGroup
111 servers: {get_param: [servers, {{role.name}}]}
112 config: {get_resource: {{role.name}}ArtifactsConfig}
114 {{role.name}}PreConfig:
115 type: OS::TripleO::Tasks::{{role.name}}PreConfig
117 servers: {get_param: [servers, {{role.name}}]}
119 update_identifier: {get_param: DeployIdentifier}
121 {{role.name}}CreateConfigDir:
122 type: OS::Heat::SoftwareConfig
125 config: {get_file: create-config-dir.sh}
127 {{role.name}}CreateConfigDirDeployment:
128 type: OS::Heat::SoftwareDeploymentGroup
130 servers: {get_param: [servers, {{role.name}}]}
131 config: {get_resource: {{role.name}}CreateConfigDir}
133 {{role.name}}HostPrepAnsible:
134 type: OS::Heat::Value
143 tasks: {get_param: [role_data, {{role.name}}, host_prep_tasks]}
145 {{role.name}}HostPrepConfig:
146 type: OS::Heat::SoftwareConfig
150 modulepath: /usr/share/ansible-modules
151 config: {get_attr: [{{role.name}}HostPrepAnsible, value]}
153 {{role.name}}HostPrepDeployment:
154 type: OS::Heat::SoftwareDeploymentGroup
156 servers: {get_param: [servers, {{role.name}}]}
157 config: {get_resource: {{role.name}}HostPrepConfig}
159 # this creates a JSON config file for our docker-puppet.py script
160 {{role.name}}GenPuppetConfig:
161 type: OS::Heat::StructuredConfig
165 /var/lib/docker-puppet/docker-puppet.json:
166 {get_param: [role_data, {{role.name}}, puppet_config]}
168 {{role.name}}GenPuppetDeployment:
169 type: OS::Heat::SoftwareDeploymentGroup
171 servers: {get_param: [servers, {{role.name}}]}
172 config: {get_resource: {{role.name}}GenPuppetConfig}
174 {{role.name}}GenerateConfig:
175 type: OS::Heat::SoftwareConfig
178 config: {get_file: docker-puppet.py}
180 {{role.name}}GenerateConfigDeployment:
181 type: OS::Heat::SoftwareDeploymentGroup
182 depends_on: [{{role.name}}GenPuppetDeployment, {{role.name}}ArtifactsDeploy, {{role.name}}CreateConfigDirDeployment, {{role.name}}HostPrepDeployment]
184 name: {{role.name}}GenerateConfigDeployment
185 servers: {get_param: [servers, {{role.name}}]}
186 config: {get_resource: {{role.name}}GenerateConfig}
188 {{role.name}}PuppetStepConfig:
189 type: OS::Heat::Value
195 # select 'step_config' only from services that do not have a docker_config
196 $.data.service_names.zip($.data.step_config, $.data.docker_config).where($[2] = null).where($[1] != null).select($[1]).join("\n")
198 service_names: {get_param: [role_data, {{role.name}}, service_names]}
199 step_config: {get_param: [role_data, {{role.name}}, step_config]}
200 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
202 {{role.name}}DockerConfig:
203 type: OS::Heat::Value
209 # select 'docker_config' only from services that have it
210 $.data.service_names.zip($.data.docker_config).where($[1] != null).select($[1]).reduce($1.mergeWith($2), {})
212 service_names: {get_param: [role_data, {{role.name}}, service_names]}
213 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
215 # Here we are dumping all the docker container startup configuration data
216 # so that we can have access to how they are started outside of heat
217 # and docker-cmd. This lets us create command line tools to start and
218 # test these containers.
219 {{role.name}}DockerConfigJsonStartupData:
220 type: OS::Heat::StructuredConfig
224 /var/lib/docker-container-startup-configs.json:
225 {get_attr: [{{role.name}}DockerConfig, value]}
227 {{role.name}}DockerConfigJsonStartupDataDeployment:
228 type: OS::Heat::SoftwareDeploymentGroup
230 config: {get_resource: {{role.name}}DockerConfigJsonStartupData}
231 servers: {get_param: [servers, {{role.name}}]}
233 {{role.name}}KollaJsonConfig:
234 type: OS::Heat::StructuredConfig
238 {get_param: [role_data, {{role.name}}, kolla_config]}
240 {{role.name}}KollaJsonDeployment:
241 type: OS::Heat::SoftwareDeploymentGroup
243 name: {{role.name}}KollaJsonDeployment
244 config: {get_resource: {{role.name}}KollaJsonConfig}
245 servers: {get_param: [servers, {{role.name}}]}
247 # BEGIN BAREMETAL CONFIG STEPS
249 {% if role.name == 'Controller' %}
251 type: OS::TripleO::Tasks::ControllerPrePuppet
253 servers: {get_param: [servers, Controller]}
255 update_identifier: {get_param: DeployIdentifier}
259 type: OS::TripleO::{{role.name}}Config
261 StepConfig: {get_attr: [{{role.name}}PuppetStepConfig, value]}
263 {% for step in range(1, 6) %}
265 {{role.name}}Deployment_Step{{step}}:
266 type: OS::Heat::StructuredDeploymentGroup
268 depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
271 {% for dep in roles %}
272 - {{dep.name}}Deployment_Step{{step -1}}
273 - {{dep.name}}ContainersDeployment_Step{{step -1}}
275 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
278 name: {{role.name}}Deployment_Step{{step}}
279 servers: {get_param: [servers, {{role.name}}]}
280 config: {get_resource: {{role.name}}Config}
283 update_identifier: {get_param: DeployIdentifier}
286 # END BAREMETAL CONFIG STEPS
288 # BEGIN CONTAINER CONFIG STEPS
289 {% for step in range(1, 6) %}
291 {{role.name}}ContainersConfig_Step{{step}}:
292 type: OS::Heat::StructuredConfig
296 {get_attr: [{{role.name}}DockerConfig, value, step_{{step}}]}
298 {{role.name}}ContainersDeployment_Step{{step}}:
299 type: OS::Heat::StructuredDeploymentGroup
302 - {{role.name}}PreConfig
303 - {{role.name}}KollaJsonDeployment
304 - {{role.name}}GenPuppetDeployment
305 - {{role.name}}GenerateConfigDeployment
308 {% for dep in roles %}
309 - {{dep.name}}ContainersDeployment_Step{{step -1}}
310 - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
311 - {{dep.name}}Deployment_Step{{step -1}}
313 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
316 name: {{role.name}}ContainersDeployment_Step{{step}}
317 servers: {get_param: [servers, {{role.name}}]}
318 config: {get_resource: {{role.name}}ContainersConfig_Step{{step}}}
321 # END CONTAINER CONFIG STEPS
323 {{role.name}}PostConfig:
324 type: OS::TripleO::Tasks::{{role.name}}PostConfig
326 {% for dep in roles %}
327 - {{dep.name}}Deployment_Step5
328 - {{primary_role_name}}DockerPuppetTasksDeployment5
331 servers: {get_param: servers}
333 update_identifier: {get_param: DeployIdentifier}
335 # Note, this should come last, so use depends_on to ensure
336 # this is created after any other resources.
337 {{role.name}}ExtraConfigPost:
339 {% for dep in roles %}
340 - {{dep.name}}PostConfig
342 type: OS::TripleO::NodeExtraConfigPost
344 servers: {get_param: [servers, {{role.name}}]}
346 {% if role.name == 'Controller' %}
347 ControllerPostPuppet:
349 - ControllerExtraConfigPost
350 type: OS::TripleO::Tasks::ControllerPostPuppet
352 servers: {get_param: [servers, Controller]}
354 update_identifier: {get_param: DeployIdentifier}