Merge "Add bind mounts for agent state"
[apex-tripleo-heat-templates.git] / puppet / role.role.j2.yaml
1 heat_template_version: 2016-10-14
2 description: 'OpenStack {{role}} node configured by Puppet'
3 parameters:
4   Overcloud{{role}}Flavor:
5     description: Flavor for the {{role}} node.
6     default: baremetal
7     type: string
8 {% if disable_constraints is not defined %}
9     constraints:
10       - custom_constraint: nova.flavor
11 {% endif %}
12   {{role}}Image:
13     type: string
14     default: overcloud-full
15 {% if disable_constraints is not defined %}
16     constraints:
17       - custom_constraint: glance.image
18 {% endif %}
19   ImageUpdatePolicy:
20     default: 'REBUILD_PRESERVE_EPHEMERAL'
21     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
22     type: string
23   KeyName:
24     description: Name of an existing Nova key pair to enable SSH access to the instances
25     type: string
26     default: default
27 {% if disable_constraints is not defined %}
28     constraints:
29       - custom_constraint: nova.keypair
30 {% endif %}
31   NeutronPublicInterface:
32     default: nic1
33     description: What interface to bridge onto br-ex for network nodes.
34     type: string
35   ServiceNetMap:
36     default: {}
37     description: Mapping of service_name -> network name. Typically set
38                  via parameter_defaults in the resource registry.
39     type: json
40   EndpointMap:
41     default: {}
42     description: Mapping of service endpoint -> protocol. Typically set
43                  via parameter_defaults in the resource registry.
44     type: json
45   UpdateIdentifier:
46     default: ''
47     type: string
48     description: >
49       Setting to a previously unused value during stack-update will trigger
50       package update on all nodes
51   Hostname:
52     type: string
53     default: '' # Defaults to Heat created hostname
54   HostnameMap:
55     type: json
56     default: {}
57     description: Optional mapping to override hostnames
58   ExtraConfig:
59     default: {}
60     description: |
61       Additional hiera configuration to inject into the cluster. Note
62       that {{role}}ExtraConfig takes precedence over ExtraConfig.
63     type: json
64   {{role}}ExtraConfig:
65     default: {}
66     description: |
67       Role specific additional hiera configuration to inject into the cluster.
68     type: json
69   {{role}}IPs:
70     default: {}
71     type: json
72   NetworkDeploymentActions:
73     type: comma_delimited_list
74     description: >
75       Heat action when to apply network configuration changes
76     default: ['CREATE']
77   SoftwareConfigTransport:
78     default: POLL_SERVER_CFN
79     description: |
80       How the server should receive the metadata required for software configuration.
81     type: string
82     constraints:
83     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
84   CloudDomain:
85     default: 'localdomain'
86     type: string
87     description: >
88       The DNS domain used for the hosts. This should match the dhcp_domain
89       configured in the Undercloud neutron. Defaults to localdomain.
90   {{role}}ServerMetadata:
91     default: {}
92     description: >
93       Extra properties or metadata passed to Nova for the created nodes in
94       the overcloud. It's accessible via the Nova metadata API. This option is
95       role-specific and is merged with the values given to the ServerMetadata
96       parameter.
97     type: json
98   ServerMetadata:
99     default: {}
100     description: >
101       Extra properties or metadata passed to Nova for the created nodes in
102       the overcloud. It's accessible via the Nova metadata API. This applies to
103       all roles and is merged with a role-specific metadata parameter.
104     type: json
105   {{role}}SchedulerHints:
106     type: json
107     description: Optional scheduler hints to pass to nova
108     default: {}
109   NodeIndex:
110     type: number
111     default: 0
112   ServiceConfigSettings:
113     type: json
114     default: {}
115   ServiceNames:
116     type: comma_delimited_list
117     default: []
118   MonitoringSubscriptions:
119     type: comma_delimited_list
120     default: []
121   ServiceMetadataSettings:
122     type: json
123     default: {}
124   ConfigCommand:
125     type: string
126     description: Command which will be run whenever configuration data changes
127     default: os-refresh-config --timeout 14400
128   LoggingSources:
129     type: json
130     default: []
131   LoggingGroups:
132     type: comma_delimited_list
133     default: []
134   UpgradeInitCommand:
135     type: string
136     description: |
137       Command or script snippet to run on all overcloud nodes to
138       initialize the upgrade process. E.g. a repository switch.
139     default: ''
140
141
142 resources:
143   {{role}}:
144     type: OS::TripleO::Server
145     metadata:
146       os-collect-config:
147         command: {get_param: ConfigCommand}
148     properties:
149       image: {get_param: {{role}}Image}
150       image_update_policy: {get_param: ImageUpdatePolicy}
151       flavor: {get_param: Overcloud{{role}}Flavor}
152       key_name: {get_param: KeyName}
153       networks:
154         - network: ctlplane
155       user_data_format: SOFTWARE_CONFIG
156       user_data: {get_resource: UserData}
157       name:
158         str_replace:
159             template: {get_param: Hostname}
160             params: {get_param: HostnameMap}
161       software_config_transport: {get_param: SoftwareConfigTransport}
162       metadata:
163         map_merge:
164           - {get_param: ServerMetadata}
165           - {get_param: {{role}}ServerMetadata}
166           - {get_param: ServiceMetadataSettings}
167       scheduler_hints: {get_param: {{role}}SchedulerHints}
168
169   # Combine the NodeAdminUserData and NodeUserData mime archives
170   UserData:
171     type: OS::Heat::MultipartMime
172     properties:
173       parts:
174       - config: {get_resource: NodeAdminUserData}
175         type: multipart
176       - config: {get_resource: NodeUserData}
177         type: multipart
178
179   # Creates the "heat-admin" user if configured via the environment
180   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
181   NodeAdminUserData:
182     type: OS::TripleO::NodeAdminUserData
183
184   # For optional operator additional userdata
185   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
186   NodeUserData:
187     type: OS::TripleO::NodeUserData
188
189   ExternalPort:
190     type: OS::TripleO::{{role}}::Ports::ExternalPort
191     properties:
192       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
193       IPPool: {get_param: {{role}}IPs}
194       NodeIndex: {get_param: NodeIndex}
195
196   InternalApiPort:
197     type: OS::TripleO::{{role}}::Ports::InternalApiPort
198     properties:
199       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
200       IPPool: {get_param: {{role}}IPs}
201       NodeIndex: {get_param: NodeIndex}
202
203   StoragePort:
204     type: OS::TripleO::{{role}}::Ports::StoragePort
205     properties:
206       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
207       IPPool: {get_param: {{role}}IPs}
208       NodeIndex: {get_param: NodeIndex}
209
210   StorageMgmtPort:
211     type: OS::TripleO::{{role}}::Ports::StorageMgmtPort
212     properties:
213       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
214       IPPool: {get_param: {{role}}IPs}
215       NodeIndex: {get_param: NodeIndex}
216
217   TenantPort:
218     type: OS::TripleO::{{role}}::Ports::TenantPort
219     properties:
220       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
221       IPPool: {get_param: {{role}}IPs}
222       NodeIndex: {get_param: NodeIndex}
223
224   ManagementPort:
225     type: OS::TripleO::{{role}}::Ports::ManagementPort
226     properties:
227       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
228       IPPool: {get_param: {{role}}IPs}
229       NodeIndex: {get_param: NodeIndex}
230
231   NetworkConfig:
232     type: OS::TripleO::{{role}}::Net::SoftwareConfig
233     properties:
234       ControlPlaneIp: {get_attr: [{{role}}, networks, ctlplane, 0]}
235       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
236       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
237       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
238       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
239       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
240       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
241
242   NetIpMap:
243     type: OS::TripleO::Network::Ports::NetIpMap
244     properties:
245       ControlPlaneIp: {get_attr: [{{role}}, networks, ctlplane, 0]}
246       ExternalIp: {get_attr: [ExternalPort, ip_address]}
247       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
248       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
249       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
250       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
251       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
252       StorageIp: {get_attr: [StoragePort, ip_address]}
253       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
254       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
255       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
256       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
257       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
258       TenantIp: {get_attr: [TenantPort, ip_address]}
259       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
260       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
261       ManagementIp: {get_attr: [ManagementPort, ip_address]}
262       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
263       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
264
265   NetHostMap:
266     type: OS::Heat::Value
267     properties:
268       type: json
269       value:
270         external:
271           fqdn:
272             list_join:
273             - '.'
274             - - {get_attr: [{{role}}, name]}
275               - external
276               - {get_param: CloudDomain}
277           short:
278             list_join:
279             - '.'
280             - - {get_attr: [{{role}}, name]}
281               - external
282         internal_api:
283           fqdn:
284             list_join:
285             - '.'
286             - - {get_attr: [{{role}}, name]}
287               - internalapi
288               - {get_param: CloudDomain}
289           short:
290             list_join:
291             - '.'
292             - - {get_attr: [{{role}}, name]}
293               - internalapi
294         storage:
295           fqdn:
296             list_join:
297             - '.'
298             - - {get_attr: [{{role}}, name]}
299               - storage
300               - {get_param: CloudDomain}
301           short:
302             list_join:
303             - '.'
304             - - {get_attr: [{{role}}, name]}
305               - storage
306         storage_mgmt:
307           fqdn:
308             list_join:
309             - '.'
310             - - {get_attr: [{{role}}, name]}
311               - storagemgmt
312               - {get_param: CloudDomain}
313           short:
314             list_join:
315             - '.'
316             - - {get_attr: [{{role}}, name]}
317               - storagemgmt
318         tenant:
319           fqdn:
320             list_join:
321             - '.'
322             - - {get_attr: [{{role}}, name]}
323               - tenant
324               - {get_param: CloudDomain}
325           short:
326             list_join:
327             - '.'
328             - - {get_attr: [{{role}}, name]}
329               - tenant
330         management:
331           fqdn:
332             list_join:
333             - '.'
334             - - {get_attr: [{{role}}, name]}
335               - management
336               - {get_param: CloudDomain}
337           short:
338             list_join:
339             - '.'
340             - - {get_attr: [{{role}}, name]}
341               - management
342         ctlplane:
343           fqdn:
344             list_join:
345             - '.'
346             - - {get_attr: [{{role}}, name]}
347               - ctlplane
348               - {get_param: CloudDomain}
349           short:
350             list_join:
351             - '.'
352             - - {get_attr: [{{role}}, name]}
353               - ctlplane
354
355   NetworkDeployment:
356     type: OS::TripleO::SoftwareDeployment
357     properties:
358       name: NetworkDeployment
359       config: {get_resource: NetworkConfig}
360       server: {get_resource: {{role}}}
361       actions: {get_param: NetworkDeploymentActions}
362       input_values:
363         bridge_name: br-ex
364         interface_name: {get_param: NeutronPublicInterface}
365
366   {{role}}UpgradeInitConfig:
367     type: OS::Heat::SoftwareConfig
368     properties:
369       group: script
370       config:
371         list_join:
372         - ''
373         - - "#!/bin/bash\n\n"
374           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
375           - get_param: UpgradeInitCommand
376
377   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
378   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
379   {{role}}UpgradeInitDeployment:
380     type: OS::Heat::SoftwareDeployment
381     depends_on: NetworkDeployment
382     properties:
383       name: {{role}}UpgradeInitDeployment
384       server: {get_resource: {{role}}}
385       config: {get_resource: {{role}}UpgradeInitConfig}
386
387   {{role}}Deployment:
388     type: OS::Heat::StructuredDeployment
389     depends_on: {{role}}UpgradeInitDeployment
390     properties:
391       name: {{role}}Deployment
392       config: {get_resource: {{role}}Config}
393       server: {get_resource: {{role}}}
394       input_values:
395         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
396
397   {{role}}Config:
398     type: OS::Heat::StructuredConfig
399     properties:
400       group: hiera
401       config:
402         hierarchy:
403           - '"%{::uuid}"'
404           - heat_config_%{::deploy_config_name}
405           - {{role.lower()}}_extraconfig
406           - extraconfig
407           - service_names
408           - service_configs
409           - {{role.lower()}}
410           - bootstrap_node # provided by allNodesConfig
411           - all_nodes # provided by allNodesConfig
412           - vip_data # provided by allNodesConfig
413           - '"%{::osfamily}"'
414         merge_behavior: deeper
415         datafiles:
416           service_names:
417             service_names: {get_param: ServiceNames}
418             sensu::subscriptions: {get_param: MonitoringSubscriptions}
419           service_configs:
420             map_replace:
421               - {get_param: ServiceConfigSettings}
422               - values: {get_attr: [NetIpMap, net_ip_map]}
423           {{role.lower()}}_extraconfig: {get_param: {{role}}ExtraConfig}
424           extraconfig: {get_param: ExtraConfig}
425           {{role.lower()}}:
426             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
427             tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: LoggingSources}
428             tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: LoggingGroups}
429             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
430             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
431             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
432             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
433             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
434             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
435
436   # Resource for site-specific injection of root certificate
437   NodeTLSCAData:
438     depends_on: {{role}}Deployment
439     type: OS::TripleO::NodeTLSCAData
440     properties:
441       server: {get_resource: {{role}}}
442
443   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
444   {{role}}ExtraConfigPre:
445     depends_on: {{role}}Deployment
446     type: OS::TripleO::{{role}}ExtraConfigPre
447     properties:
448         server: {get_resource: {{role}}}
449
450   # Hook for site-specific additional pre-deployment config,
451   # applying to all nodes, e.g node registration/unregistration
452   NodeExtraConfig:
453     depends_on: [{{role}}ExtraConfigPre, NodeTLSCAData]
454     type: OS::TripleO::NodeExtraConfig
455     properties:
456         server: {get_resource: {{role}}}
457
458   UpdateConfig:
459     type: OS::TripleO::Tasks::PackageUpdate
460
461   UpdateDeployment:
462     type: OS::Heat::SoftwareDeployment
463     properties:
464       config: {get_resource: UpdateConfig}
465       server: {get_resource: {{role}}}
466       input_values:
467         update_identifier:
468           get_param: UpdateIdentifier
469
470 outputs:
471   ip_address:
472     description: IP address of the server in the ctlplane network
473     value: {get_attr: [{{role}}, networks, ctlplane, 0]}
474   hostname:
475     description: Hostname of the server
476     value: {get_attr: [{{role}}, name]}
477   hostname_map:
478     description: Mapping of network names to hostnames
479     value:
480       external: {get_attr: [NetHostMap, value, external, fqdn]}
481       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
482       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
483       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
484       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
485       management: {get_attr: [NetHostMap, value, management, fqdn]}
486       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
487   hosts_entry:
488     value:
489       str_replace:
490         template: |
491           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
492           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
493           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
494           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
495           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
496           TENANTIP TENANTHOST.DOMAIN TENANTHOST
497           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
498           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
499         params:
500           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role}}HostnameResolveNetwork]}]}
501           DOMAIN: {get_param: CloudDomain}
502           PRIMARYHOST: {get_attr: [{{role}}, name]}
503           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
504           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
505           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
506           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
507           STORAGEIP: {get_attr: [StoragePort, ip_address]}
508           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
509           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
510           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
511           TENANTIP: {get_attr: [TenantPort, ip_address]}
512           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
513           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
514           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
515           CTLPLANEIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
516           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
517   nova_server_resource:
518     description: Heat resource handle for {{role}} server
519     value:
520       {get_resource: {{role}}}
521   external_ip_address:
522     description: IP address of the server in the external network
523     value: {get_attr: [ExternalPort, ip_address]}
524   internal_api_ip_address:
525     description: IP address of the server in the internal_api network
526     value: {get_attr: [InternalApiPort, ip_address]}
527   storage_ip_address:
528     description: IP address of the server in the storage network
529     value: {get_attr: [StoragePort, ip_address]}
530   storage_mgmt_ip_address:
531     description: IP address of the server in the storage_mgmt network
532     value: {get_attr: [StorageMgmtPort, ip_address]}
533   tenant_ip_address:
534     description: IP address of the server in the tenant network
535     value: {get_attr: [TenantPort, ip_address]}
536   management_ip_address:
537     description: IP address of the server in the management network
538     value: {get_attr: [ManagementPort, ip_address]}