Merge "Adds docker OpenDaylight"
[apex-tripleo-heat-templates.git] / puppet / role.role.j2.yaml
1 heat_template_version: pike
2 description: 'OpenStack {{role.name}} node configured by Puppet'
3 parameters:
4   Overcloud{{role.name}}Flavor:
5     description: Flavor for the {{role.name}} node.
6     default: baremetal
7     type: string
8 {% if role.disable_constraints is not defined %}
9     constraints:
10       - custom_constraint: nova.flavor
11 {% endif %}
12   {{role.name}}Image:
13     type: string
14     default: overcloud-full
15 {% if role.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 role.disable_constraints is not defined %}
28     constraints:
29       - custom_constraint: nova.keypair
30 {% endif %}
31   NeutronPhysicalBridge:
32     default: 'br-ex'
33     description: An OVS bridge to create for accessing tenant networks.
34     type: string
35   NeutronPublicInterface:
36     default: nic1
37     description: Which interface to add to the NeutronPhysicalBridge.
38     type: string
39   ServiceNetMap:
40     default: {}
41     description: Mapping of service_name -> network name. Typically set
42                  via parameter_defaults in the resource registry.
43     type: json
44   EndpointMap:
45     default: {}
46     description: Mapping of service endpoint -> protocol. Typically set
47                  via parameter_defaults in the resource registry.
48     type: json
49   UpdateIdentifier:
50     default: ''
51     type: string
52     description: >
53       Setting to a previously unused value during stack-update will trigger
54       package update on all nodes
55   Hostname:
56     type: string
57     default: '' # Defaults to Heat created hostname
58   HostnameMap:
59     type: json
60     default: {}
61     description: Optional mapping to override hostnames
62   ExtraConfig:
63     default: {}
64     description: |
65       Additional hiera configuration to inject into the cluster. Note
66       that {{role.name}}ExtraConfig takes precedence over ExtraConfig.
67     type: json
68   {{role.name}}ExtraConfig:
69     default: {}
70     description: |
71       Role specific additional hiera configuration to inject into the cluster.
72     type: json
73   {{role.name}}IPs:
74     default: {}
75     type: json
76   NetworkDeploymentActions:
77     type: comma_delimited_list
78     description: >
79       Heat action when to apply network configuration changes
80     default: ['CREATE']
81   SoftwareConfigTransport:
82     default: POLL_SERVER_CFN
83     description: |
84       How the server should receive the metadata required for software configuration.
85     type: string
86     constraints:
87     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
88   CloudDomain:
89     default: 'localdomain'
90     type: string
91     description: >
92       The DNS domain used for the hosts. This must match the
93       overcloud_domain_name configured on the undercloud.
94   {{role.name}}ServerMetadata:
95     default: {}
96     description: >
97       Extra properties or metadata passed to Nova for the created nodes in
98       the overcloud. It's accessible via the Nova metadata API. This option is
99       role-specific and is merged with the values given to the ServerMetadata
100       parameter.
101     type: json
102   ServerMetadata:
103     default: {}
104     description: >
105       Extra properties or metadata passed to Nova for the created nodes in
106       the overcloud. It's accessible via the Nova metadata API. This applies to
107       all roles and is merged with a role-specific metadata parameter.
108     type: json
109   {{role.name}}SchedulerHints:
110     type: json
111     description: Optional scheduler hints to pass to nova
112     default: {}
113   NodeIndex:
114     type: number
115     default: 0
116   ServiceConfigSettings:
117     type: json
118     default: {}
119   ServiceNames:
120     type: comma_delimited_list
121     default: []
122   MonitoringSubscriptions:
123     type: comma_delimited_list
124     default: []
125   ServiceMetadataSettings:
126     type: json
127     default: {}
128   ConfigCommand:
129     type: string
130     description: Command which will be run whenever configuration data changes
131     default: os-refresh-config --timeout 14400
132   ConfigCollectSplay:
133     type: number
134     default: 30
135     description: |
136       Maximum amount of time to possibly to delay configuation collection
137       polling. Defaults to 30 seconds. Set to 0 to disable it which will cause
138       the configuration collection to occur as soon as the collection process
139       starts.  This setting is used to prevent the configuration collection
140       processes from polling all at the exact same time.
141   LoggingSources:
142     type: json
143     default: []
144   LoggingGroups:
145     type: comma_delimited_list
146     default: []
147   UpgradeInitCommand:
148     type: string
149     description: |
150       Command or script snippet to run on all overcloud nodes to
151       initialize the upgrade process. E.g. a repository switch.
152     default: ''
153   UpgradeInitCommonCommand:
154     type: string
155     description: |
156       Common commands required by the upgrades process. This should not
157       normally be modified by the operator and is set and unset in the
158       major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml
159       environment files.
160     default: ''
161   DeploymentServerBlacklistDict:
162     default: {}
163     type: json
164     description: >
165       Map of server hostnames to blacklist from any triggered
166       deployments. If the value is 1, the server will be blacklisted. This
167       parameter is generated from the parent template.
168   RoleParameters:
169     type: json
170     description: Role Specific Parameters
171     default: {}
172   DeploymentSwiftDataMap:
173     type: json
174     description: |
175       Map of servers to Swift container and object for storing deployment data.
176       The keys are the Heat assigned hostnames, and the value is a map of the
177       container/object name in Swift. Example value:
178         overcloud-controller-0:
179           container: overcloud-controller
180           object: 0
181         overcloud-controller-1:
182           container: overcloud-controller
183           object: 1
184         overcloud-controller-2:
185           container: overcloud-controller
186           object: 2
187         overcloud-novacompute-0:
188           container: overcloud-compute
189           object: 0
190     default: {}
191
192 conditions:
193   server_not_blacklisted:
194     not:
195       equals:
196         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
197         - 1
198   deployment_swift_data_map_unset:
199     equals:
200       - get_param:
201           - DeploymentSwiftDataMap
202           - {get_param: Hostname}
203       - ""
204
205 resources:
206   {{role.name}}:
207     type: OS::TripleO::{{role.name}}Server
208     metadata:
209       os-collect-config:
210         command: {get_param: ConfigCommand}
211         splay: {get_param: ConfigCollectSplay}
212     properties:
213       image: {get_param: {{role.name}}Image}
214       image_update_policy: {get_param: ImageUpdatePolicy}
215       flavor: {get_param: Overcloud{{role.name}}Flavor}
216       key_name: {get_param: KeyName}
217       networks:
218         - network: ctlplane
219       user_data_format: SOFTWARE_CONFIG
220       user_data: {get_resource: UserData}
221       name:
222         str_replace:
223             template: {get_param: Hostname}
224             params: {get_param: HostnameMap}
225       software_config_transport: {get_param: SoftwareConfigTransport}
226       metadata:
227         map_merge:
228           - {get_param: ServerMetadata}
229           - {get_param: {{role.name}}ServerMetadata}
230           - {get_param: ServiceMetadataSettings}
231       scheduler_hints: {get_param: {{role.name}}SchedulerHints}
232       deployment_swift_data:
233         if:
234           - deployment_swift_data_map_unset
235           - {}
236           - {get_param: [DeploymentSwiftDataMap,
237                          {get_param: Hostname}]}
238
239   # Combine the NodeAdminUserData and NodeUserData mime archives
240   UserData:
241     type: OS::Heat::MultipartMime
242     properties:
243       parts:
244       - config: {get_resource: NodeAdminUserData}
245         type: multipart
246       - config: {get_resource: NodeUserData}
247         type: multipart
248       - config: {get_resource: RoleUserData}
249         type: multipart
250
251   # Creates the "heat-admin" user if configured via the environment
252   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
253   NodeAdminUserData:
254     type: OS::TripleO::NodeAdminUserData
255
256   # For optional operator additional userdata
257   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
258   NodeUserData:
259     type: OS::TripleO::NodeUserData
260
261   # For optional operator role-specific userdata
262   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
263   RoleUserData:
264     type: OS::TripleO::{{role.name}}::NodeUserData
265
266   ExternalPort:
267     type: OS::TripleO::{{role.name}}::Ports::ExternalPort
268     properties:
269       ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
270       IPPool: {get_param: {{role.name}}IPs}
271       NodeIndex: {get_param: NodeIndex}
272
273   InternalApiPort:
274     type: OS::TripleO::{{role.name}}::Ports::InternalApiPort
275     properties:
276       ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
277       IPPool: {get_param: {{role.name}}IPs}
278       NodeIndex: {get_param: NodeIndex}
279
280   StoragePort:
281     type: OS::TripleO::{{role.name}}::Ports::StoragePort
282     properties:
283       ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
284       IPPool: {get_param: {{role.name}}IPs}
285       NodeIndex: {get_param: NodeIndex}
286
287   StorageMgmtPort:
288     type: OS::TripleO::{{role.name}}::Ports::StorageMgmtPort
289     properties:
290       ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
291       IPPool: {get_param: {{role.name}}IPs}
292       NodeIndex: {get_param: NodeIndex}
293
294   TenantPort:
295     type: OS::TripleO::{{role.name}}::Ports::TenantPort
296     properties:
297       ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
298       IPPool: {get_param: {{role.name}}IPs}
299       NodeIndex: {get_param: NodeIndex}
300
301   ManagementPort:
302     type: OS::TripleO::{{role.name}}::Ports::ManagementPort
303     properties:
304       ControlPlaneIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
305       IPPool: {get_param: {{role.name}}IPs}
306       NodeIndex: {get_param: NodeIndex}
307
308   NetworkConfig:
309     type: OS::TripleO::{{role.name}}::Net::SoftwareConfig
310     properties:
311       ControlPlaneIp: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
312       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
313       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
314       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
315       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
316       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
317       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
318
319   NetIpMap:
320     type: OS::TripleO::Network::Ports::NetIpMap
321     properties:
322       ControlPlaneIp: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
323       ExternalIp: {get_attr: [ExternalPort, ip_address]}
324       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
325       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
326       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
327       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
328       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
329       StorageIp: {get_attr: [StoragePort, ip_address]}
330       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
331       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
332       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
333       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
334       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
335       TenantIp: {get_attr: [TenantPort, ip_address]}
336       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
337       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
338       ManagementIp: {get_attr: [ManagementPort, ip_address]}
339       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
340       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
341
342   NetHostMap:
343     type: OS::Heat::Value
344     properties:
345       type: json
346       value:
347         external:
348           fqdn:
349             list_join:
350             - '.'
351             - - {get_attr: [{{role.name}}, name]}
352               - external
353               - {get_param: CloudDomain}
354           short:
355             list_join:
356             - '.'
357             - - {get_attr: [{{role.name}}, name]}
358               - external
359         internal_api:
360           fqdn:
361             list_join:
362             - '.'
363             - - {get_attr: [{{role.name}}, name]}
364               - internalapi
365               - {get_param: CloudDomain}
366           short:
367             list_join:
368             - '.'
369             - - {get_attr: [{{role.name}}, name]}
370               - internalapi
371         storage:
372           fqdn:
373             list_join:
374             - '.'
375             - - {get_attr: [{{role.name}}, name]}
376               - storage
377               - {get_param: CloudDomain}
378           short:
379             list_join:
380             - '.'
381             - - {get_attr: [{{role.name}}, name]}
382               - storage
383         storage_mgmt:
384           fqdn:
385             list_join:
386             - '.'
387             - - {get_attr: [{{role.name}}, name]}
388               - storagemgmt
389               - {get_param: CloudDomain}
390           short:
391             list_join:
392             - '.'
393             - - {get_attr: [{{role.name}}, name]}
394               - storagemgmt
395         tenant:
396           fqdn:
397             list_join:
398             - '.'
399             - - {get_attr: [{{role.name}}, name]}
400               - tenant
401               - {get_param: CloudDomain}
402           short:
403             list_join:
404             - '.'
405             - - {get_attr: [{{role.name}}, name]}
406               - tenant
407         management:
408           fqdn:
409             list_join:
410             - '.'
411             - - {get_attr: [{{role.name}}, name]}
412               - management
413               - {get_param: CloudDomain}
414           short:
415             list_join:
416             - '.'
417             - - {get_attr: [{{role.name}}, name]}
418               - management
419         ctlplane:
420           fqdn:
421             list_join:
422             - '.'
423             - - {get_attr: [{{role.name}}, name]}
424               - ctlplane
425               - {get_param: CloudDomain}
426           short:
427             list_join:
428             - '.'
429             - - {get_attr: [{{role.name}}, name]}
430               - ctlplane
431
432   PreNetworkConfig:
433     type: OS::TripleO::{{role.name}}::PreNetworkConfig
434     properties:
435       server: {get_resource: {{role.name}}}
436       RoleParameters: {get_param: RoleParameters}
437       ServiceNames: {get_param: ServiceNames}
438
439   NetworkDeployment:
440     type: OS::TripleO::SoftwareDeployment
441     depends_on: PreNetworkConfig
442     properties:
443       name: NetworkDeployment
444       config: {get_resource: NetworkConfig}
445       server: {get_resource: {{role.name}}}
446       actions: {get_param: NetworkDeploymentActions}
447       input_values:
448         bridge_name: {get_param: NeutronPhysicalBridge}
449         interface_name: {get_param: NeutronPublicInterface}
450       actions:
451         if:
452           - server_not_blacklisted
453           - {get_param: NetworkDeploymentActions}
454           - []
455
456   {{role.name}}UpgradeInitConfig:
457     type: OS::Heat::SoftwareConfig
458     properties:
459       group: script
460       config:
461         list_join:
462         - ''
463         - - "#!/bin/bash\n\n"
464           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
465           - get_param: UpgradeInitCommand
466           - get_param: UpgradeInitCommonCommand
467
468   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
469   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
470   {{role.name}}UpgradeInitDeployment:
471     type: OS::Heat::SoftwareDeployment
472     depends_on: NetworkDeployment
473     properties:
474       name: {{role.name}}UpgradeInitDeployment
475       server: {get_resource: {{role.name}}}
476       config: {get_resource: {{role.name}}UpgradeInitConfig}
477       actions:
478         if:
479           - server_not_blacklisted
480           - ['CREATE', 'UPDATE']
481           - []
482
483   {{role.name}}Deployment:
484     type: OS::Heat::StructuredDeployment
485     depends_on: {{role.name}}UpgradeInitDeployment
486     properties:
487       name: {{role.name}}Deployment
488       config: {get_resource: {{role.name}}Config}
489       server: {get_resource: {{role.name}}}
490       input_values:
491         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
492       actions:
493         if:
494           - server_not_blacklisted
495           - ['CREATE', 'UPDATE']
496           - []
497
498   {{role.name}}Config:
499     type: OS::Heat::StructuredConfig
500     properties:
501       group: hiera
502       config:
503         hierarchy:
504           - '"%{::uuid}"'
505           - heat_config_%{::deploy_config_name}
506           - config_step
507           - {{role.name.lower()}}_extraconfig
508           - extraconfig
509           - service_names
510           - service_configs
511           - {{role.name.lower()}}
512           - bootstrap_node # provided by allNodesConfig
513           - all_nodes # provided by allNodesConfig
514           - vip_data # provided by allNodesConfig
515           - '"%{::osfamily}"'
516         merge_behavior: deeper
517         datafiles:
518           service_names:
519             service_names: {get_param: ServiceNames}
520             sensu::subscriptions: {get_param: MonitoringSubscriptions}
521           service_configs:
522             map_replace:
523               - {get_param: ServiceConfigSettings}
524               - values: {get_attr: [NetIpMap, net_ip_map]}
525           {{role.name.lower()}}_extraconfig: {get_param: {{role.name}}ExtraConfig}
526           extraconfig: {get_param: ExtraConfig}
527           {{role.name.lower()}}:
528             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
529             tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: LoggingSources}
530             tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: LoggingGroups}
531             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
532             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
533             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
534             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
535             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
536             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
537             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
538
539   # Resource for site-specific injection of root certificate
540   NodeTLSCAData:
541     depends_on: {{role.name}}Deployment
542     type: OS::TripleO::NodeTLSCAData
543     properties:
544       server: {get_resource: {{role.name}}}
545
546   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
547   {{role.name}}ExtraConfigPre:
548     depends_on: {{role.name}}Deployment
549     type: OS::TripleO::{{role.name}}ExtraConfigPre
550     properties:
551         server: {get_resource: {{role.name}}}
552
553   # Hook for site-specific additional pre-deployment config,
554   # applying to all nodes, e.g node registration/unregistration
555   NodeExtraConfig:
556     depends_on: [{{role.name}}ExtraConfigPre, NodeTLSCAData]
557     type: OS::TripleO::NodeExtraConfig
558     properties:
559         server: {get_resource: {{role.name}}}
560
561   UpdateConfig:
562     type: OS::TripleO::Tasks::PackageUpdate
563
564   UpdateDeployment:
565     type: OS::Heat::SoftwareDeployment
566     depends_on: NetworkDeployment
567     properties:
568       name: UpdateDeployment
569       config: {get_resource: UpdateConfig}
570       server: {get_resource: {{role.name}}}
571       input_values:
572         update_identifier:
573           get_param: UpdateIdentifier
574       actions:
575         if:
576           - server_not_blacklisted
577           - ['CREATE', 'UPDATE']
578           - []
579
580   SshHostPubKey:
581     type: OS::TripleO::Ssh::HostPubKey
582     depends_on: {{role.name}}Deployment
583     properties:
584         server: {get_resource: {{role.name}}}
585
586 outputs:
587   ip_address:
588     description: IP address of the server in the ctlplane network
589     value: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
590   hostname:
591     description: Hostname of the server
592     value: {get_attr: [{{role.name}}, name]}
593   hostname_map:
594     description: Mapping of network names to hostnames
595     value:
596       external: {get_attr: [NetHostMap, value, external, fqdn]}
597       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
598       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
599       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
600       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
601       management: {get_attr: [NetHostMap, value, management, fqdn]}
602       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
603   hosts_entry:
604     value:
605       str_replace:
606         template: |
607           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
608           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
609           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
610           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
611           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
612           TENANTIP TENANTHOST.DOMAIN TENANTHOST
613           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
614           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
615         params:
616           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role.name}}HostnameResolveNetwork]}]}
617           DOMAIN: {get_param: CloudDomain}
618           PRIMARYHOST: {get_attr: [{{role.name}}, name]}
619           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
620           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
621           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
622           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
623           STORAGEIP: {get_attr: [StoragePort, ip_address]}
624           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
625           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
626           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
627           TENANTIP: {get_attr: [TenantPort, ip_address]}
628           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
629           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
630           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
631           CTLPLANEIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
632           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
633   known_hosts_entry:
634     description: Entry for ssh known hosts
635     value:
636       str_replace:
637         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
638 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
639 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
640 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
641 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
642 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
643 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
644 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
645         params:
646           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role.name}}HostnameResolveNetwork]}]}
647           DOMAIN: {get_param: CloudDomain}
648           PRIMARYHOST: {get_attr: [{{role.name}}, name]}
649           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
650           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
651           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
652           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
653           STORAGEIP: {get_attr: [StoragePort, ip_address]}
654           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
655           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
656           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
657           TENANTIP: {get_attr: [TenantPort, ip_address]}
658           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
659           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
660           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
661           CTLPLANEIP: {get_attr: [{{role.name}}, networks, ctlplane, 0]}
662           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
663           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
664   nova_server_resource:
665     description: Heat resource handle for {{role.name}} server
666     value:
667       {get_resource: {{role.name}}}
668     condition: server_not_blacklisted
669   external_ip_address:
670     description: IP address of the server in the external network
671     value: {get_attr: [ExternalPort, ip_address]}
672   internal_api_ip_address:
673     description: IP address of the server in the internal_api network
674     value: {get_attr: [InternalApiPort, ip_address]}
675   storage_ip_address:
676     description: IP address of the server in the storage network
677     value: {get_attr: [StoragePort, ip_address]}
678   storage_mgmt_ip_address:
679     description: IP address of the server in the storage_mgmt network
680     value: {get_attr: [StorageMgmtPort, ip_address]}
681   tenant_ip_address:
682     description: IP address of the server in the tenant network
683     value: {get_attr: [TenantPort, ip_address]}
684   management_ip_address:
685     description: IP address of the server in the management network
686     value: {get_attr: [ManagementPort, ip_address]}
687   os_collect_config:
688     description: The os-collect-config configuration associated with this server resource
689     value: {get_attr: [{{role.name}}, os_collect_config]}