Merge "Add parameters to run nova over httpd"
[apex-tripleo-heat-templates.git] / puppet / all-nodes-config.yaml
1 heat_template_version: 2016-10-14
2 description: 'All Nodes Config for Puppet'
3
4 parameters:
5   cloud_name_external:
6     type: string
7   cloud_name_internal_api:
8     type: string
9   cloud_name_storage:
10     type: string
11   cloud_name_storage_mgmt:
12     type: string
13   cloud_name_ctlplane:
14     type: string
15   hosts:
16     type: comma_delimited_list
17   # FIXME(shardy) this can be comma_delimited_list when
18   # https://bugs.launchpad.net/heat/+bug/1617019 is fixed
19   enabled_services:
20     type: string
21   controller_ips:
22     type: comma_delimited_list
23   logging_groups:
24     type: json
25   logging_sources:
26     type: json
27   service_ips:
28     type: json
29   service_node_names:
30     type: json
31   short_service_node_names:
32     type: json
33   controller_names:
34     type: comma_delimited_list
35   memcache_node_ips:
36     type: comma_delimited_list
37   NetVipMap:
38     type: json
39   RedisVirtualIP:
40     type: string
41     default: ''
42   ServiceNetMap:
43     type: json
44   DeployIdentifier:
45     type: string
46     default: ''
47     description: >
48       Setting this to a unique value will re-run any deployment tasks which
49       perform configuration on a Heat stack-update.
50   UpdateIdentifier:
51     type: string
52     description: >
53       Setting to a previously unused value during stack-update will trigger
54       package update on all nodes
55   StackAction:
56     type: string
57     description: >
58       Heat action on performed top-level stack.
59     constraints:
60     - allowed_values: ['CREATE', 'UPDATE']
61   # NOTE(jaosorior): This is being set as IPA as it's the first
62   # CA we'll actually be testing out. But we can change this if
63   # people request it.
64   CertmongerCA:
65     type: string
66     default: 'IPA'
67
68 resources:
69
70   allNodesConfigImpl:
71     type: OS::Heat::StructuredConfig
72     properties:
73       group: os-apply-config
74       config:
75         hosts:
76           list_join:
77           - "\n"
78           - {get_param: hosts}
79         hiera:
80           datafiles:
81             bootstrap_node:
82               mapped_data:
83                 bootstrap_nodeid: {get_input: bootstrap_nodeid}
84                 bootstrap_nodeid_ip: {get_input: bootstrap_nodeid_ip}
85             all_nodes:
86               mapped_data:
87                 map_merge:
88                   - tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: logging_sources}
89                   - tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: logging_groups}
90                   - enabled_services: {get_param: enabled_services}
91                   # This writes out a mapping of service_name_enabled: 'true'
92                   # For any services not enabled, hiera foo_enabled will
93                   # return nil, as it's undefined
94                   - map_merge:
95                       repeat:
96                         template:
97                           # Note this must be string 'true' due to
98                           # https://bugs.launchpad.net/heat/+bug/1617203
99                           SERVICE_enabled: 'true'
100                         for_each:
101                           SERVICE:
102                             str_split: [',', {get_param: enabled_services}]
103                   # Dynamically generate per-service network data
104                   # This works as follows (outer->inner functions)
105                   # yaql - filters services where no mapping exists in ServiceNetMap
106                   #   map_replace: substitute e.g heat_api_network with network name from ServiceNetMap
107                   #     map_merge/repeat: generate a per-service mapping
108                   - yaql:
109                       # This filters any entries where the value hasn't been substituted for
110                       # a list, e.g it's still $service_network.  This happens when there is
111                       # no network defined for the service in the ServiceNetMap, which is OK
112                       # as not all services have to be bound to a network, so we filter them
113                       expression: dict($.data.map.items().where(isString($[1]) and not $[1].endsWith("_network")))
114                       data:
115                         map:
116                           map_replace:
117                             - map_merge:
118                                 repeat:
119                                   template:
120                                     SERVICE_network: SERVICE_network
121                                   for_each:
122                                     SERVICE:
123                                       str_split: [',', {get_param: enabled_services}]
124                             - values: {get_param: ServiceNetMap}
125                   # Keystone doesn't provide separate entries for the public
126                   # and admin endpoints, so we need to add them here manually
127                   # like we do in the vip-config below
128                   - keystone_admin_api_network: {get_param: [ServiceNetMap, keystone_admin_api_network]}
129                     keystone_public_api_network: {get_param: [ServiceNetMap, keystone_public_api_network]}
130                   # provides a mapping of service_name_ips to a list of IPs
131                   - {get_param: service_ips}
132                   - {get_param: service_node_names}
133                   - {get_param: short_service_node_names}
134                   - controller_node_ips:
135                       list_join:
136                       - ','
137                       - {get_param: controller_ips}
138                     controller_node_names:
139                       list_join:
140                       - ','
141                       - {get_param: controller_names}
142                     memcached_node_ips_v6:
143                       str_replace:
144                         template: "['inet6:[SERVERS_LIST]']"
145                         params:
146                           SERVERS_LIST:
147                             list_join:
148                             - "]','inet6:["
149                             - {get_param: memcache_node_ips}
150
151                     deploy_identifier: {get_param: DeployIdentifier}
152                     update_identifier: {get_param: UpdateIdentifier}
153                     stack_action: {get_param: StackAction}
154             vip_data:
155               mapped_data:
156                 map_merge:
157                   # Dynamically generate per-service VIP data based on enabled_services
158                   # This works as follows (outer->inner functions)
159                   # yaql - filters services where no mapping exists in ServiceNetMap
160                   #   map_replace: substitute e.g internal_api with the IP from NetVipMap
161                   #     map_replace: substitute e.g heat_api_network with network name from ServiceNetMap
162                   #       map_merge/repeat: generate a per-service mapping
163                   - yaql:
164                       # This filters any entries where the value hasn't been substituted for
165                       # a list, e.g it's still $service_network.  This happens when there is
166                       # no network defined for the service in the ServiceNetMap, which is OK
167                       # as not all services have to be bound to a network, so we filter them
168                       expression: dict($.data.map.items().where(isString($[1]) and not $[1].endsWith("_network")))
169                       data:
170                         map:
171                           map_replace:
172                             - map_replace:
173                                 - map_merge:
174                                     repeat:
175                                       template:
176                                         SERVICE_vip: SERVICE_network
177                                       for_each:
178                                         SERVICE:
179                                           str_split: [',', {get_param: enabled_services}]
180                                 - values: {get_param: ServiceNetMap}
181                             - values: {get_param: NetVipMap}
182                   - keystone_admin_api_vip:
183                       get_param: [NetVipMap, {get_param: [ServiceNetMap, keystone_admin_api_network]}]
184                     keystone_public_api_vip:
185                       get_param: [NetVipMap, {get_param: [ServiceNetMap, keystone_public_api_network]}]
186                     public_virtual_ip: {get_param: [NetVipMap, external]}
187                     controller_virtual_ip: {get_param: [NetVipMap, ctlplane]}
188                     internal_api_virtual_ip: {get_param: [NetVipMap, internal_api]}
189                     storage_virtual_ip: {get_param: [NetVipMap, storage]}
190                     storage_mgmt_virtual_ip: {get_param: [NetVipMap, storage_mgmt]}
191                     redis_vip: {get_param: RedisVirtualIP}
192                     # public_virtual_ip and controller_virtual_ip are needed in
193                     # both HAproxy & keepalived.
194                     tripleo::haproxy::public_virtual_ip: {get_param: [NetVipMap, external]}
195                     tripleo::haproxy::controller_virtual_ip: {get_param: [NetVipMap, ctlplane]}
196                     tripleo::keepalived::public_virtual_ip: {get_param: [NetVipMap, external]}
197                     tripleo::keepalived::controller_virtual_ip: {get_param: [NetVipMap, ctlplane]}
198                     tripleo::keepalived::internal_api_virtual_ip: {get_param: [NetVipMap, internal_api]}
199                     tripleo::keepalived::storage_virtual_ip: {get_param: [NetVipMap, storage]}
200                     tripleo::keepalived::storage_mgmt_virtual_ip: {get_param: [NetVipMap, storage_mgmt]}
201                     tripleo::keepalived::redis_virtual_ip: {get_param: RedisVirtualIP}
202                     tripleo::redis_notification::haproxy_monitor_ip: {get_param: [NetVipMap, ctlplane]}
203                     cloud_name_external: {get_param: cloud_name_external}
204                     cloud_name_internal_api: {get_param: cloud_name_internal_api}
205                     cloud_name_storage: {get_param: cloud_name_storage}
206                     cloud_name_storage_mgmt: {get_param: cloud_name_storage_mgmt}
207                     cloud_name_ctlplane: {get_param: cloud_name_ctlplane}
208                     # TLS parameters
209                     certmonger_ca: {get_param: CertmongerCA}
210
211 outputs:
212   config_id:
213     description: The ID of the allNodesConfigImpl resource.
214     value:
215       {get_resource: allNodesConfigImpl}
216   hosts_entries:
217     description: |
218       The content that should be appended to your /etc/hosts if you want to get
219       hostname-based access to the deployed nodes (useful for testing without
220       setting up a DNS).
221     value: {get_attr: [allNodesConfigImpl, config, hosts]}