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}}DockerPuppetTasksConfig{{step}}:
62 type: OS::Heat::SoftwareConfig
65 config: {get_file: docker-puppet.py}
72 {{primary_role_name}}DockerPuppetTasksDeployment{{step}}:
73 type: OS::Heat::SoftwareDeployment
75 {% for dep in roles %}
76 - {{dep.name}}Deployment_Step{{step}}
77 - {{dep.name}}ContainersDeployment_Step{{step}}
80 name: {{primary_role_name}}DockerPuppetTasksDeployment{{step}}
81 server: {get_param: [servers, {{primary_role_name}}, '0']}
82 config: {get_resource: {{primary_role_name}}DockerPuppetTasksConfig{{step}}}
84 CONFIG: /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json
90 # END primary_role_name docker-puppet-tasks
92 {% for role in roles %}
93 # Post deployment steps for all roles
94 # A single config is re-applied with an incrementing step number
95 # {{role.name}} Role steps
96 {{role.name}}ArtifactsConfig:
97 type: ../puppet/deploy-artifacts.yaml
99 {{role.name}}ArtifactsDeploy:
100 type: OS::Heat::StructuredDeploymentGroup
102 servers: {get_param: [servers, {{role.name}}]}
103 config: {get_resource: {{role.name}}ArtifactsConfig}
105 {{role.name}}HostPrepConfig:
106 type: OS::Heat::SoftwareConfig
110 modulepath: /usr/share/ansible-modules
119 puppet_config: {get_param: [role_data, {{role.name}}, puppet_config]}
120 docker_puppet_script: {get_file: docker-puppet.py}
121 docker_puppet_tasks: {get_attr: [{{primary_role_name}}DockerPuppetTasks, value]}
122 docker_startup_configs: {get_attr: [{{role.name}}DockerConfig, value]}
123 kolla_config: {get_param: [role_data, {{role.name}}, kolla_config]}
124 bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
126 # Join host_prep_tasks with the other per-host configuration
128 expression: $.data.host_prep_tasks + $.data.template_tasks
130 host_prep_tasks: {get_param: [role_data, {{role.name}}, host_prep_tasks]}
133 # This is where we stack puppet configuration (for now)...
134 - name: Create /var/lib/config-data
135 file: path=/var/lib/config-data state=directory
136 # This is the docker-puppet configs end in
137 - name: Create /var/lib/docker-puppet
138 file: path=/var/lib/docker-puppet state=directory
139 # this creates a JSON config file for our docker-puppet.py script
140 - name: Write docker-puppet-tasks json files
141 copy: content="{{puppet_config | to_json}}" dest=/var/lib/docker-puppet/docker-puppet.json force=yes
142 # FIXME: can we move docker-puppet somewhere so it's installed via a package?
143 - name: Write docker-puppet.py
144 copy: content="{{docker_puppet_script}}" dest=/var/lib/docker-puppet/docker-puppet.py force=yes
145 # Here we are dumping all the docker container startup configuration data
146 # so that we can have access to how they are started outside of heat
147 # and docker-cmd. This lets us create command line tools to test containers.
148 - name: Write docker-container-startup-configs
149 copy: content="{{docker_startup_configs | to_json}}" dest=/var/lib/docker-container-startup-configs.json force=yes
150 - name: Create /var/lib/kolla/config_files directory
151 file: path=/var/lib/kolla/config_files state=directory
152 - name: Write kolla config json files
153 copy: content="{{item.value|to_json}}" dest="{{item.key}}" force=yes
154 with_dict: "{{kolla_config}}"
155 ########################################################
156 # Bootstrap tasks, only performed on bootstrap_server_id
157 ########################################################
158 - name: Write docker-puppet-tasks json files
159 copy: content="{{item.value|to_json}}" dest=/var/lib/docker-puppet/docker-puppet-tasks{{item.key.replace("step_", "")}}.json force=yes
160 with_dict: "{{docker_puppet_tasks}}"
161 when: deploy_server_id == bootstrap_server_id
164 {{role.name}}HostPrepDeployment:
165 type: OS::Heat::SoftwareDeploymentGroup
167 servers: {get_param: [servers, {{role.name}}]}
168 config: {get_resource: {{role.name}}HostPrepConfig}
170 {{role.name}}GenerateConfig:
171 type: OS::Heat::SoftwareConfig
174 config: {get_file: docker-puppet.py}
178 {{role.name}}GenerateConfigDeployment:
179 type: OS::Heat::SoftwareDeploymentGroup
180 depends_on: [{{role.name}}ArtifactsDeploy, {{role.name}}HostPrepDeployment]
182 name: {{role.name}}GenerateConfigDeployment
183 servers: {get_param: [servers, {{role.name}}]}
184 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 # BEGIN BAREMETAL CONFIG STEPS
217 {{role.name}}PreConfig:
218 type: OS::TripleO::Tasks::{{role.name}}PreConfig
220 servers: {get_param: [servers, {{role.name}}]}
222 update_identifier: {get_param: DeployIdentifier}
225 type: OS::TripleO::{{role.name}}Config
227 StepConfig: {get_attr: [{{role.name}}PuppetStepConfig, value]}
229 {% for step in range(1, deploy_steps_max) %}
231 {{role.name}}Deployment_Step{{step}}:
232 type: OS::Heat::StructuredDeploymentGroup
234 depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
237 {% for dep in roles %}
238 - {{dep.name}}Deployment_Step{{step -1}}
239 - {{dep.name}}ContainersDeployment_Step{{step -1}}
241 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
244 name: {{role.name}}Deployment_Step{{step}}
245 servers: {get_param: [servers, {{role.name}}]}
246 config: {get_resource: {{role.name}}Config}
249 update_identifier: {get_param: DeployIdentifier}
252 # END BAREMETAL CONFIG STEPS
254 # BEGIN CONTAINER CONFIG STEPS
255 {% for step in range(1, deploy_steps_max) %}
257 {{role.name}}ContainersConfig_Step{{step}}:
258 type: OS::Heat::StructuredConfig
262 {get_attr: [{{role.name}}DockerConfig, value, step_{{step}}]}
264 {{role.name}}ContainersDeployment_Step{{step}}:
265 type: OS::Heat::StructuredDeploymentGroup
268 {%- for dep in roles %}
269 - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
271 - {{role.name}}PreConfig
272 - {{role.name}}HostPrepDeployment
273 - {{role.name}}GenerateConfigDeployment
276 {% for dep in roles %}
277 - {{dep.name}}ContainersDeployment_Step{{step -1}}
278 - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
279 - {{dep.name}}Deployment_Step{{step -1}}
281 - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
284 name: {{role.name}}ContainersDeployment_Step{{step}}
285 servers: {get_param: [servers, {{role.name}}]}
286 config: {get_resource: {{role.name}}ContainersConfig_Step{{step}}}
289 # END CONTAINER CONFIG STEPS
291 {{role.name}}PostConfig:
292 type: OS::TripleO::Tasks::{{role.name}}PostConfig
294 {% for dep in roles %}
295 - {{dep.name}}Deployment_Step5
296 - {{primary_role_name}}DockerPuppetTasksDeployment5
299 servers: {get_param: servers}
301 update_identifier: {get_param: DeployIdentifier}
303 # Note, this should come last, so use depends_on to ensure
304 # this is created after any other resources.
305 {{role.name}}ExtraConfigPost:
307 {% for dep in roles %}
308 - {{dep.name}}PostConfig
310 type: OS::TripleO::NodeExtraConfigPost
312 servers: {get_param: [servers, {{role.name}}]}