cinder: switch CinderCronDbPurgeUser to 'cinder'
[apex-tripleo-heat-templates.git] / common / deploy-steps.j2
1 # certain initialization steps (run in a container) will occur
2 # on the role marked as primary controller or the first role listed
3 {%- if enabled_roles is not defined -%}
4   # On upgrade certain roles can be disabled for operator driven upgrades
5   # See major_upgrade_steps.j2.yaml and post-upgrade.j2.yaml
6   {%- set enabled_roles = roles -%}
7   {%- set is_upgrade = false -%}
8 {%- else %}
9   {%- set is_upgrade = true -%}
10 {%- endif -%}
11 {%- set primary_role = [enabled_roles[0]] -%}
12 {%- for role in enabled_roles -%}
13   {%- if 'primary' in role.tags and 'controller' in role.tags -%}
14     {%- set _ = primary_role.pop() -%}
15     {%- set _ = primary_role.append(role) -%}
16   {%- endif -%}
17 {%- endfor -%}
18 {%- set primary_role_name = primary_role[0].name -%}
19 # primary role is: {{primary_role_name}}
20 {% set deploy_steps_max = 6 -%}
21 {% set update_steps_max = 6 -%}
22 {% set upgrade_steps_max = 6 -%}
23
24 heat_template_version: pike
25
26 description: >
27   Post-deploy configuration steps via puppet for all roles,
28   as defined in ../roles_data.yaml
29
30 parameters:
31   servers:
32     type: json
33     description: Mapping of Role name e.g Controller to a list of servers
34   stack_name:
35     type: string
36     description: Name of the topmost stack
37   role_data:
38     type: json
39     description: Mapping of Role name e.g Controller to the per-role data
40   DeployIdentifier:
41     default: ''
42     type: string
43     description: >
44       Setting this to a unique value will re-run any deployment tasks which
45       perform configuration on a Heat stack-update.
46   EndpointMap:
47     default: {}
48     description: Mapping of service endpoint -> protocol. Typically set
49                  via parameter_defaults in the resource registry.
50     type: json
51   ConfigDebug:
52     default: false
53     description: Whether to run config management (e.g. Puppet) in debug mode.
54     type: boolean
55   DockerPuppetDebug:
56     type: string
57     default: ''
58     description: Set to True to enable debug logging with docker-puppet.py
59   DockerPuppetProcessCount:
60     type: number
61     default: 3
62     description: Number of concurrent processes to use when running docker-puppet to generate config files.
63   ctlplane_service_ips:
64     type: json
65
66 conditions:
67 {% for step in range(1, deploy_steps_max) %}
68   WorkflowTasks_Step{{step}}_Enabled:
69     or:
70     {%- for role in enabled_roles %}
71       - not:
72           equals:
73             - get_param: [role_data, {{role.name}}, workflow_tasks, step{{step}}]
74             - ''
75       - False
76     {%- endfor %}
77 {% endfor %}
78
79 resources:
80
81   RoleConfig:
82     type: OS::Heat::SoftwareConfig
83     properties:
84       group: ansible
85       options:
86         modulepath: /usr/share/ansible-modules
87       inputs:
88         - name: step
89         - name: role_name
90         - name: update_identifier
91         - name: bootstrap_server_id
92         - name: enable_debug
93         - name: docker_puppet_debug
94         - name: docker_puppet_process_count
95       config:
96         str_replace:
97           template: |
98             - hosts: localhost
99               connection: local
100               tasks:
101               _TASKS
102           params:
103             _TASKS: {get_file: deploy-steps-tasks.yaml}
104
105 {%- for step in range(1, deploy_steps_max) %}
106 # BEGIN workflow_tasks handling
107   WorkflowTasks_Step{{step}}:
108     type: OS::Mistral::Workflow
109     condition: WorkflowTasks_Step{{step}}_Enabled
110     depends_on:
111     {%- if step == 1 %}
112     {%- for dep in enabled_roles %}
113       - {{dep.name}}PreConfig
114       - {{dep.name}}ArtifactsDeploy
115     {%- endfor %}
116     {%- else %}
117     {%- for dep in enabled_roles %}
118       - {{dep.name}}Deployment_Step{{step -1}}
119     {%- endfor %}
120     {%- endif %}
121     properties:
122       name: {list_join: [".", ["tripleo", {get_param: stack_name}, "workflow_tasks", "step{{step}}"]]}
123       type: direct
124       tasks:
125         yaql:
126           expression: $.data.where($ != '').select($.get('step{{step}}')).where($ != null).flatten()
127           data:
128           {%- for role in enabled_roles %}
129             - get_param: [role_data, {{role.name}}, workflow_tasks]
130           {%- endfor %}
131
132   WorkflowTasks_Step{{step}}_Execution:
133     type: OS::Mistral::ExternalResource
134     condition: WorkflowTasks_Step{{step}}_Enabled
135     depends_on: WorkflowTasks_Step{{step}}
136     properties:
137       actions:
138         CREATE:
139           workflow: { get_resource: WorkflowTasks_Step{{step}} }
140           params:
141             env:
142               service_ips: { get_param: ctlplane_service_ips }
143               role_merged_configs:
144                 {%- for r in roles %}
145                 {{r.name}}: {get_param: [role_data, {{r.name}}, merged_config_settings]}
146                 {%- endfor %}
147             evaluate_env: false
148         UPDATE:
149           workflow: { get_resource: WorkflowTasks_Step{{step}} }
150           params:
151             env:
152               service_ips: { get_param: ctlplane_service_ips }
153               role_merged_configs:
154                 {%- for r in roles %}
155                 {{r.name}}: {get_param: [role_data, {{r.name}}, merged_config_settings]}
156                 {%- endfor %}
157             evaluate_env: false
158       always_update: true
159 # END workflow_tasks handling
160 {% endfor %}
161
162 # Artifacts config and HostPrepConfig is done on all roles, not only
163 # enabled_roles, because on upgrade we need to write the json files
164 # for the operator driven upgrade scripts (the ansible steps consume them)
165 {% for role in roles %}
166   # Prepare host tasks for {{role.name}}
167   {{role.name}}ArtifactsConfig:
168     type: ../puppet/deploy-artifacts.yaml
169
170   {{role.name}}ArtifactsDeploy:
171     type: OS::Heat::StructuredDeploymentGroup
172     properties:
173       servers:  {get_param: [servers, {{role.name}}]}
174       config: {get_resource: {{role.name}}ArtifactsConfig}
175
176   {{role.name}}HostPrepConfig:
177     type: OS::Heat::SoftwareConfig
178     properties:
179       group: ansible
180       options:
181         modulepath: /usr/share/ansible-modules
182       config:
183         str_replace:
184           template: _PLAYBOOK
185           params:
186             _PLAYBOOK:
187               - hosts: localhost
188                 connection: local
189                 vars:
190                   puppet_config: {get_param: [role_data, {{role.name}}, puppet_config]}
191                   docker_puppet_script: {get_file: ../docker/docker-puppet.py}
192                   docker_puppet_tasks: {get_param: [role_data, {{role.name}}, docker_puppet_tasks]}
193                   docker_startup_configs: {get_param: [role_data, {{role.name}}, docker_config]}
194                   kolla_config: {get_param: [role_data, {{role.name}}, kolla_config]}
195                   bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
196                   puppet_step_config: {get_param: [role_data, {{role.name}}, step_config]}
197                 tasks:
198                   # Join host_prep_tasks with the other per-host configuration
199                   list_concat:
200 {%- if is_upgrade|default(false) and role.disable_upgrade_deployment|default(false) %}
201                     - []
202 {%- else %}
203                     - {get_param: [role_data, {{role.name}}, host_prep_tasks]}
204 {%- endif %}
205                     -
206 {%- raw %}
207                       # Write the manifest for baremetal puppet configuration
208                       - name: Create /var/lib/tripleo-config directory
209                         file: path=/var/lib/tripleo-config state=directory
210                       - name: Write the puppet step_config manifest
211                         copy: content="{{puppet_step_config}}" dest=/var/lib/tripleo-config/puppet_step_config.pp force=yes mode=0600
212                       # this creates a JSON config file for our docker-puppet.py script
213                       - name: Create /var/lib/docker-puppet
214                         file: path=/var/lib/docker-puppet state=directory
215                       - name: Write docker-puppet-tasks json files
216                         copy: content="{{puppet_config | to_json}}" dest=/var/lib/docker-puppet/docker-puppet.json force=yes mode=0600
217                       # FIXME: can we move docker-puppet somewhere so it's installed via a package?
218                       - name: Write docker-puppet.py
219                         copy: content="{{docker_puppet_script}}" dest=/var/lib/docker-puppet/docker-puppet.py force=yes mode=0600
220                       # Here we are dumping all the docker container startup configuration data
221                       # so that we can have access to how they are started outside of heat
222                       # and docker-cmd.  This lets us create command line tools to test containers.
223                       # FIXME do we need the docker-container-startup-configs.json or is the new per-step
224                       # data consumed by paunch enough?
225                       - name: Write docker-container-startup-configs
226                         copy: content="{{docker_startup_configs | to_json}}" dest=/var/lib/docker-container-startup-configs.json force=yes mode=0600
227                       - name: Write per-step docker-container-startup-configs
228                         copy: content="{{item.value|to_json}}" dest="/var/lib/tripleo-config/docker-container-startup-config-{{item.key}}.json" force=yes mode=0600
229                         with_dict: "{{docker_startup_configs}}"
230                       - name: Create /var/lib/kolla/config_files directory
231                         file: path=/var/lib/kolla/config_files state=directory
232                       - name: Write kolla config json files
233                         copy: content="{{item.value|to_json}}" dest="{{item.key}}" force=yes mode=0600
234                         with_dict: "{{kolla_config}}"
235                       ########################################################
236                       # Bootstrap tasks, only performed on bootstrap_server_id
237                       ########################################################
238                       - name: Clean /var/lib/docker-puppet/docker-puppet-tasks*.json files
239                         file:
240                           path: "{{item}}"
241                           state: absent
242                         with_fileglob:
243                           - /var/lib/docker-puppet/docker-puppet-tasks*.json
244                         when: deploy_server_id == bootstrap_server_id
245                       - name: Write docker-puppet-tasks json files
246                         copy: content="{{item.value|to_json}}" dest=/var/lib/docker-puppet/docker-puppet-tasks{{item.key.replace("step_", "")}}.json force=yes mode=0600
247                         with_dict: "{{docker_puppet_tasks}}"
248                         when: deploy_server_id == bootstrap_server_id
249 {%- endraw %}
250
251   {{role.name}}HostPrepDeployment:
252     type: OS::Heat::SoftwareDeploymentGroup
253     properties:
254       servers: {get_param: [servers, {{role.name}}]}
255       config: {get_resource: {{role.name}}HostPrepConfig}
256 {% endfor %}
257
258   # BEGIN CONFIG STEPS, only on enabled_roles
259 {%- for role in enabled_roles %}
260   {{role.name}}PreConfig:
261     type: OS::TripleO::Tasks::{{role.name}}PreConfig
262     depends_on: {{role.name}}HostPrepDeployment
263     properties:
264       servers: {get_param: [servers, {{role.name}}]}
265       input_values:
266         update_identifier: {get_param: DeployIdentifier}
267
268   # Deployment steps for {{role.name}}
269   # A single config is re-applied with an incrementing step number
270   {% for step in range(1, deploy_steps_max) %}
271   {{role.name}}Deployment_Step{{step}}:
272     type: OS::TripleO::DeploymentSteps
273     depends_on:
274       - WorkflowTasks_Step{{step}}_Execution
275     # TODO(gfidente): the following if/else condition
276     # replicates what is already defined for the
277     # WorkflowTasks_StepX resource and can be remove
278     # if https://bugs.launchpad.net/heat/+bug/1700569
279     # is fixed.
280     {%- if step == 1 %}
281     {%- for dep in enabled_roles %}
282       - {{dep.name}}PreConfig
283       - {{dep.name}}ArtifactsDeploy
284     {%- endfor %}
285     {%- else %}
286     {%- for dep in enabled_roles %}
287       - {{dep.name}}Deployment_Step{{step -1}}
288     {%- endfor %}
289     {%- endif %}
290     properties:
291       name: {{role.name}}Deployment_Step{{step}}
292       servers: {get_param: [servers, {{role.name}}]}
293       config: {get_resource: RoleConfig}
294       input_values:
295         step: {{step}}
296         role_name: {{role.name}}
297         update_identifier: {get_param: DeployIdentifier}
298         bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
299         enable_debug: {get_param: ConfigDebug}
300         docker_puppet_debug: {get_param: DockerPuppetDebug}
301         docker_puppet_process_count: {get_param: DockerPuppetProcessCount}
302   {% endfor %}
303   # END CONFIG STEPS
304
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:
309     depends_on:
310   {%- for dep in enabled_roles %}
311       - {{dep.name}}Deployment_Step5
312   {%- endfor %}
313     type: OS::TripleO::NodeExtraConfigPost
314     properties:
315         servers: {get_param: [servers, {{role.name}}]}
316
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
322     depends_on:
323   {%- for dep in enabled_roles %}
324       - {{dep.name}}ExtraConfigPost
325   {%- endfor %}
326     properties:
327       servers:  {get_param: servers}
328       input_values:
329         update_identifier: {get_param: DeployIdentifier}
330
331
332 {% endfor %}
333
334 outputs:
335   RoleConfig:
336     description: Mapping of config data for all roles
337     value:
338       deploy_steps_tasks: {get_file: deploy-steps-tasks.yaml}
339       deploy_steps_playbook: |
340         - hosts: overcloud
341           tasks:
342 {%- for role in roles %}
343             - include: {{role.name}}/host_prep_tasks.yaml
344               when: role_name == '{{role.name}}'
345 {%- endfor %}
346             - include: deploy_steps_tasks.yaml
347               with_sequence: start=0 end={{deploy_steps_max-1}}
348               loop_control:
349                 loop_var: step
350       update_steps_tasks: |
351 {%- for role in roles %}
352             - include: {{role.name}}/update_tasks.yaml
353               when: role_name == '{{role.name}}'
354 {%- endfor %}
355       update_steps_playbook: |
356         - hosts: overcloud
357           serial: 1
358           tasks:
359             - include: update_steps_tasks.yaml
360               with_sequence: start=0 end={{update_steps_max-1}}
361               loop_control:
362                 loop_var: step
363             - include: deploy_steps_tasks.yaml
364               with_sequence: start=0 end={{deploy_steps_max-1}}
365               loop_control:
366                 loop_var: step
367       upgrade_steps_tasks: |
368 {%- for role in roles %}
369             - include: {{role.name}}/upgrade_tasks.yaml
370               when: role_name == '{{role.name}}'
371 {%- endfor %}
372       upgrade_steps_playbook: |
373         - hosts: overcloud
374           tasks:
375             - include: upgrade_steps_tasks.yaml
376               with_sequence: start=0 end={{upgrade_steps_max-1}}
377               loop_control:
378                 loop_var: step