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: Name of the topmost stack
29 description: Mapping of Role name e.g Controller to the per-role data
34 Setting this to a unique value will re-run any deployment tasks which
35 perform configuration on a Heat stack-update.
38 description: Mapping of service endpoint -> protocol. Typically set
39 via parameter_defaults in the resource registry.
44 description: Set to True to enable debug logging with docker-puppet.py
49 {% for step in range(1, deploy_steps_max) %}
50 WorkflowTasks_Step{{step}}_Enabled:
52 {%- for role in roles %}
55 - get_param: [role_data, {{role.name}}, service_workflow_tasks, step{{step}}]
63 # These utility tasks use docker-puppet.py to execute tasks via puppet
64 # We only execute these on the first node in the primary role
65 {{primary_role_name}}DockerPuppetTasks:
72 $.data.default_tasks + dict($.data.docker_puppet_tasks.where($1 != null).selectMany($.items()).groupBy($[0], $[1]))
74 docker_puppet_tasks: {get_param: [role_data, {{primary_role_name}}, docker_puppet_tasks]}
76 {%- for step in range(1, deploy_steps_max) %}
81 type: OS::Heat::SoftwareConfig
85 modulepath: /usr/share/ansible-modules
89 - name: update_identifier
90 - name: bootstrap_server_id
91 - name: docker_puppet_debug
92 config: {get_file: deploy-steps-playbook.yaml}
94 {%- for step in range(1, deploy_steps_max) %}
95 # BEGIN service_workflow_tasks handling
96 WorkflowTasks_Step{{step}}:
97 type: OS::Mistral::Workflow
98 condition: WorkflowTasks_Step{{step}}_Enabled
101 {%- for dep in roles %}
102 - {{dep.name}}PreConfig
103 - {{dep.name}}ArtifactsDeploy
106 {%- for dep in roles %}
107 - {{dep.name}}Deployment_Step{{step -1}}
111 name: {list_join: [".", ["tripleo", {get_param: stack_name}, "workflowtasks", "step{{step}}"]]}
115 expression: $.data.where($ != '').select($.get('step{{step}}')).where($ != null).flatten()
117 {%- for role in roles %}
118 - get_param: [role_data, {{role.name}}, service_workflow_tasks]
121 WorkflowTasks_Step{{step}}_Execution:
122 type: OS::Mistral::ExternalResource
123 condition: WorkflowTasks_Step{{step}}_Enabled
124 depends_on: WorkflowTasks_Step{{step}}
128 workflow: { get_resource: WorkflowTasks_Step{{step}} }
131 service_ips: { get_param: ctlplane_service_ips }
133 {%- for r in roles %}
134 {{r.name}}: {get_param: [role_data, {{r.name}}, merged_config_settings]}
137 workflow: { get_resource: WorkflowTasks_Step{{step}} }
140 service_ips: { get_param: ctlplane_service_ips }
142 {%- for r in roles %}
143 {{r.name}}: {get_param: [role_data, {{r.name}}, merged_config_settings]}
146 # END service_workflow_tasks handling
149 {% for role in roles %}
150 # Post deployment steps for all roles
151 # A single config is re-applied with an incrementing step number
152 # {{role.name}} Role steps
153 {{role.name}}ArtifactsConfig:
154 type: ../puppet/deploy-artifacts.yaml
156 {{role.name}}ArtifactsDeploy:
157 type: OS::Heat::StructuredDeploymentGroup
159 servers: {get_param: [servers, {{role.name}}]}
160 config: {get_resource: {{role.name}}ArtifactsConfig}
162 {{role.name}}HostPrepConfig:
163 type: OS::Heat::SoftwareConfig
167 modulepath: /usr/share/ansible-modules
176 puppet_config: {get_param: [role_data, {{role.name}}, puppet_config]}
177 docker_puppet_script: {get_file: docker-puppet.py}
178 docker_puppet_tasks: {get_attr: [{{primary_role_name}}DockerPuppetTasks, value]}
179 docker_startup_configs: {get_attr: [{{role.name}}DockerConfig, value]}
180 kolla_config: {get_param: [role_data, {{role.name}}, kolla_config]}
181 bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
182 puppet_step_config: {get_attr: [{{role.name}}PuppetStepConfig, value]}
184 # Join host_prep_tasks with the other per-host configuration
186 expression: $.data.host_prep_tasks + $.data.template_tasks
188 host_prep_tasks: {get_param: [role_data, {{role.name}}, host_prep_tasks]}
191 # Write the manifest for baremetal puppet configuration
192 - name: Create /var/lib/tripleo-config directory
193 file: path=/var/lib/tripleo-config state=directory
194 - name: Write the puppet step_config manifest
195 copy: content="{{puppet_step_config}}" dest=/var/lib/tripleo-config/puppet_step_config.pp force=yes
196 # This is the docker-puppet configs end in
197 - name: Create /var/lib/docker-puppet
198 file: path=/var/lib/docker-puppet state=directory
199 # this creates a JSON config file for our docker-puppet.py script
200 - name: Write docker-puppet-tasks json files
201 copy: content="{{puppet_config | to_json}}" dest=/var/lib/docker-puppet/docker-puppet.json force=yes
202 # FIXME: can we move docker-puppet somewhere so it's installed via a package?
203 - name: Write docker-puppet.py
204 copy: content="{{docker_puppet_script}}" dest=/var/lib/docker-puppet/docker-puppet.py force=yes
205 # Here we are dumping all the docker container startup configuration data
206 # so that we can have access to how they are started outside of heat
207 # and docker-cmd. This lets us create command line tools to test containers.
208 # FIXME do we need the docker-container-startup-configs.json or is the new per-step
209 # data consumed by paunch enough?
210 - name: Write docker-container-startup-configs
211 copy: content="{{docker_startup_configs | to_json}}" dest=/var/lib/docker-container-startup-configs.json force=yes
212 - name: Write per-step docker-container-startup-configs
213 copy: content="{{item.value|to_json}}" dest="/var/lib/tripleo-config/docker-container-startup-config-{{item.key}}.json" force=yes
214 with_dict: "{{docker_startup_configs}}"
215 - name: Create /var/lib/kolla/config_files directory
216 file: path=/var/lib/kolla/config_files state=directory
217 - name: Write kolla config json files
218 copy: content="{{item.value|to_json}}" dest="{{item.key}}" force=yes
219 with_dict: "{{kolla_config}}"
220 ########################################################
221 # Bootstrap tasks, only performed on bootstrap_server_id
222 ########################################################
223 - name: Write docker-puppet-tasks json files
224 copy: content="{{item.value|to_json}}" dest=/var/lib/docker-puppet/docker-puppet-tasks{{item.key.replace("step_", "")}}.json force=yes
225 with_dict: "{{docker_puppet_tasks}}"
226 when: deploy_server_id == bootstrap_server_id
229 {{role.name}}HostPrepDeployment:
230 type: OS::Heat::SoftwareDeploymentGroup
232 servers: {get_param: [servers, {{role.name}}]}
233 config: {get_resource: {{role.name}}HostPrepConfig}
235 {{role.name}}PuppetStepConfig:
236 type: OS::Heat::Value
242 # select 'step_config' only from services that do not have a docker_config
243 $.data.service_names.zip($.data.step_config, $.data.docker_config).where($[2] = null).where($[1] != null).select($[1]).join("\n")
245 service_names: {get_param: [role_data, {{role.name}}, service_names]}
246 step_config: {get_param: [role_data, {{role.name}}, step_config]}
247 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
249 {{role.name}}DockerConfig:
250 type: OS::Heat::Value
256 # select 'docker_config' only from services that have it
257 $.data.service_names.zip($.data.docker_config).where($[1] != null).select($[1]).reduce($1.mergeWith($2), {})
259 service_names: {get_param: [role_data, {{role.name}}, service_names]}
260 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
264 {{role.name}}PreConfig:
265 type: OS::TripleO::Tasks::{{role.name}}PreConfig
266 depends_on: {{role.name}}HostPrepDeployment
268 servers: {get_param: [servers, {{role.name}}]}
270 update_identifier: {get_param: DeployIdentifier}
272 {% for step in range(1, deploy_steps_max) %}
273 {{role.name}}Deployment_Step{{step}}:
274 type: OS::Heat::StructuredDeploymentGroup
276 - WorkflowTasks_Step{{step}}_Execution
277 # TODO(gfidente): the following if/else condition
278 # replicates what is already defined for the
279 # WorkflowTasks_StepX resource and can be remove
280 # if https://bugs.launchpad.net/heat/+bug/1700569
283 {%- for dep in roles %}
284 - {{dep.name}}PreConfig
285 - {{dep.name}}ArtifactsDeploy
288 {%- for dep in roles %}
289 - {{dep.name}}Deployment_Step{{step -1}}
293 name: {{role.name}}Deployment_Step{{step}}
294 servers: {get_param: [servers, {{role.name}}]}
295 config: {get_resource: RoleConfig}
298 role_name: {{role.name}}
299 update_identifier: {get_param: DeployIdentifier}
300 bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
301 docker_puppet_debug: {get_param: DockerPuppetDebug}
305 # Note, this should be the last step to execute configuration changes.
306 # Ensure that all {{role.name}}ExtraConfigPost steps are executed
307 # after all the previous deployment steps.
308 {{role.name}}ExtraConfigPost:
310 {%- for dep in roles %}
311 - {{dep.name}}Deployment_Step5
313 type: OS::TripleO::NodeExtraConfigPost
315 servers: {get_param: [servers, {{role.name}}]}
317 # The {{role.name}}PostConfig steps are in charge of
318 # quiescing all services, i.e. in the Controller case,
319 # we should run a full service reload.
320 {{role.name}}PostConfig:
321 type: OS::TripleO::Tasks::{{role.name}}PostConfig
323 {%- for dep in roles %}
324 - {{dep.name}}ExtraConfigPost
327 servers: {get_param: servers}
329 update_identifier: {get_param: DeployIdentifier}