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) %}
59 type: OS::Heat::SoftwareConfig
63 modulepath: /usr/share/ansible-modules
67 - name: update_identifier
68 - name: bootstrap_server_id
69 config: {get_file: deploy-steps-playbook.yaml}
71 {% for role in roles %}
72 # Post deployment steps for all roles
73 # A single config is re-applied with an incrementing step number
74 # {{role.name}} Role steps
75 {{role.name}}ArtifactsConfig:
76 type: ../puppet/deploy-artifacts.yaml
78 {{role.name}}ArtifactsDeploy:
79 type: OS::Heat::StructuredDeploymentGroup
81 servers: {get_param: [servers, {{role.name}}]}
82 config: {get_resource: {{role.name}}ArtifactsConfig}
84 {{role.name}}HostPrepConfig:
85 type: OS::Heat::SoftwareConfig
89 modulepath: /usr/share/ansible-modules
98 puppet_config: {get_param: [role_data, {{role.name}}, puppet_config]}
99 docker_puppet_script: {get_file: docker-puppet.py}
100 docker_puppet_tasks: {get_attr: [{{primary_role_name}}DockerPuppetTasks, value]}
101 docker_startup_configs: {get_attr: [{{role.name}}DockerConfig, value]}
102 kolla_config: {get_param: [role_data, {{role.name}}, kolla_config]}
103 bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
104 puppet_step_config: {get_attr: [{{role.name}}PuppetStepConfig, value]}
106 # Join host_prep_tasks with the other per-host configuration
108 expression: $.data.host_prep_tasks + $.data.template_tasks
110 host_prep_tasks: {get_param: [role_data, {{role.name}}, host_prep_tasks]}
113 # Write the manifest for baremetal puppet configuration
114 - name: Create /var/lib/tripleo-config directory
115 file: path=/var/lib/tripleo-config state=directory
116 - name: Write the puppet step_config manifest
117 copy: content="{{puppet_step_config}}" dest=/var/lib/tripleo-config/puppet_step_config.pp force=yes
118 # This is the docker-puppet configs end in
119 - name: Create /var/lib/docker-puppet
120 file: path=/var/lib/docker-puppet state=directory
121 # this creates a JSON config file for our docker-puppet.py script
122 - name: Write docker-puppet-tasks json files
123 copy: content="{{puppet_config | to_json}}" dest=/var/lib/docker-puppet/docker-puppet.json force=yes
124 # FIXME: can we move docker-puppet somewhere so it's installed via a package?
125 - name: Write docker-puppet.py
126 copy: content="{{docker_puppet_script}}" dest=/var/lib/docker-puppet/docker-puppet.py force=yes
127 # Here we are dumping all the docker container startup configuration data
128 # so that we can have access to how they are started outside of heat
129 # and docker-cmd. This lets us create command line tools to test containers.
130 # FIXME do we need the docker-container-startup-configs.json or is the new per-step
131 # data consumed by paunch enough?
132 - name: Write docker-container-startup-configs
133 copy: content="{{docker_startup_configs | to_json}}" dest=/var/lib/docker-container-startup-configs.json force=yes
134 - name: Write per-step docker-container-startup-configs
135 copy: content="{{item.value|to_json}}" dest="/var/lib/tripleo-config/docker-container-startup-config-{{item.key}}.json" force=yes
136 with_dict: "{{docker_startup_configs}}"
137 - name: Create /var/lib/kolla/config_files directory
138 file: path=/var/lib/kolla/config_files state=directory
139 - name: Write kolla config json files
140 copy: content="{{item.value|to_json}}" dest="{{item.key}}" force=yes
141 with_dict: "{{kolla_config}}"
142 - name: Install paunch FIXME remove when packaged
144 yum -y install python-pip
146 ########################################################
147 # Bootstrap tasks, only performed on bootstrap_server_id
148 ########################################################
149 - name: Write docker-puppet-tasks json files
150 copy: content="{{item.value|to_json}}" dest=/var/lib/docker-puppet/docker-puppet-tasks{{item.key.replace("step_", "")}}.json force=yes
151 with_dict: "{{docker_puppet_tasks}}"
152 when: deploy_server_id == bootstrap_server_id
155 {{role.name}}HostPrepDeployment:
156 type: OS::Heat::SoftwareDeploymentGroup
158 servers: {get_param: [servers, {{role.name}}]}
159 config: {get_resource: {{role.name}}HostPrepConfig}
161 {{role.name}}PuppetStepConfig:
162 type: OS::Heat::Value
168 # select 'step_config' only from services that do not have a docker_config
169 $.data.service_names.zip($.data.step_config, $.data.docker_config).where($[2] = null).where($[1] != null).select($[1]).join("\n")
171 service_names: {get_param: [role_data, {{role.name}}, service_names]}
172 step_config: {get_param: [role_data, {{role.name}}, step_config]}
173 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
175 {{role.name}}DockerConfig:
176 type: OS::Heat::Value
182 # select 'docker_config' only from services that have it
183 $.data.service_names.zip($.data.docker_config).where($[1] != null).select($[1]).reduce($1.mergeWith($2), {})
185 service_names: {get_param: [role_data, {{role.name}}, service_names]}
186 docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
190 {{role.name}}PreConfig:
191 type: OS::TripleO::Tasks::{{role.name}}PreConfig
192 depends_on: {{role.name}}HostPrepDeployment
194 servers: {get_param: [servers, {{role.name}}]}
196 update_identifier: {get_param: DeployIdentifier}
198 {% for step in range(1, deploy_steps_max) %}
200 {{role.name}}Deployment_Step{{step}}:
201 type: OS::Heat::StructuredDeploymentGroup
203 depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
206 {% for dep in roles %}
207 - {{dep.name}}Deployment_Step{{step -1}}
211 name: {{role.name}}Deployment_Step{{step}}
212 servers: {get_param: [servers, {{role.name}}]}
213 config: {get_resource: RoleConfig}
216 role_name: {{role.name}}
217 update_identifier: {get_param: DeployIdentifier}
218 bootstrap_server_id: {get_param: [servers, {{primary_role_name}}, '0']}
223 {{role.name}}PostConfig:
224 type: OS::TripleO::Tasks::{{role.name}}PostConfig
226 {% for dep in roles %}
227 - {{dep.name}}Deployment_Step5
230 servers: {get_param: servers}
232 update_identifier: {get_param: DeployIdentifier}
234 # Note, this should come last, so use depends_on to ensure
235 # this is created after any other resources.
236 {{role.name}}ExtraConfigPost:
238 {% for dep in roles %}
239 - {{dep.name}}PostConfig
241 type: OS::TripleO::NodeExtraConfigPost
243 servers: {get_param: [servers, {{role.name}}]}