Heat templates for deploying OpenStack
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

overcloud.j2.yaml 41KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143
  1. {%- set primary_role = [roles[0]] -%}
  2. {%- for role in roles -%}
  3. {%- if 'primary' in role.tags and 'controller' in role.tags -%}
  4. {%- set _ = primary_role.pop() -%}
  5. {%- set _ = primary_role.append(role) -%}
  6. {%- endif -%}
  7. {%- endfor -%}
  8. {%- set primary_role_name = primary_role[0].name -%}
  9. # primary role is: {{primary_role_name}}
  10. heat_template_version: rocky
  11. description: >
  12. Deploy an OpenStack environment, consisting of several node types (roles),
  13. Controller, Compute, BlockStorage, SwiftStorage and CephStorage. The Storage
  14. roles enable independent scaling of the storage components, but the minimal
  15. deployment is one Controller and one Compute node.
  16. # TODO(shadower): we should probably use the parameter groups to put
  17. # some order in here.
  18. parameters:
  19. # Common parameters (not specific to a role)
  20. {%- for network in networks if network.vip|default(false) %}
  21. {%- if network.name == 'External' %}
  22. # Special case the External hostname param, which is CloudName
  23. CloudName:
  24. default: overcloud.localdomain
  25. description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
  26. type: string
  27. {%- elif network.name == 'InternalApi' %}
  28. # Special case the Internal API hostname param, which is CloudNameInternal
  29. CloudNameInternal:
  30. default: overcloud.{{network.name.lower()}}.localdomain
  31. description: >
  32. The DNS name of this cloud's {{network.name_lower}} endpoint. E.g.
  33. 'ci-overcloud.{{network.name.lower()}}.tripleo.org'.
  34. type: string
  35. {%- elif network.name == 'StorageMgmt' %}
  36. # Special case StorageMgmt hostname param, which is CloudNameStorageManagement
  37. CloudNameStorageManagement:
  38. default: overcloud.{{network.name.lower()}}.localdomain
  39. description: >
  40. The DNS name of this cloud's {{network.name_lower}} endpoint. E.g.
  41. 'ci-overcloud.{{network.name.lower()}}.tripleo.org'.
  42. type: string
  43. {%- else %}
  44. CloudName{{network.name}}:
  45. default: overcloud.{{network.name.lower()}}.localdomain
  46. description: >
  47. The DNS name of this cloud's {{network.name_lower}} endpoint. E.g.
  48. 'ci-overcloud.{{network.name.lower()}}.tripleo.org'.
  49. type: string
  50. {%- endif %}
  51. {%- endfor %}
  52. CloudNameCtlplane:
  53. default: overcloud.ctlplane.localdomain
  54. description: >
  55. The DNS name of this cloud's provisioning network endpoint. E.g.
  56. 'ci-overcloud.ctlplane.tripleo.org'.
  57. type: string
  58. ExtraHostFileEntries:
  59. default: []
  60. description: List of extra hosts entries to be appended to /etc/hosts
  61. type: comma_delimited_list
  62. EndpointMapOverride:
  63. default: {}
  64. description: Can be used to override the calcluated EndpointMap
  65. type: json
  66. ExtraConfig:
  67. default: {}
  68. description: |
  69. Additional hiera configuration to inject into the cluster.
  70. type: json
  71. {%- for role in roles %}
  72. {{role.name}}ExtraConfig:
  73. default: {}
  74. description: |
  75. Role specific additional hiera configuration to inject into the cluster.
  76. type: json
  77. {%- if role.deprecated_param_extraconfig is defined %}
  78. {{role.deprecated_param_extraconfig}}:
  79. default: {}
  80. description: |
  81. DEPRECATED use {{role.name}}ExtraConfig instead
  82. type: json
  83. {%- endif %}
  84. {%- endfor %}
  85. NeutronControlPlaneID:
  86. default: 'ctlplane'
  87. type: string
  88. description: Neutron ID or name for ctlplane network.
  89. NeutronPublicInterface:
  90. default: nic1
  91. description: Which interface to add to the NeutronPhysicalBridge.
  92. type: string
  93. ControlPlaneSubnet:
  94. description: The name of the undercloud Neutron control plane subnet
  95. default: ctlplane-subnet
  96. type: string
  97. ControlPlaneSubnetCidr:
  98. default: ''
  99. description: >
  100. The subnet CIDR of the control plane network. (The parameter is
  101. automatically resolved from the ctlplane subnet's cidr attribute.)
  102. type: string
  103. ControlFixedIPs:
  104. default: []
  105. description: >
  106. Control the IP allocation for the ControlVirtualIP port. E.g.
  107. [{'ip_address':'1.2.3.4'}]
  108. type: json
  109. # TODO (dsneddon) Legacy name, eventually refactor to match network name
  110. PublicVirtualFixedIPs:
  111. default: []
  112. description: >
  113. Control the IP allocation for the PublicVirtualInterface port. E.g.
  114. [{'ip_address':'1.2.3.4'}]
  115. type: json
  116. {%- for network in networks if network.vip|default(false) and network.name != 'External' %}
  117. {{network.name}}VirtualFixedIPs:
  118. default: []
  119. description: >
  120. Control the IP allocation for the {{network.name}}VirtualInterface port. E.g.
  121. [{'ip_address':'1.2.3.4'}]
  122. type: json
  123. {%- endfor %}
  124. RabbitCookieSalt:
  125. type: string
  126. default: unset
  127. description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
  128. RedisVirtualFixedIPs:
  129. default: []
  130. description: >
  131. Control the IP allocation for the virtual IP used by Redis. E.g.
  132. [{'ip_address':'1.2.3.4'}]
  133. type: json
  134. CloudDomain:
  135. default: 'localdomain'
  136. type: string
  137. description: >
  138. The DNS domain used for the hosts. This must match the
  139. overcloud_domain_name configured on the undercloud.
  140. ServerMetadata:
  141. default: {}
  142. description: >
  143. Extra properties or metadata passed to Nova for the created nodes in
  144. the overcloud. It's accessible via the Nova metadata API.
  145. type: json
  146. # Compute-specific params
  147. # FIXME(shardy) handle these deprecated names as they don't match compute.yaml
  148. HypervisorNeutronPhysicalBridge:
  149. default: 'br-ex'
  150. description: >
  151. An OVS bridge to create on each hypervisor. This defaults to br-ex the
  152. same as the control plane nodes, as we have a uniform configuration of
  153. the openvswitch agent. Typically should not need to be changed.
  154. type: string
  155. HypervisorNeutronPublicInterface:
  156. default: nic1
  157. description: What interface to add to the HypervisorNeutronPhysicalBridge.
  158. type: string
  159. NodeCreateBatchSize:
  160. default: 30
  161. description: Maxiumum batch size for creating nodes
  162. type: number
  163. # Jinja loop for Role in role_data.yaml
  164. {% for role in roles %}
  165. # Parameters generated for {{role.name}} Role
  166. {{role.name}}Services:
  167. description: A list of service resources (configured in the Heat
  168. resource_registry) which represent nested stacks
  169. for each service that should get installed on the {{role.name}} role.
  170. type: comma_delimited_list
  171. {{role.name}}Count:
  172. description: Number of {{role.name}} nodes to deploy
  173. type: number
  174. default: {{role.CountDefault|default(0)}}
  175. {{role.name}}HostnameFormat:
  176. type: string
  177. description: >
  178. Format for {{role.name}} node hostnames
  179. Note %index% is translated into the index of the node, e.g 0/1/2 etc
  180. and %stackname% is replaced with the stack name e.g overcloud
  181. {% if role.HostnameFormatDefault %}
  182. default: "{{role.HostnameFormatDefault}}"
  183. {% else %}
  184. default: "%stackname%-{{role.name.lower()}}-%index%"
  185. {% endif %}
  186. {{role.name}}RemovalPolicies:
  187. default: []
  188. type: json
  189. description: >
  190. List of resources to be removed from {{role.name}} ResourceGroup when
  191. doing an update which requires removal of specific resources.
  192. Example format ComputeRemovalPolicies: [{'resource_list': ['0']}]
  193. {{role.name}}SchedulerHints:
  194. type: json
  195. description: Optional scheduler hints to pass to nova
  196. default: {}
  197. {%- if role.deprecated_param_scheduler_hints is defined %}
  198. {{role.deprecated_param_scheduler_hints}}:
  199. type: json
  200. description: DEPRECATED - use {{role.name}}SchedulerHints instead
  201. default: {}
  202. {%- endif %}
  203. {{role.name}}Parameters:
  204. type: json
  205. description: Optional Role Specific parameters to be provided to service
  206. default: {}
  207. {% endfor %}
  208. # Identifiers to trigger tasks on nodes
  209. UpdateIdentifier:
  210. default: ''
  211. type: string
  212. description: >
  213. Setting to a previously unused value during stack-update will trigger
  214. package update on all nodes
  215. DeployIdentifier:
  216. default: ''
  217. type: string
  218. description: >
  219. Setting this to a unique value will re-run any deployment tasks which
  220. perform configuration on a Heat stack-update.
  221. AddVipsToEtcHosts:
  222. default: True
  223. type: boolean
  224. description: >
  225. Set to true to append per network Vips to /etc/hosts on each node.
  226. DeploymentServerBlacklist:
  227. default: []
  228. type: comma_delimited_list
  229. description: >
  230. List of server hostnames to blacklist from any triggered deployments.
  231. {% for role in roles %}
  232. {%- if role.deprecated_param_scheduler_hints is defined or role.deprecated_param_extraconfig is defined %}
  233. {%- if not parameter_groups_defined|default(false) %}
  234. parameter_groups:
  235. - label: deprecated
  236. description: Do not use deprecated params, they will be removed.
  237. parameters:
  238. {%- set parameter_groups_defined = true %}
  239. {%- endif %}
  240. {%- endif %}
  241. {%- if role.deprecated_param_scheduler_hints is defined %}
  242. - {{role.deprecated_param_scheduler_hints}}
  243. {%- endif %}
  244. {%- if role.deprecated_param_extraconfig is defined %}
  245. - {{role.deprecated_param_extraconfig}}
  246. {%- endif %}
  247. {%- endfor %}
  248. conditions:
  249. add_vips_to_etc_hosts: {equals : [{get_param: AddVipsToEtcHosts}, True]}
  250. control_fixed_ip_not_set: {equals : [{get_param: ControlFixedIPs}, []]}
  251. ctlplane_subnet_cidr_set:
  252. not:
  253. equals: [{get_param: ControlPlaneSubnetCidr}, '']
  254. {%- for network in networks if network.name != 'External' %}
  255. {{network.name_lower}}_virtual_fixed_ip_set:
  256. not:
  257. equals:
  258. - get_param: {{network.name}}VirtualFixedIPs
  259. - []
  260. {%- endfor %}
  261. public_virtual_fixed_ip_set:
  262. not:
  263. equals:
  264. - get_param: PublicVirtualFixedIPs
  265. - []
  266. redis_virtual_fixed_ip_set:
  267. not:
  268. equals:
  269. - get_param: RedisVirtualFixedIPs
  270. - []
  271. resources:
  272. VipHosts:
  273. type: OS::Heat::Value
  274. properties:
  275. type: string
  276. value:
  277. list_join:
  278. - "\n"
  279. - - str_replace:
  280. template: IP HOST
  281. params:
  282. IP: {get_attr: [VipMap, net_ip_map, ctlplane]}
  283. HOST: {get_param: CloudNameCtlplane}
  284. {%- for network in networks if network.vip|default(false) %}
  285. {%- if network.name == 'External' %}
  286. # Special case the External hostname param, which is CloudName
  287. - str_replace:
  288. template: IP HOST
  289. params:
  290. IP: {get_attr: [VipMap, net_ip_map, {{network.name_lower}}]}
  291. HOST: {get_param: CloudName}
  292. {%- elif network.name == 'InternalApi' %}
  293. # Special case the Internal API hostname param, which is CloudNameInternal
  294. - str_replace:
  295. template: IP HOST
  296. params:
  297. IP: {get_attr: [VipMap, net_ip_map, {{network.name_lower}}]}
  298. HOST: {get_param: CloudNameInternal}
  299. {%- elif network.name == 'StorageMgmt' %}
  300. # Special case StorageMgmt hostname param, which is CloudNameStorageManagement
  301. - str_replace:
  302. template: IP HOST
  303. params:
  304. IP: {get_attr: [VipMap, net_ip_map, {{network.name_lower}}]}
  305. HOST: {get_param: CloudNameStorageManagement}
  306. {%- else %}
  307. - str_replace:
  308. template: IP HOST
  309. params:
  310. IP: {get_attr: [VipMap, net_ip_map, {{network.name_lower}}]}
  311. HOST: {get_param: CloudName{{network.name}}}
  312. {%- endif %}
  313. {%- endfor %}
  314. HeatAuthEncryptionKey:
  315. type: OS::TripleO::RandomString
  316. PcsdPassword:
  317. type: OS::TripleO::RandomString
  318. properties:
  319. length: 16
  320. HorizonSecret:
  321. type: OS::TripleO::RandomString
  322. properties:
  323. length: 64
  324. NetCidrMapValue:
  325. type: OS::Heat::Value
  326. properties:
  327. type: json
  328. value:
  329. map_replace:
  330. - map_merge:
  331. - {get_attr: [Networks, net_cidr_map]}
  332. - ctlplane: {get_attr: [ControlVirtualIP, subnets, 0, cidr]}
  333. - keys:
  334. ctlplane: {get_param: NeutronControlPlaneID}
  335. values:
  336. disabled: {get_attr: [ControlVirtualIP, subnets, 0, cidr]}
  337. ServiceNetMap:
  338. type: OS::TripleO::ServiceNetMap
  339. EndpointMap:
  340. type: OS::TripleO::EndpointMap
  341. properties:
  342. CloudEndpoints:
  343. ctlplane: {get_param: CloudNameCtlplane}
  344. {%- for network in networks if network.vip|default(false) %}
  345. {%- if network.name == 'External' %}
  346. # Special case the External hostname param, which is CloudName
  347. {{network.name_lower}}: {get_param: CloudName}
  348. {%- elif network.name == 'InternalApi' %}
  349. # Special case the Internal API hostname param, which is CloudNameInternal
  350. {{network.name_lower}}: {get_param: CloudNameInternal}
  351. {%- elif network.name == 'StorageMgmt' %}
  352. # Special case StorageMgmt hostname param, which is CloudNameStorageManagement
  353. {{network.name_lower}}: {get_param: CloudNameStorageManagement}
  354. {%- else %}
  355. {{network.name_lower}}: {get_param: CloudName{{network.name}}}
  356. {%- endif %}
  357. {%- endfor %}
  358. NetIpMap: {get_attr: [VipMap, net_ip_map]}
  359. ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
  360. EndpointMapData:
  361. type: OS::Heat::Value
  362. properties:
  363. type: json
  364. value:
  365. map_merge:
  366. - {get_attr: [EndpointMap, endpoint_map]}
  367. - {get_param: EndpointMapOverride}
  368. SshKnownHostsConfig:
  369. type: OS::TripleO::Ssh::KnownHostsConfig
  370. properties:
  371. known_hosts:
  372. list_join:
  373. - ''
  374. {% for role in roles %}
  375. - {get_attr: [{{role.name}}, known_hosts_entry]}
  376. {% endfor %}
  377. SshKnownHostsHostnames:
  378. type: OS::Heat::Value
  379. properties:
  380. value:
  381. map_merge:
  382. list_concat:
  383. {% for role in roles %}
  384. - {get_attr: [{{role.name}}, known_hosts_hostnames]}
  385. {% endfor %}
  386. # Creates the "heat-admin" user if configured via the environment
  387. # Should return a OS::Heat::MultipartMime reference via OS::stack_id
  388. NodeAdminUserData:
  389. type: OS::TripleO::NodeAdminUserData
  390. # For optional operator additional userdata
  391. # Should return a OS::Heat::MultipartMime reference via OS::stack_id
  392. NodeUserData:
  393. type: OS::TripleO::NodeUserData
  394. # Jinja loop for Role in roles_data.yaml
  395. {% for role in roles %}
  396. # Resources generated for {{role.name}} Role
  397. {{role.name}}ServiceChain:
  398. type: OS::TripleO::Services
  399. properties:
  400. Services:
  401. get_param: {{role.name}}Services
  402. ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
  403. ServiceData:
  404. net_cidr_map: {get_attr: [NetCidrMapValue, value]}
  405. EndpointMap: {get_attr: [EndpointMapData, value]}
  406. DefaultPasswords: {get_attr: [DefaultPasswords, passwords]}
  407. RoleName: {{role.name}}
  408. RoleParameters:
  409. map_merge:
  410. - {{role.RoleParametersDefault|default({})}}
  411. - get_param: {{role.name}}Parameters
  412. # Lookup of role_data via heat outputs is slow, so workaround this by caching
  413. # the value in an OS::Heat::Value resource
  414. {{role.name}}ServiceChainRoleData:
  415. type: OS::Heat::Value
  416. properties:
  417. type: json
  418. value: {get_attr: [{{role.name}}ServiceChain, role_data]}
  419. {{role.name}}ServiceConfigSettings:
  420. type: OS::Heat::Value
  421. properties:
  422. type: json
  423. value:
  424. map_merge:
  425. - get_attr: [{{role.name}}ServiceChainRoleData, value, config_settings]
  426. {% for r in roles %}
  427. - get_attr: [{{r.name}}ServiceChainRoleData, value, global_config_settings]
  428. {% endfor %}
  429. # This next step combines two yaql passes:
  430. # - The inner one does a deep merge on the service_config_settings for all roles
  431. # - The outer one filters the map based on the services enabled for the role
  432. # then merges the result into one map.
  433. - yaql:
  434. expression: let(root => $) -> $.data.map.items().where($[0] in coalesce($root.data.services, [])).select($[1]).reduce($1.mergeWith($2), {})
  435. data:
  436. map:
  437. yaql:
  438. expression: $.data.where($ != null).reduce($1.mergeWith($2), {})
  439. data:
  440. {% for r in roles %}
  441. - get_attr: [{{r.name}}ServiceChainRoleData, value, service_config_settings]
  442. {% endfor %}
  443. services: {get_attr: [{{role.name}}ServiceNames, value]}
  444. {{role.name}}MergedConfigSettings:
  445. type: OS::Heat::Value
  446. properties:
  447. type: json
  448. value:
  449. config_settings: {}
  450. global_config_settings: {}
  451. service_config_settings: {}
  452. merged_config_settings:
  453. map_merge:
  454. - get_attr: [{{role.name}}ServiceConfigSettings, value]
  455. - get_param: ExtraConfig
  456. {%- if role.deprecated_param_extraconfig is defined %}
  457. - get_param: {{role.deprecated_param_extraconfig}}
  458. {%- endif %}
  459. - get_param: {{role.name}}ExtraConfig
  460. # Filter any null/None service_names which may be present due to mapping
  461. # of services to OS::Heat::None
  462. {{role.name}}ServiceNames:
  463. type: OS::Heat::Value
  464. depends_on: {{role.name}}ServiceChain
  465. properties:
  466. type: comma_delimited_list
  467. value:
  468. yaql:
  469. expression: coalesce($.data, []).where($ != null)
  470. data: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_names]}
  471. {{role.name}}HostsDeployment:
  472. type: OS::Heat::StructuredDeployments
  473. properties:
  474. name: {{role.name}}HostsDeployment
  475. config: {get_attr: [hostsConfig, config_id]}
  476. servers: {get_attr: [{{role.name}}Servers, value]}
  477. {{role.name}}SshKnownHostsDeployment:
  478. type: OS::TripleO::Ssh::KnownHostsDeployment
  479. properties:
  480. name: {{role.name}}SshKnownHostsDeployment
  481. config: {get_resource: SshKnownHostsConfig}
  482. servers: {get_attr: [{{role.name}}Servers, value]}
  483. {{role.name}}AllNodesDeployment:
  484. type: OS::TripleO::AllNodesDeployment
  485. depends_on:
  486. {% for role_inner in roles %}
  487. - {{role_inner.name}}HostsDeployment
  488. - {{role_inner.name}}SshKnownHostsDeployment
  489. {% endfor %}
  490. properties:
  491. name: {{role.name}}AllNodesDeployment
  492. config: {get_attr: [allNodesConfig, config_id]}
  493. servers: {get_attr: [{{role.name}}Servers, value]}
  494. input_values:
  495. # Note we have to use yaql to look up the first hostname/ip in the
  496. # list because heat path based attributes operate on the attribute
  497. # inside the ResourceGroup, not the exposed list ref discussion in
  498. # https://bugs.launchpad.net/heat/+bug/1640488
  499. # The coalesce is needed because $.data is None during heat validation
  500. bootstrap_nodeid:
  501. yaql:
  502. expression: coalesce($.data, []).first(null)
  503. data: {get_attr: [{{role.name}}, hostname]}
  504. {{role.name}}AllNodesValidationDeployment:
  505. type: OS::Heat::StructuredDeployments
  506. depends_on: {{role.name}}AllNodesDeployment
  507. properties:
  508. name: {{role.name}}AllNodesValidationDeployment
  509. config: {get_resource: {{role.name}}AllNodesValidationConfig}
  510. servers: {get_attr: [{{role.name}}Servers, value]}
  511. {{role.name}}IpListMap:
  512. type: OS::TripleO::Network::Ports::NetIpListMap
  513. properties:
  514. ControlPlaneIpList: {get_attr: [{{role.name}}, ip_address]}
  515. {%- for network in networks %}
  516. {%- if network.enabled|default(true) and network.name in role.networks|default([]) %}
  517. {{network.name}}IpList: {get_attr: [{{role.name}}, {{network.name_lower}}_ip_address]}
  518. {%- else %}
  519. {{network.name}}IpList: {get_attr: [{{role.name}}, ip_address]}
  520. {%- endif %}
  521. {%- endfor %}
  522. EnabledServices: {get_attr: [{{role.name}}ServiceNames, value]}
  523. ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
  524. ServiceHostnameList: {get_attr: [{{role.name}}, hostname]}
  525. NetworkHostnameMap: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
  526. {{role.name}}NetworkHostnameMap:
  527. type: OS::Heat::Value
  528. properties:
  529. type: json
  530. value:
  531. # Note (shardy) this somewhat complex yaql may be replaced
  532. # with a map_deep_merge function in ocata. It merges the
  533. # list of maps, but appends to colliding lists so we can
  534. # create a map of lists for all nodes for each network
  535. yaql:
  536. expression: dict($.data.where($ != null).flatten().selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten()]))
  537. data:
  538. - {get_attr: [{{role.name}}, hostname_map]}
  539. # Combine the NodeAdminUserData and NodeUserData mime archives
  540. {{role.name}}UserData:
  541. type: OS::Heat::MultipartMime
  542. properties:
  543. parts:
  544. - config: {get_resource: NodeAdminUserData}
  545. type: multipart
  546. - config: {get_resource: NodeUserData}
  547. type: multipart
  548. - config: {get_resource: {{role.name}}RoleUserData}
  549. type: multipart
  550. # For optional operator role-specific userdata
  551. # Should return a OS::Heat::MultipartMime reference via OS::stack_id
  552. {{role.name}}RoleUserData:
  553. type: OS::TripleO::{{role.name}}::NodeUserData
  554. {{role.name}}:
  555. type: OS::Heat::ResourceGroup
  556. depends_on: Networks
  557. update_policy:
  558. batch_create:
  559. max_batch_size: {get_param: NodeCreateBatchSize}
  560. properties:
  561. count: {get_param: {{role.name}}Count}
  562. removal_policies: {get_param: {{role.name}}RemovalPolicies}
  563. resource_def:
  564. type: OS::TripleO::{{role.name}}
  565. properties:
  566. CloudDomain: {get_param: CloudDomain}
  567. ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
  568. EndpointMap: {get_attr: [EndpointMapData, value]}
  569. Hostname:
  570. str_replace:
  571. template: {get_param: {{role.name}}HostnameFormat}
  572. params:
  573. '%stackname%': {get_param: 'OS::stack_name'}
  574. NodeIndex: '%index%'
  575. # Note, SchedulerHints must be defined here, not only in the
  576. # nested template, as it can contain %index%
  577. {{role.name}}SchedulerHints:
  578. map_merge:
  579. {%- if role.deprecated_param_scheduler_hints is defined %}
  580. - {get_param: {{role.deprecated_param_scheduler_hints}}}
  581. {%- endif %}
  582. - {get_param: {{role.name}}SchedulerHints}
  583. ServiceConfigSettings: {get_attr: [{{role.name}}ServiceConfigSettings, value]}
  584. ServiceNames: {get_attr: [{{role.name}}ServiceNames, value]}
  585. MonitoringSubscriptions: {get_attr: [{{role.name}}ServiceChainRoleData, value, monitoring_subscriptions]}
  586. ServiceMetadataSettings: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_metadata_settings]}
  587. DeploymentServerBlacklistDict: {get_attr: [DeploymentServerBlacklistDict, value]}
  588. RoleParameters:
  589. map_merge:
  590. - {{role.RoleParametersDefault|default({})}}
  591. - get_param: {{role.name}}Parameters
  592. UserData: {get_resource: {{role.name}}UserData}
  593. {% endfor %}
  594. {% for role in roles %}
  595. {{role.name}}Servers:
  596. type: OS::Heat::Value
  597. depends_on: {{role.name}}
  598. properties:
  599. type: json
  600. value:
  601. yaql:
  602. expression: let(servers=>switch(isDict($.data.servers) => $.data.servers, true => {})) -> $servers.deleteAll($servers.keys().where($servers[$] = null))
  603. data:
  604. servers: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
  605. {% endfor %}
  606. # This is a different format to *Servers, as it creates a map of lists
  607. # whereas *Servers creates a map of maps with keys of the nested resource names
  608. ServerIdMap:
  609. type: OS::Heat::Value
  610. properties:
  611. value:
  612. server_ids:
  613. {% for role in roles %}
  614. {{role.name}}: {get_attr: [{{role.name}}, nova_server_resource]}
  615. {% endfor %}
  616. bootstrap_server_id:
  617. yaql:
  618. expression: coalesce($.data, []).first(null)
  619. data: {get_attr: [{{primary_role_name}}, nova_server_resource]}
  620. # This resource just creates a dict out of the DeploymentServerBlacklist,
  621. # which is a list. The dict is used in the role templates to set a condition
  622. # on whether to create the deployment resources. We can't use the list
  623. # directly because there is no way to ask Heat if a list contains a specific
  624. # value.
  625. DeploymentServerBlacklistDict:
  626. type: OS::Heat::Value
  627. properties:
  628. type: json
  629. value:
  630. map_merge:
  631. repeat:
  632. template:
  633. hostname: 1
  634. for_each:
  635. hostname: {get_param: DeploymentServerBlacklist}
  636. hostsConfig:
  637. type: OS::TripleO::Hosts::SoftwareConfig
  638. properties:
  639. hosts:
  640. list_join:
  641. - "\n"
  642. - - if:
  643. - add_vips_to_etc_hosts
  644. - {get_attr: [VipHosts, value]}
  645. - ''
  646. -
  647. {% for role in roles %}
  648. - list_join:
  649. - ""
  650. - {get_attr: [{{role.name}}, hosts_entry]}
  651. {% endfor %}
  652. - {get_param: ExtraHostFileEntries}
  653. allNodesConfig:
  654. type: OS::TripleO::AllNodes::SoftwareConfig
  655. properties:
  656. {%- for network in networks if network.vip|default(false) %}
  657. {%- if network.name == 'External' %}
  658. # Special case the External hostname param, which is CloudName
  659. cloud_name_{{network.name_lower}}: {get_param: CloudName}
  660. {%- elif network.name == 'InternalApi' %}
  661. # Special case the Internal API hostname param, which is CloudNameInternal
  662. cloud_name_{{network.name_lower}}: {get_param: CloudNameInternal}
  663. {%- elif network.name == 'StorageMgmt' %}
  664. # Special case StorageMgmt hostname param, which is CloudNameStorageManagement
  665. cloud_name_{{network.name_lower}}: {get_param: CloudNameStorageManagement}
  666. {%- else %}
  667. cloud_name_{{network.name_lower}}: {get_param: CloudName{{network.name}}}
  668. {%- endif %}
  669. {%- endfor %}
  670. cloud_name_ctlplane: {get_param: CloudNameCtlplane}
  671. enabled_services:
  672. list_join:
  673. - ','
  674. {% for role in roles %}
  675. - {get_attr: [{{role.name}}ServiceNames, value]}
  676. {% endfor %}
  677. cellv2_discovery_hosts:
  678. # Collects compute hostnames for all roles with a service that requires cellv2 host discovery
  679. list_join:
  680. - ','
  681. - yaql:
  682. expression: coalesce($.data.e.zip($.data.l).where($[0]).select($[1]).flatten(), [])
  683. data:
  684. e: # list of true/fails for whether cellsv2 host discovery is required for the roles
  685. {%- for role in roles %}
  686. - {get_attr: [{{role.name}}ServiceChainRoleData, value, cellv2_discovery]}
  687. {%- endfor %}
  688. l: # list of list of compute hostnames for the roles
  689. {%- for role in roles %}
  690. - {get_attr: [{{role.name}}, hostname_map, canonical]}
  691. {%- endfor %}
  692. controller_ips: {get_attr: [{{primary_role_name}}, ip_address]}
  693. controller_names: {get_attr: [{{primary_role_name}}, hostname]}
  694. service_ips:
  695. # Note (shardy) this somewhat complex yaql may be replaced
  696. # with a map_deep_merge function in ocata. It merges the
  697. # list of maps, but appends to colliding lists when a service
  698. # is deployed on more than one role
  699. yaql:
  700. expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten()]))
  701. data:
  702. l:
  703. {% for role in roles %}
  704. - {get_attr: [{{role.name}}IpListMap, service_ips]}
  705. {% endfor %}
  706. service_node_names:
  707. yaql:
  708. expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten()]))
  709. data:
  710. l:
  711. {% for role in roles %}
  712. - {get_attr: [{{role.name}}IpListMap, service_hostnames]}
  713. {% endfor %}
  714. short_service_node_names:
  715. yaql:
  716. expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten()]))
  717. data:
  718. l:
  719. {% for role in roles %}
  720. - {get_attr: [{{role.name}}IpListMap, short_service_hostnames]}
  721. {% endfor %}
  722. short_service_bootstrap_node:
  723. yaql:
  724. expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten().first()]))
  725. data:
  726. l:
  727. {% for role in roles %}
  728. - {get_attr: [{{role.name}}IpListMap, short_service_bootstrap_hostnames]}
  729. {% endfor %}
  730. service_bootstrap_node_ip:
  731. yaql:
  732. expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten().first(null)]))
  733. data:
  734. l:
  735. {% for role in roles %}
  736. - {get_attr: [{{role.name}}IpListMap, service_bootstrap_ips]}
  737. {% endfor %}
  738. NetVipMap: {get_attr: [VipMap, net_ip_map]}
  739. RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
  740. ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
  741. DeployIdentifier: {get_param: DeployIdentifier}
  742. UpdateIdentifier: {get_param: UpdateIdentifier}
  743. MysqlRootPassword:
  744. type: OS::TripleO::RandomString
  745. properties:
  746. length: 10
  747. RabbitCookie:
  748. type: OS::TripleO::RandomString
  749. properties:
  750. length: 20
  751. salt: {get_param: RabbitCookieSalt}
  752. DefaultPasswords:
  753. type: OS::TripleO::DefaultPasswords
  754. properties:
  755. DefaultMysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
  756. DefaultRabbitCookie: {get_attr: [RabbitCookie, value]}
  757. DefaultHeatAuthEncryptionKey: {get_attr: [HeatAuthEncryptionKey, value]}
  758. DefaultPcsdPassword: {get_attr: [PcsdPassword, value]}
  759. DefaultHorizonSecret: {get_attr: [HorizonSecret, value]}
  760. # creates the network architecture
  761. Networks:
  762. type: OS::TripleO::Network
  763. ControlVirtualIP:
  764. depends_on: [Networks, ServiceNetMap]
  765. type: OS::TripleO::Network::Ports::ControlPlaneVipPort
  766. properties:
  767. name: control_virtual_ip
  768. network: {get_param: NeutronControlPlaneID}
  769. fixed_ips:
  770. if:
  771. - control_fixed_ip_not_set
  772. - [{subnet: {get_attr: [ServiceNetMap, vip_subnet_map, ctlplane]}}]
  773. - get_param: ControlFixedIPs
  774. replacement_policy: AUTO
  775. RedisVirtualIP:
  776. depends_on: [Networks, ServiceNetMap]
  777. type: OS::TripleO::Network::Ports::RedisVipPort
  778. properties:
  779. ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
  780. ControlPlaneSubnetCidr:
  781. if:
  782. - ctlplane_subnet_cidr_set
  783. - {get_param: ControlPlaneSubnetCidr}
  784. - {str_split: ['/', {get_attr: [ControlVirtualIP, subnets, 0, cidr]}, 1]}
  785. ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
  786. PortName: redis_virtual_ip
  787. NetworkName: {get_attr: [ServiceNetMap, service_net_map, RedisNetwork]}
  788. ServiceName: redis
  789. FixedIPs:
  790. if:
  791. - redis_virtual_fixed_ip_set
  792. - {get_param: RedisVirtualFixedIPs}
  793. - [{subnet: {get_attr: [ServiceNetMap, vip_subnet_map, redis]}}]
  794. {%- for network in networks if network.vip|default(false) %}
  795. {%- if network.name == 'External' %}
  796. # The public VIP is on the External net, falls back to ctlplane
  797. PublicVirtualIP:
  798. depends_on: [Networks, ServiceNetMap]
  799. type: OS::TripleO::Network::Ports::ExternalVipPort
  800. properties:
  801. ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
  802. ControlPlaneSubnetCidr:
  803. if:
  804. - ctlplane_subnet_cidr_set
  805. - {get_param: ControlPlaneSubnetCidr}
  806. - {str_split: ['/', {get_attr: [ControlVirtualIP, subnets, 0, cidr]}, 1]}
  807. ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
  808. PortName: public_virtual_ip
  809. FixedIPs:
  810. if:
  811. - public_virtual_fixed_ip_set
  812. - {get_param: PublicVirtualFixedIPs}
  813. - [{subnet: {get_attr: [ServiceNetMap, vip_subnet_map, {{network.name}}]}}]
  814. {%- else %}
  815. {{network.name}}VirtualIP:
  816. depends_on: [Networks, ServiceNetMap]
  817. type: OS::TripleO::Network::Ports::{{network.name}}VipPort
  818. properties:
  819. ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
  820. ControlPlaneSubnetCidr:
  821. if:
  822. - ctlplane_subnet_cidr_set
  823. - {get_param: ControlPlaneSubnetCidr}
  824. - {str_split: ['/', {get_attr: [ControlVirtualIP, subnets, 0, cidr]}, 1]}
  825. PortName: {{network.name_lower}}_virtual_ip
  826. FixedIPs:
  827. if:
  828. - {{network.name_lower}}_virtual_fixed_ip_set
  829. - {get_param: {{network.name}}VirtualFixedIPs}
  830. - [{subnet: {get_attr: [ServiceNetMap, vip_subnet_map, {{network.name}}]}}]
  831. {%- endif %}
  832. {%- endfor %}
  833. VipMap:
  834. type: OS::TripleO::Network::Ports::NetVipMap
  835. properties:
  836. ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
  837. ControlPlaneSubnetCidr:
  838. if:
  839. - ctlplane_subnet_cidr_set
  840. - {get_param: ControlPlaneSubnetCidr}
  841. - {str_split: ['/', {get_attr: [ControlVirtualIP, subnets, 0, cidr]}, 1]}
  842. {%- for network in networks if network.vip|default(false) %}
  843. {%- if network.name == 'External' %}
  844. ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
  845. ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
  846. {%- else %}
  847. {{network.name}}Ip: {get_attr: [{{network.name}}VirtualIP, ip_address]}
  848. {{network.name}}IpUri: {get_attr: [{{network.name}}VirtualIP, ip_address_uri]}
  849. {%- endif %}
  850. {%- endfor %}
  851. # No tenant or management VIP required
  852. # Because of nested get_attr functions in the KeystoneAdminVip output, we
  853. # can't determine which attributes of VipMap are used until after
  854. # ServiceNetMap's attribute values are available.
  855. depends_on: ServiceNetMap
  856. {%- for role in roles %}
  857. # All Nodes Validations
  858. {{role.name}}AllNodesValidationConfig:
  859. type: OS::TripleO::AllNodes::Validation
  860. properties:
  861. PingTestIps:
  862. list_join:
  863. - ' '
  864. -
  865. {%- for network in networks %}
  866. {%- if network.enabled|default(true) and network.name in role.networks|default([]) %}
  867. - yaql:
  868. expression: coalesce($.data, []).first(null)
  869. data: {get_attr: [{{primary_role_name}}, {{network.name_lower}}_ip_address]}
  870. {%- endif %}
  871. {%- endfor %}
  872. {%- endfor %}
  873. # Optional ExtraConfig for all nodes - all roles are passed in here, but
  874. # the nested template may configure each role differently (or not at all)
  875. AllNodesExtraConfig:
  876. type: OS::TripleO::AllNodesExtraConfig
  877. depends_on:
  878. {% for role in roles %}
  879. - {{role.name}}AllNodesValidationDeployment
  880. {% endfor %}
  881. properties:
  882. servers:
  883. {% for role in roles %}
  884. {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
  885. {% endfor %}
  886. BlacklistedIpAddresses:
  887. type: OS::Heat::Value
  888. properties:
  889. value:
  890. list_concat:
  891. {% for role in roles %}
  892. - {get_attr: [{{role.name}}, blacklist_ip_address]}
  893. {% endfor %}
  894. BlacklistedHostnames:
  895. type: OS::Heat::Value
  896. properties:
  897. value:
  898. list_concat:
  899. {% for role in roles %}
  900. - {get_attr: [{{role.name}}, blacklist_hostname]}
  901. {% endfor %}
  902. # Post deployment steps for all roles
  903. AllNodesDeploySteps:
  904. type: OS::TripleO::PostDeploySteps
  905. depends_on:
  906. - AllNodesExtraConfig
  907. {% for role in roles %}
  908. - {{role.name}}AllNodesDeployment
  909. {% endfor %}
  910. properties:
  911. servers:
  912. {% for role in roles %}
  913. {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
  914. {% endfor %}
  915. stack_name: {get_param: 'OS::stack_name'}
  916. EndpointMap: {get_attr: [EndpointMapData, value]}
  917. ctlplane_service_ips:
  918. # Note (shardy) this somewhat complex yaql may be replaced
  919. # with a map_deep_merge function in ocata. It merges the
  920. # list of maps, but appends to colliding lists when a service
  921. # is deployed on more than one role
  922. yaql:
  923. expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1]).select([$[0], $[1].flatten()]))
  924. data:
  925. l:
  926. {% for role in roles %}
  927. - {get_attr: [{{role.name}}IpListMap, ctlplane_service_ips]}
  928. {% endfor %}
  929. role_data:
  930. {% for role in roles %}
  931. {{role.name}}:
  932. map_merge:
  933. - {get_attr: [{{role.name}}ServiceChainRoleData, value]}
  934. - {get_attr: [{{role.name}}MergedConfigSettings, value]}
  935. {% endfor %}
  936. blacklisted_ip_addresses: {get_attr: [BlacklistedIpAddresses, value]}
  937. blacklisted_hostnames: {get_attr: [BlacklistedHostnames, value]}
  938. ssh_known_hosts_hostnames: {get_attr: [SshKnownHostsHostnames, value]}
  939. {% for role in roles %}
  940. {{role.name}}Count: {get_param: {{role.name}}Count}
  941. {% endfor %}
  942. ServerOsCollectConfigData:
  943. type: OS::Heat::Value
  944. properties:
  945. type: json
  946. value:
  947. {% for role in roles %}
  948. {{role.name}}: {get_attr: [{{role.name}}, attributes, os_collect_config]}
  949. {% endfor %}
  950. DeployedServerEnvironment:
  951. type: OS::TripleO::DeployedServerEnvironment
  952. properties:
  953. RoleCounts:
  954. {% for role in roles %}
  955. {{role.name}}DeployedServerCount: {get_param: {{role.name}}Count}
  956. {% endfor %}
  957. VipMap:
  958. map_merge:
  959. - {get_attr: [VipMap, net_ip_map]}
  960. - redis: {get_attr: [RedisVirtualIP, ip_address]}
  961. DeployedServerPortMap:
  962. map_merge:
  963. list_concat:
  964. {% for role in roles %}
  965. - {get_attr: [{{role.name}}, deployed_server_port_map]}
  966. {% endfor %}
  967. DeployedServerDeploymentSwiftDataMap:
  968. map_merge:
  969. list_concat:
  970. {% for role in roles %}
  971. - {get_attr: [{{role.name}}, deployed_server_deployment_swift_data_map]}
  972. {% endfor %}
  973. DefaultRouteIp:
  974. str_split:
  975. - ':'
  976. - str_split:
  977. - '/'
  978. - {get_attr: [ServerOsCollectConfigData, value, {{primary_role_name}}, '0', request, metadata_url]}
  979. - 2
  980. - 0
  981. outputs:
  982. ManagedEndpoints:
  983. description: Asserts that the keystone endpoints have been provisioned.
  984. value: true
  985. KeystoneURL:
  986. description: URL for the Overcloud Keystone service
  987. value: {get_attr: [EndpointMapData, value, KeystonePublic, uri_no_suffix]}
  988. KeystoneAdminVip:
  989. description: Keystone Admin VIP endpoint
  990. # Note that these nested get_attr functions require a dependency
  991. # relationship between VipMap and ServiceNetMap, since we can't determine
  992. # which attributes of VipMap are used until after ServiceNetMap's attribute
  993. # values are available. If this is ever reworked to not use nested
  994. # get_attr, that dependency can be removed.
  995. value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
  996. EndpointMap:
  997. description: |
  998. Mapping of the resources with the needed info for their endpoints.
  999. This includes the protocol used, the IP, port and also a full
  1000. representation of the URI.
  1001. value: {get_attr: [EndpointMapData, value]}
  1002. HostsEntry:
  1003. description: |
  1004. The content that should be appended to your /etc/hosts if you want to get
  1005. hostname-based access to the deployed nodes (useful for testing without
  1006. setting up a DNS).
  1007. value:
  1008. list_join:
  1009. - "\n"
  1010. - - {get_attr: [hostsConfig, hosts_entries]}
  1011. - - {get_attr: [VipHosts, value]}
  1012. EnabledServices:
  1013. description: The services enabled on each role
  1014. value:
  1015. {% for role in roles %}
  1016. {{role.name}}: {get_attr: [{{role.name}}ServiceNames, value]}
  1017. {% endfor %}
  1018. RoleData:
  1019. description: The configuration data associated with each role
  1020. value:
  1021. {% for role in roles %}
  1022. {{role.name}}:
  1023. map_merge:
  1024. - {get_attr: [{{role.name}}ServiceChainRoleData, value]}
  1025. - {get_attr: [{{role.name}}MergedConfigSettings, value]}
  1026. {% endfor %}
  1027. RoleConfig:
  1028. description: The configuration workflows associated with each role
  1029. value: {get_attr: [AllNodesDeploySteps, RoleConfig]}
  1030. RoleNetIpMap:
  1031. description: Mapping of each network to a list of IPs for each role
  1032. value:
  1033. {% for role in roles %}
  1034. {{role.name}}: {get_attr: [{{role.name}}IpListMap, net_ip_map]}
  1035. {% endfor %}
  1036. RoleGroupVars:
  1037. description: Mapping of roles to ansible group_vars to be applied config in those roles
  1038. value:
  1039. {% for role in roles %}
  1040. {{role.name}}:
  1041. map_merge: {get_attr: [{{role.name}}, role_group_vars]}
  1042. {% endfor %}
  1043. RoleNetHostnameMap:
  1044. description: Mapping of each network to a list of hostnames for each role
  1045. value:
  1046. {% for role in roles %}
  1047. {{role.name}}: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
  1048. {% endfor %}
  1049. RoleTags:
  1050. description: Tags for each role, as defined in roles_data.yaml
  1051. value:
  1052. {%- for role in roles %}
  1053. {{role.name}}: {{role.tags|default([])}}
  1054. {%- endfor %}
  1055. ServerOsCollectConfigData:
  1056. description: The os-collect-config configuration associated with each server resource
  1057. value: {get_attr: [ServerOsCollectConfigData, value]}
  1058. VipMap:
  1059. description: Mapping of each network to VIP addresses. Also includes the Redis VIP.
  1060. value:
  1061. map_merge:
  1062. - {get_attr: [VipMap, net_ip_map]}
  1063. - redis: {get_attr: [RedisVirtualIP, ip_address]}
  1064. ServerIdData:
  1065. description: Mapping of each role to a list of nova server IDs and the bootstrap ID
  1066. value: {get_attr: [ServerIdMap, value]}
  1067. DeployedServerEnvironment:
  1068. description:
  1069. Environment data that can be used as input into the services stack when
  1070. using split-stack.
  1071. value: {get_attr: [DeployedServerEnvironment, deployed_server_environment]}
  1072. BlacklistedHostnames:
  1073. description: List of blacklisted hostnames
  1074. value: {get_attr: [BlacklistedHostnames, value]}
  1075. BlacklistedIpAddresses:
  1076. description: List of blacklisted ctlplane IP addresses
  1077. value: {get_attr: [BlacklistedIpAddresses, value]}
  1078. AllNodesConfig:
  1079. description: The config (hieradata) for all nodes.
  1080. value: {get_attr: [allNodesConfig, all_nodes_config]}