heat_stack.yaml.j2 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. heat_template_version: {{ openshift_openstack_heat_template_version }}
  2. description: OpenShift cluster
  3. parameters:
  4. outputs:
  5. {% if openshift_openstack_resolve_heat_outputs|default(True)|bool %}
  6. etcd_names:
  7. description: Name of the etcds
  8. value: { get_attr: [ etcd, name ] }
  9. etcd_ips:
  10. description: IPs of the etcds
  11. value: { get_attr: [ etcd, private_ip ] }
  12. etcd_floating_ips:
  13. description: Floating IPs of the etcds
  14. value: { get_attr: [ etcd, floating_ip ] }
  15. master_names:
  16. description: Name of the masters
  17. value: { get_attr: [ masters, name ] }
  18. master_ips:
  19. description: IPs of the masters
  20. value: { get_attr: [ masters, private_ip ] }
  21. master_floating_ips:
  22. description: Floating IPs of the masters
  23. value: { get_attr: [ masters, floating_ip ] }
  24. node_names:
  25. description: Name of the nodes
  26. value: { get_attr: [ compute_nodes, name ] }
  27. node_ips:
  28. description: IPs of the nodes
  29. value: { get_attr: [ compute_nodes, private_ip ] }
  30. node_floating_ips:
  31. description: Floating IPs of the nodes
  32. value: { get_attr: [ compute_nodes, floating_ip ] }
  33. infra_names:
  34. description: Name of the nodes
  35. value: { get_attr: [ infra_nodes, name ] }
  36. infra_ips:
  37. description: IPs of the nodes
  38. value: { get_attr: [ infra_nodes, private_ip ] }
  39. infra_floating_ips:
  40. description: Floating IPs of the nodes
  41. value: { get_attr: [ infra_nodes, floating_ip ] }
  42. {% endif %}
  43. public_api_ip:
  44. description: IP address for the API/UI endpoint
  45. {% if openshift_openstack_use_lbaas_load_balancer %}
  46. # TODO(shadower): Handle setups without floating IPs
  47. value: { get_attr: [api_lb_floating_ip, floating_ip_address] }
  48. {% elif openshift_openstack_use_vm_load_balancer %}
  49. value: { get_attr: [loadbalancer, resource.0, floating_ip] }
  50. {% else %}
  51. value: { get_attr: [masters, resource.0, floating_ip] }
  52. {% endif %}
  53. public_router_ip:
  54. description: IP address of the apps/router endpoint
  55. {% if openshift_openstack_use_lbaas_load_balancer %}
  56. value: { get_attr: [router_lb_floating_ip, floating_ip_address] }
  57. {% else %}
  58. # NOTE(shadower): The VM-based loadbalancer only supports master nodes
  59. value: { get_attr: [infra_nodes, resource.0, floating_ip] }
  60. {% endif %}
  61. private_api_ip:
  62. description: >
  63. The address of the private OpenShift API. This is used during OpenShift
  64. deployment and for API access by the internal pods and services.
  65. {% if openshift_openstack_use_lbaas_load_balancer or openshift_use_kuryr|default(false)|bool %}
  66. value: { get_attr: [api_lb, vip_address] }
  67. {% elif openshift_openstack_use_vm_load_balancer %}
  68. value: { get_attr: [loadbalancer, resource.0, private_ip] }
  69. {% else %}
  70. value: { get_attr: [masters, resource.0, private_ip] }
  71. {% endif %}
  72. {% if openshift_use_kuryr|default(false)|bool %}
  73. vm_subnet:
  74. description: ID of the subnet the Pods will be on
  75. value: { get_resource: subnet }
  76. pod_subnet:
  77. description: ID of the subnet the Pods will be on
  78. value: { get_resource: pod_subnet }
  79. service_subnet:
  80. description: ID of the subnet the services will be on
  81. value: { get_resource: service_subnet }
  82. pod_router:
  83. description: ID of the router where the pod subnet will be connected
  84. value: { get_resource: router }
  85. {% if openshift_kuryr_subnet_driver|default('default') == 'namespace' %}
  86. pod_subnet_pool:
  87. description: ID of the subnet pool to use for the pod_subnets CIDRs
  88. value: { get_resource: pod_subnet_pool }
  89. {% endif %}
  90. {% if openshift_kuryr_sg_driver|default('default') == 'namespace' %}
  91. sg_allow_from_default:
  92. description: ID of the security group to enable access from default namespace
  93. value: { get_resource: sg_allow_from_default}
  94. sg_allow_from_namespace:
  95. description: ID of the security group to enable access from namespaces to default namespace
  96. value: { get_resource: sg_allow_from_namespace}
  97. {% endif %}
  98. pod_access_sg_id:
  99. description: Id of the security group for services to be able to reach pods
  100. value: { get_resource: pod_access_sg }
  101. api_lb_vip_port_id:
  102. description: Id of the OpenShift API load balancer VIP port
  103. value: { get_attr: [api_lb, vip_port_id] }
  104. api_lb_sg_id:
  105. description: Security Group Id of the OpenShift API load balancer VIP port
  106. value: { get_resource: lb-secgrp }
  107. api_lb_provider:
  108. description: Id of the OpenShift API load balancer VIP port
  109. value: { get_attr: [api_lb, show, provider] }
  110. {% endif %}
  111. conditions:
  112. no_floating: {% if openshift_openstack_provider_network_name %}true{% else %}false{% endif %}
  113. resources:
  114. # NOTE: With Kuryr, the load balancer is necessary.
  115. {% if openshift_openstack_use_lbaas_load_balancer or (openshift_use_kuryr|default(false)|bool and not openshift_openstack_provider_network_name) %}
  116. api_lb:
  117. type: OS::{{ openshift_openstack_lbaasv2_provider }}::LoadBalancer
  118. properties:
  119. name:
  120. str_replace:
  121. template: openshift-ansible-cluster_id-api-lb
  122. params:
  123. cluster_id: {{ openshift_openstack_full_dns_domain }}
  124. {% if openshift_use_kuryr|default(false)|bool %}
  125. vip_address: {{ openshift_openstack_kuryr_service_subnet_cidr | ipaddr('1') | ipaddr('address') }}
  126. vip_subnet: { get_resource: service_subnet }
  127. {% else %}
  128. vip_subnet: { get_resource: subnet }
  129. {% endif %}
  130. api_lb_listener:
  131. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  132. properties:
  133. name:
  134. str_replace:
  135. template: openshift-ansible-cluster_id-api-lb-listener
  136. params:
  137. cluster_id: {{ openshift_openstack_full_dns_domain }}
  138. loadbalancer: { get_resource: api_lb }
  139. protocol: HTTPS
  140. protocol_port: {{ openshift_master_api_port }}
  141. default_pool: { get_resource: api_lb_pool }
  142. {% if openshift_use_kuryr|default(false)|bool and openshift_master_api_port|default(8443) != 443 %}
  143. # 443 listener for pod access. In non-kuryr envs handled by iptables
  144. internal_api_lb_listener:
  145. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  146. properties:
  147. name:
  148. str_replace:
  149. template: openshift-ansible-cluster_id-api-lb-internal-listener
  150. params:
  151. cluster_id: {{ openshift_openstack_full_dns_domain }}
  152. loadbalancer: { get_resource: api_lb }
  153. protocol: HTTPS
  154. protocol_port: 443
  155. default_pool: { get_resource: api_lb_pool }
  156. {% endif %}
  157. api_lb_pool:
  158. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Pool
  159. properties:
  160. name:
  161. str_replace:
  162. template: openshift-ansible-cluster_id-api-lb-pool
  163. params:
  164. cluster_id: {{ openshift_openstack_full_dns_domain }}
  165. protocol: HTTPS
  166. # TODO(shadower): Make this configurable?
  167. lb_algorithm: ROUND_ROBIN
  168. loadbalancer: { get_resource: api_lb }
  169. {% endif %}
  170. {% if not openshift_openstack_provider_network_name %}
  171. {% if openshift_use_kuryr|default(false)|bool %}
  172. pod_net:
  173. type: OS::Neutron::Net
  174. properties:
  175. name:
  176. str_replace:
  177. template: openshift-ansible-cluster_id-pod-net
  178. params:
  179. cluster_id: {{ openshift_openstack_full_dns_domain }}
  180. {% if openshift_kuryr_subnet_driver|default('default') == 'namespace' %}
  181. pod_subnet_pool:
  182. type: OS::Neutron::SubnetPool
  183. properties:
  184. prefixes: [ {{ openshift_openstack_kuryr_pod_subnet_cidr }} ]
  185. default_prefixlen: 24
  186. name:
  187. str_replace:
  188. template: openshift-ansible-cluster_id-pod-subnet-pool
  189. params:
  190. cluster_id: {{ openshift_openstack_full_dns_domain }}
  191. {% endif %}
  192. {% if openshift_kuryr_sg_driver|default('default') == 'namespace' %}
  193. sg_allow_from_default:
  194. type: OS::Neutron::SecurityGroup
  195. properties:
  196. name:
  197. str_replace:
  198. template: openshift-ansible-cluster_id-allow_from_default
  199. params:
  200. cluster_id: {{ openshift_openstack_full_dns_domain }}
  201. description: Give access to the services and pods from the default namespace
  202. sg_allow_from_namespace:
  203. type: OS::Neutron::SecurityGroup
  204. properties:
  205. name:
  206. str_replace:
  207. template: openshift-ansible-cluster_id-allow_from_namespace
  208. params:
  209. cluster_id: {{ openshift_openstack_full_dns_domain }}
  210. description: Give access to the services and pods on the default namespace from the other namespaces
  211. rules:
  212. - ethertype: IPv4
  213. remote_group_id: { get_resource: sg_allow_from_default }
  214. remote_mode: remote_group_id
  215. sg_allow_from_default_rule:
  216. type: OS::Neutron::SecurityGroupRule
  217. properties:
  218. security_group: { get_resource: sg_allow_from_default }
  219. ethertype: IPv4
  220. remote_group: { get_resource: sg_allow_from_namespace }
  221. common-secgrp_namespace_rule:
  222. type: OS::Neutron::SecurityGroupRule
  223. properties:
  224. security_group: { get_resource: common-secgrp }
  225. ethertype: IPv4
  226. remote_group: { get_resource: sg_allow_from_namespace }
  227. common-secgrp_default_rule:
  228. type: OS::Neutron::SecurityGroupRule
  229. properties:
  230. security_group: { get_resource: common-secgrp }
  231. ethertype: IPv4
  232. remote_group: { get_resource: sg_allow_from_default }
  233. {% endif %}
  234. pod_subnet:
  235. type: OS::Neutron::Subnet
  236. properties:
  237. network_id: { get_resource: pod_net }
  238. {% if openshift_kuryr_subnet_driver|default('default') == 'namespace' %}
  239. subnetpool: { get_resource: pod_subnet_pool }
  240. {% else %}
  241. cidr: {{ openshift_openstack_kuryr_pod_subnet_cidr }}
  242. {% endif %}
  243. enable_dhcp: False
  244. name:
  245. str_replace:
  246. template: openshift-ansible-cluster_id-pod-subnet
  247. params:
  248. cluster_id: {{ openshift_openstack_full_dns_domain }}
  249. dns_nameservers:
  250. {% for nameserver in openshift_openstack_dns_nameservers %}
  251. - {{ nameserver }}
  252. {% endfor %}
  253. service_net:
  254. type: OS::Neutron::Net
  255. properties:
  256. name:
  257. str_replace:
  258. template: openshift-ansible-cluster_id-service-net
  259. params:
  260. cluster_id: {{ openshift_openstack_full_dns_domain }}
  261. service_subnet:
  262. type: OS::Neutron::Subnet
  263. properties:
  264. network_id: { get_resource: service_net }
  265. cidr: {{ openshift_openstack_kuryr_service_subnet_cidr }}
  266. gateway_ip: {{ openshift_openstack_kuryr_service_subnet_cidr | ipaddr('-2') | ipaddr('address') }}
  267. enable_dhcp: False
  268. allocation_pools:
  269. - start: {{ openshift_openstack_kuryr_service_pool_start }}
  270. end: {{ openshift_openstack_kuryr_service_pool_end }}
  271. name:
  272. str_replace:
  273. template: openshift-ansible-cluster_id-service-subnet
  274. params:
  275. cluster_id: {{ openshift_openstack_full_dns_domain }}
  276. {% endif %}
  277. net:
  278. type: OS::Neutron::Net
  279. properties:
  280. name:
  281. str_replace:
  282. template: openshift-ansible-cluster_id-net
  283. params:
  284. cluster_id: {{ openshift_openstack_full_dns_domain }}
  285. subnet:
  286. type: OS::Neutron::Subnet
  287. properties:
  288. name:
  289. str_replace:
  290. template: openshift-ansible-cluster_id-subnet
  291. params:
  292. cluster_id: {{ openshift_openstack_full_dns_domain }}
  293. network: { get_resource: net }
  294. cidr: {{ openshift_openstack_subnet_cidr }}
  295. allocation_pools:
  296. - start: {{ openshift_openstack_pool_start }}
  297. end: {{ openshift_openstack_pool_end }}
  298. dns_nameservers:
  299. {% for nameserver in openshift_openstack_dns_nameservers %}
  300. - {{ nameserver }}
  301. {% endfor %}
  302. {% if openshift_use_flannel|default(False)|bool %}
  303. data_net:
  304. type: OS::Neutron::Net
  305. properties:
  306. name: openshift-ansible-{{ openshift_openstack_full_dns_domain }}-data-net
  307. port_security_enabled: false
  308. data_subnet:
  309. type: OS::Neutron::Subnet
  310. properties:
  311. name: openshift-ansible-{{ openshift_openstack_full_dns_domain }}-data-subnet
  312. network: { get_resource: data_net }
  313. cidr: {{ openshift_cluster_network_cidr }}
  314. gateway_ip: null
  315. {% endif %}
  316. router:
  317. type: OS::Neutron::Router
  318. properties:
  319. name:
  320. str_replace:
  321. template: openshift-ansible-cluster_id-router
  322. params:
  323. cluster_id: {{ openshift_openstack_full_dns_domain }}
  324. external_gateway_info:
  325. network: {{ openshift_openstack_external_network_name }}
  326. interface:
  327. type: OS::Neutron::RouterInterface
  328. properties:
  329. router_id: { get_resource: router }
  330. subnet_id: { get_resource: subnet }
  331. {% if openshift_use_kuryr|default(false)|bool %}
  332. pod_subnet_interface:
  333. type: OS::Neutron::RouterInterface
  334. properties:
  335. router_id: { get_resource: router }
  336. subnet_id: { get_resource: pod_subnet }
  337. service_router_port:
  338. type: OS::Neutron::Port
  339. properties:
  340. network: { get_resource: service_net}
  341. fixed_ips:
  342. - subnet: { get_resource: service_subnet }
  343. ip_address: {{ openshift_openstack_kuryr_service_subnet_cidr | ipaddr('-2') | ipaddr('address') }}
  344. name:
  345. str_replace:
  346. template: openshift-ansible-cluster_id-service-subnet-router-port
  347. params:
  348. cluster_id: {{ openshift_openstack_full_dns_domain }}
  349. service_subnet_interface:
  350. type: OS::Neutron::RouterInterface
  351. properties:
  352. router_id: { get_resource: router }
  353. port: { get_resource: service_router_port }
  354. {% endif %}
  355. {% endif %}
  356. # keypair:
  357. # type: OS::Nova::KeyPair
  358. # properties:
  359. # name:
  360. # str_replace:
  361. # template: openshift-ansible-cluster_id-keypair
  362. # params:
  363. # cluster_id: {{ openshift_openstack_full_dns_domain }}
  364. # public_key: {{ openshift_openstack_keypair_name }}
  365. common-secgrp:
  366. type: OS::Neutron::SecurityGroup
  367. properties:
  368. name:
  369. str_replace:
  370. template: openshift-ansible-cluster_id-common-secgrp
  371. params:
  372. cluster_id: {{ openshift_openstack_full_dns_domain }}
  373. description:
  374. str_replace:
  375. template: Basic ssh/icmp security group for cluster_id OpenShift cluster
  376. params:
  377. cluster_id: {{ openshift_openstack_full_dns_domain }}
  378. rules: {{ openshift_openstack_common_secgroup_rules|to_json }}
  379. {% if openshift_use_kuryr|default(false)|bool %}
  380. pod_access_sg:
  381. type: OS::Neutron::SecurityGroup
  382. properties:
  383. name:
  384. str_replace:
  385. template: openshift-ansible-cluster_id-pod-service-secgrp
  386. params:
  387. cluster_id: {{ openshift_openstack_full_dns_domain }}
  388. description: Give services and nodes access to the pods
  389. rules:
  390. - ethertype: IPv4
  391. remote_ip_prefix: {{ openshift_openstack_kuryr_service_subnet_cidr }}
  392. - ethertype: IPv4
  393. remote_ip_prefix: {{ openshift_openstack_subnet_cidr }}
  394. {% if openshift_kuryr_sg_driver|default('default') != 'namespace' %}
  395. - ethertype: IPv4
  396. remote_mode: remote_group_id
  397. {% endif %}
  398. {% endif %}
  399. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  400. flat-secgrp:
  401. type: OS::Neutron::SecurityGroup
  402. properties:
  403. name:
  404. str_replace:
  405. template: openshift-ansible-cluster_id-flat-secgrp
  406. params:
  407. cluster_id: {{ openshift_openstack_full_dns_domain }}
  408. description:
  409. str_replace:
  410. template: Security group for cluster_id OpenShift cluster
  411. params:
  412. cluster_id: {{ openshift_openstack_full_dns_domain }}
  413. rules:
  414. {% for rule in openshift_openstack_master_secgroup_rules|list %}
  415. - {{ rule|to_json }}
  416. {% endfor %}
  417. {% for rule in openshift_openstack_etcd_secgroup_rules|list %}
  418. - {{ rule|to_json }}
  419. {% endfor %}
  420. {% for rule in openshift_openstack_node_secgroup_rules|list %}
  421. - {{ rule|to_json }}
  422. {% endfor %}
  423. {% for rule in openshift_openstack_infra_secgroup_rules|list %}
  424. - {{ rule|to_json }}
  425. {% endfor %}
  426. {% else %}
  427. master-secgrp:
  428. type: OS::Neutron::SecurityGroup
  429. properties:
  430. name:
  431. str_replace:
  432. template: openshift-ansible-cluster_id-master-secgrp
  433. params:
  434. cluster_id: {{ openshift_openstack_full_dns_domain }}
  435. description:
  436. str_replace:
  437. template: Security group for cluster_id OpenShift cluster master
  438. params:
  439. cluster_id: {{ openshift_openstack_full_dns_domain }}
  440. rules: {{ openshift_openstack_master_secgroup_rules|to_json }}
  441. etcd-secgrp:
  442. type: OS::Neutron::SecurityGroup
  443. properties:
  444. name:
  445. str_replace:
  446. template: openshift-ansible-cluster_id-etcd-secgrp
  447. params:
  448. cluster_id: {{ openshift_openstack_full_dns_domain }}
  449. description:
  450. str_replace:
  451. template: Security group for cluster_id etcd cluster
  452. params:
  453. cluster_id: {{ openshift_openstack_full_dns_domain }}
  454. rules: {{ openshift_openstack_etcd_secgroup_rules|to_json }}
  455. node-secgrp:
  456. type: OS::Neutron::SecurityGroup
  457. properties:
  458. name:
  459. str_replace:
  460. template: openshift-ansible-cluster_id-node-secgrp
  461. params:
  462. cluster_id: {{ openshift_openstack_full_dns_domain }}
  463. description:
  464. str_replace:
  465. template: Security group for cluster_id OpenShift cluster nodes
  466. params:
  467. cluster_id: {{ openshift_openstack_full_dns_domain }}
  468. rules: {{ openshift_openstack_node_secgroup_rules|to_json }}
  469. infra-secgrp:
  470. type: OS::Neutron::SecurityGroup
  471. properties:
  472. name:
  473. str_replace:
  474. template: openshift-ansible-cluster_id-infra-secgrp
  475. params:
  476. cluster_id: {{ openshift_openstack_full_dns_domain }}
  477. description:
  478. str_replace:
  479. template: Security group for cluster_id OpenShift infrastructure cluster nodes
  480. params:
  481. cluster_id: {{ openshift_openstack_full_dns_domain }}
  482. rules: {{ openshift_openstack_infra_secgroup_rules|to_json }}
  483. cns-secgrp:
  484. type: OS::Neutron::SecurityGroup
  485. properties:
  486. name:
  487. str_replace:
  488. template: openshift-ansible-cluster_id-cns-secgrp
  489. params:
  490. cluster_id: {{ openshift_openstack_full_dns_domain }}
  491. description:
  492. str_replace:
  493. template: Security group for cluster_id OpenShift cns cluster nodes
  494. params:
  495. cluster_id: {{ openshift_openstack_full_dns_domain }}
  496. rules: {{ openshift_openstack_cns_secgroup_rules|to_json }}
  497. {% endif %}
  498. lb-secgrp:
  499. type: OS::Neutron::SecurityGroup
  500. properties:
  501. name: openshift-ansible-{{ openshift_openstack_full_dns_domain }}-lb-secgrp
  502. description: Security group for {{ openshift_openstack_full_dns_domain }} cluster Load Balancer
  503. rules:
  504. {% if openshift_master_console_port is defined and openshift_master_console_port != openshift_master_api_port %}
  505. {% for rule in openshift_openstack_lb_base_secgroup_rules|list %}
  506. - {{ rule|to_json }}
  507. {% endfor %}
  508. {% for rule in openshift_openstack_lb_console_secgroup_rules|list %}
  509. - {{ rule|to_json }}
  510. {% endfor %}
  511. {% else %}
  512. {{ openshift_openstack_lb_base_secgroup_rules|to_json }}
  513. {% endif %}
  514. etcd:
  515. type: OS::Heat::ResourceGroup
  516. properties:
  517. count: {{ openshift_openstack_num_etcd }}
  518. resource_def:
  519. type: server.yaml
  520. properties:
  521. name:
  522. str_replace:
  523. template: hostname-%index%domain_suffix
  524. params:
  525. hostname: {{ openshift_openstack_etcd_hostname }}
  526. domain_suffix: {{ l_hostname_domain_suffix }}
  527. cluster_env: {{ openshift_openstack_public_dns_domain }}
  528. cluster_id: {{ openshift_openstack_full_dns_domain }}
  529. group:
  530. str_replace:
  531. template: k8s_type.cluster_id
  532. params:
  533. k8s_type: etcds
  534. cluster_id: {{ openshift_openstack_full_dns_domain }}
  535. type: etcd
  536. image: {{ openshift_openstack_etcd_image }}
  537. flavor: {{ openshift_openstack_etcd_flavor }}
  538. key_name: {{ openshift_openstack_keypair_name }}
  539. {% if openshift_openstack_provider_network_name %}
  540. net: {{ openshift_openstack_provider_network_name }}
  541. net_name: {{ openshift_openstack_provider_network_name }}
  542. {% else %}
  543. net: { get_resource: net }
  544. subnet: { get_resource: subnet }
  545. {% if openshift_use_kuryr|default(false)|bool %}
  546. pod_net: { get_resource: pod_net }
  547. pod_subnet: { get_resource: pod_subnet }
  548. {% endif %}
  549. net_name:
  550. str_replace:
  551. template: openshift-ansible-cluster_id-net
  552. params:
  553. cluster_id: {{ openshift_openstack_full_dns_domain }}
  554. {% endif %}
  555. secgrp:
  556. - { get_resource: {% if openshift_openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}etcd-secgrp{% endif %} }
  557. - { get_resource: common-secgrp }
  558. {% if openshift_use_kuryr|default(false)|bool %}
  559. pod_secgrp:
  560. - { get_resource: pod_access_sg }
  561. {% endif %}
  562. floating_network:
  563. if:
  564. - no_floating
  565. - ''
  566. - {{ openshift_openstack_external_network_name }}
  567. {% if openshift_openstack_provider_network_name %}
  568. attach_float_net: false
  569. {% endif %}
  570. volume_size: {{ openshift_openstack_etcd_volume_size }}
  571. {% if not openshift_openstack_provider_network_name %}
  572. depends_on:
  573. - interface
  574. {% endif %}
  575. {% if openshift_openstack_master_server_group_policies|length > 0 %}
  576. master_server_group:
  577. type: OS::Nova::ServerGroup
  578. properties:
  579. name: master_server_group
  580. policies: {{ openshift_openstack_master_server_group_policies }}
  581. {% endif %}
  582. {% if openshift_openstack_infra_server_group_policies|length > 0 %}
  583. infra_server_group:
  584. type: OS::Nova::ServerGroup
  585. properties:
  586. name: infra_server_group
  587. policies: {{ openshift_openstack_infra_server_group_policies }}
  588. {% endif %}
  589. {% if openshift_openstack_use_vm_load_balancer %}
  590. loadbalancer:
  591. type: OS::Heat::ResourceGroup
  592. properties:
  593. count: 1
  594. resource_def:
  595. type: server.yaml
  596. properties:
  597. name:
  598. str_replace:
  599. template: hostname-%index%domain_suffix
  600. params:
  601. hostname: {{ openshift_openstack_lb_hostname }}
  602. domain_suffix: {{ l_hostname_domain_suffix }}
  603. cluster_env: {{ openshift_openstack_public_dns_domain }}
  604. cluster_id: {{ openshift_openstack_full_dns_domain }}
  605. group:
  606. str_replace:
  607. template: k8s_type.cluster_id
  608. params:
  609. k8s_type: lb
  610. cluster_id: {{ openshift_openstack_full_dns_domain }}
  611. type: lb
  612. image: {{ openshift_openstack_lb_image }}
  613. flavor: {{ openshift_openstack_lb_flavor }}
  614. key_name: {{ openshift_openstack_keypair_name }}
  615. {% if openshift_openstack_provider_network_name %}
  616. net: {{ openshift_openstack_provider_network_name }}
  617. net_name: {{ openshift_openstack_provider_network_name }}
  618. {% else %}
  619. net: { get_resource: net }
  620. subnet: { get_resource: subnet }
  621. {% if openshift_use_kuryr|default(false)|bool %}
  622. pod_net: { get_resource: pod_net }
  623. pod_subnet: { get_resource: pod_subnet }
  624. {% endif %}
  625. net_name:
  626. str_replace:
  627. template: openshift-ansible-cluster_id-net
  628. params:
  629. cluster_id: {{ openshift_openstack_full_dns_domain }}
  630. {% endif %}
  631. secgrp:
  632. - { get_resource: lb-secgrp }
  633. - { get_resource: common-secgrp }
  634. {% if openshift_use_kuryr|default(false)|bool %}
  635. pod_secgrp:
  636. - { get_resource: pod_access_sg }
  637. {% endif %}
  638. floating_network:
  639. if:
  640. - no_floating
  641. - ''
  642. - {{ openshift_openstack_external_network_name }}
  643. {% if openshift_openstack_provider_network_name %}
  644. attach_float_net: false
  645. {% endif %}
  646. volume_size: {{ openshift_openstack_lb_volume_size }}
  647. {% if not openshift_openstack_provider_network_name %}
  648. depends_on:
  649. - interface
  650. {% endif %}
  651. {% endif %}
  652. masters:
  653. type: OS::Heat::ResourceGroup
  654. properties:
  655. count: {{ openshift_openstack_num_masters }}
  656. resource_def:
  657. type: server.yaml
  658. properties:
  659. name:
  660. str_replace:
  661. template: hostname-%index%domain_suffix
  662. params:
  663. hostname: {{ openshift_openstack_master_hostname }}
  664. domain_suffix: {{ l_hostname_domain_suffix }}
  665. cluster_env: {{ openshift_openstack_public_dns_domain }}
  666. cluster_id: {{ openshift_openstack_full_dns_domain }}
  667. group:
  668. str_replace:
  669. template: k8s_type.cluster_id
  670. params:
  671. k8s_type: masters
  672. cluster_id: {{ openshift_openstack_full_dns_domain }}
  673. type: master
  674. openshift_node_group_name: {{ openshift_openstack_master_group_name }}
  675. image: {{ openshift_openstack_master_image }}
  676. flavor: {{ openshift_openstack_master_flavor }}
  677. key_name: {{ openshift_openstack_keypair_name }}
  678. {% if openshift_openstack_use_lbaas_load_balancer or openshift_use_kuryr|default(false)|bool %}
  679. api_lb_pool: { get_resource: api_lb_pool }
  680. {% endif %}
  681. {% if openshift_openstack_provider_network_name %}
  682. net: {{ openshift_openstack_provider_network_name }}
  683. net_name: {{ openshift_openstack_provider_network_name }}
  684. {% else %}
  685. net: { get_resource: net }
  686. subnet: { get_resource: subnet }
  687. {% if openshift_use_kuryr|default(false)|bool %}
  688. pod_net: { get_resource: pod_net }
  689. pod_subnet: { get_resource: pod_subnet }
  690. {% endif %}
  691. net_name:
  692. str_replace:
  693. template: openshift-ansible-cluster_id-net
  694. params:
  695. cluster_id: {{ openshift_openstack_full_dns_domain }}
  696. {% if openshift_use_flannel|default(False)|bool %}
  697. attach_data_net: true
  698. data_net: { get_resource: data_net }
  699. data_subnet: { get_resource: data_subnet }
  700. {% endif %}
  701. {% endif %}
  702. {% if openshift_use_kuryr|default(false)|bool %}
  703. api_lb_pool: { get_resource: api_lb_pool }
  704. {% endif %}
  705. secgrp:
  706. - { get_resource: common-secgrp }
  707. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  708. - { get_resource: flat-secgrp }
  709. {% else %}
  710. - { get_resource: master-secgrp }
  711. - { get_resource: node-secgrp }
  712. {% if openshift_openstack_num_etcd|int == 0 %}
  713. - { get_resource: etcd-secgrp }
  714. {% endif %}
  715. {% if openshift_use_kuryr|default(false)|bool %}
  716. pod_secgrp:
  717. - { get_resource: pod_access_sg }
  718. {% endif %}
  719. {% endif %}
  720. floating_network:
  721. if:
  722. - no_floating
  723. - ''
  724. - {{ openshift_openstack_external_network_name }}
  725. {% if openshift_openstack_provider_network_name %}
  726. attach_float_net: false
  727. {% endif %}
  728. volume_size: {{ openshift_openstack_master_volume_size }}
  729. {% if openshift_openstack_master_server_group_policies|length > 0 %}
  730. scheduler_hints:
  731. group: { get_resource: master_server_group }
  732. {% endif %}
  733. {% if not openshift_openstack_provider_network_name %}
  734. depends_on:
  735. - interface
  736. {% endif %}
  737. compute_nodes:
  738. type: OS::Heat::ResourceGroup
  739. properties:
  740. count: {{ openshift_openstack_num_nodes }}
  741. removal_policies:
  742. - resource_list: {{ openshift_openstack_nodes_to_remove | to_json }}
  743. resource_def:
  744. type: server.yaml
  745. properties:
  746. name:
  747. str_replace:
  748. template: hostname-%index%domain_suffix
  749. params:
  750. hostname: {{ openshift_openstack_node_hostname }}
  751. domain_suffix: {{ l_hostname_domain_suffix }}
  752. cluster_env: {{ openshift_openstack_public_dns_domain }}
  753. cluster_id: {{ openshift_openstack_full_dns_domain }}
  754. group:
  755. str_replace:
  756. template: k8s_type.cluster_id
  757. params:
  758. k8s_type: nodes
  759. cluster_id: {{ openshift_openstack_full_dns_domain }}
  760. type: node
  761. subtype: app
  762. openshift_node_group_name: {{ openshift_openstack_compute_group_name }}
  763. image: {{ openshift_openstack_node_image }}
  764. flavor: {{ openshift_openstack_node_flavor }}
  765. key_name: {{ openshift_openstack_keypair_name }}
  766. {% if openshift_openstack_provider_network_name %}
  767. net: {{ openshift_openstack_provider_network_name }}
  768. net_name: {{ openshift_openstack_provider_network_name }}
  769. {% else %}
  770. net: { get_resource: net }
  771. subnet: { get_resource: subnet }
  772. {% if openshift_use_kuryr|default(false)|bool %}
  773. pod_net: { get_resource: pod_net }
  774. pod_subnet: { get_resource: pod_subnet }
  775. {% endif %}
  776. net_name:
  777. str_replace:
  778. template: openshift-ansible-cluster_id-net
  779. params:
  780. cluster_id: {{ openshift_openstack_full_dns_domain }}
  781. {% if openshift_use_flannel|default(False)|bool %}
  782. attach_data_net: true
  783. data_net: { get_resource: data_net }
  784. data_subnet: { get_resource: data_subnet }
  785. {% endif %}
  786. {% endif %}
  787. secgrp:
  788. - { get_resource: {% if openshift_openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}node-secgrp{% endif %} }
  789. - { get_resource: common-secgrp }
  790. {% if openshift_use_kuryr|default(false)|bool %}
  791. pod_secgrp:
  792. - { get_resource: pod_access_sg }
  793. {% endif %}
  794. floating_network:
  795. if:
  796. - no_floating
  797. - ''
  798. - {{ openshift_openstack_external_network_name }}
  799. {% if openshift_openstack_provider_network_name %}
  800. attach_float_net: false
  801. {% endif %}
  802. volume_size: {{ openshift_openstack_node_volume_size }}
  803. {% if not openshift_openstack_provider_network_name %}
  804. depends_on:
  805. - interface
  806. {% endif %}
  807. infra_nodes:
  808. type: OS::Heat::ResourceGroup
  809. properties:
  810. count: {{ openshift_openstack_num_infra }}
  811. resource_def:
  812. type: server.yaml
  813. properties:
  814. name:
  815. str_replace:
  816. template: hostname-%index%domain_suffix
  817. params:
  818. hostname: {{ openshift_openstack_infra_hostname }}
  819. domain_suffix: {{ l_hostname_domain_suffix }}
  820. cluster_env: {{ openshift_openstack_public_dns_domain }}
  821. cluster_id: {{ openshift_openstack_full_dns_domain }}
  822. group:
  823. str_replace:
  824. template: k8s_type.cluster_id
  825. params:
  826. k8s_type: infra
  827. cluster_id: {{ openshift_openstack_full_dns_domain }}
  828. type: node
  829. subtype: infra
  830. openshift_node_group_name: {{ openshift_openstack_infra_group_name }}
  831. image: {{ openshift_openstack_infra_image }}
  832. flavor: {{ openshift_openstack_infra_flavor }}
  833. key_name: {{ openshift_openstack_keypair_name }}
  834. {% if openshift_openstack_use_lbaas_load_balancer %}
  835. router_lb_pool_http: { get_resource: router_lb_pool_http }
  836. router_lb_pool_https: { get_resource: router_lb_pool_https }
  837. {% endif %}
  838. {% if openshift_openstack_provider_network_name %}
  839. net: {{ openshift_openstack_provider_network_name }}
  840. net_name: {{ openshift_openstack_provider_network_name }}
  841. {% else %}
  842. net: { get_resource: net }
  843. subnet: { get_resource: subnet }
  844. {% if openshift_use_kuryr|default(false)|bool %}
  845. pod_net: { get_resource: pod_net }
  846. pod_subnet: { get_resource: pod_subnet }
  847. {% endif %}
  848. net_name:
  849. str_replace:
  850. template: openshift-ansible-cluster_id-net
  851. params:
  852. cluster_id: {{ openshift_openstack_full_dns_domain }}
  853. {% if openshift_use_flannel|default(False)|bool %}
  854. attach_data_net: true
  855. data_net: { get_resource: data_net }
  856. data_subnet: { get_resource: data_subnet }
  857. {% endif %}
  858. {% endif %}
  859. secgrp:
  860. # TODO(bogdando) filter only required node rules into infra-secgrp
  861. - { get_resource: common-secgrp }
  862. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  863. - { get_resource: flat-secgrp }
  864. {% else %}
  865. - { get_resource: node-secgrp }
  866. - { get_resource: infra-secgrp }
  867. {% if openshift_use_kuryr|default(false)|bool %}
  868. pod_secgrp:
  869. - { get_resource: pod_access_sg }
  870. {% endif %}
  871. {% endif %}
  872. floating_network:
  873. if:
  874. - no_floating
  875. - ''
  876. - {{ openshift_openstack_external_network_name }}
  877. {% if openshift_openstack_provider_network_name %}
  878. attach_float_net: false
  879. {% endif %}
  880. volume_size: {{ openshift_openstack_infra_volume_size }}
  881. {% if openshift_openstack_infra_server_group_policies|length > 0 %}
  882. scheduler_hints:
  883. group: { get_resource: infra_server_group }
  884. {% endif %}
  885. {% if not openshift_openstack_provider_network_name %}
  886. depends_on:
  887. - interface
  888. {% endif %}
  889. cns:
  890. type: OS::Heat::ResourceGroup
  891. properties:
  892. count: {{ openshift_openstack_num_cns }}
  893. resource_def:
  894. type: server.yaml
  895. properties:
  896. name:
  897. str_replace:
  898. template: hostname-%index%domain_suffix
  899. params:
  900. hostname: {{ openshift_openstack_cns_hostname }}
  901. domain_suffix: {{ l_hostname_domain_suffix }}
  902. cluster_env: {{ openshift_openstack_public_dns_domain }}
  903. cluster_id: {{ openshift_openstack_full_dns_domain }}
  904. group:
  905. str_replace:
  906. template: k8s_type.cluster_id
  907. params:
  908. k8s_type: cns
  909. cluster_id: {{ openshift_openstack_full_dns_domain }}
  910. type: cns
  911. openshift_node_group_name: node-config-compute
  912. image: {{ openshift_openstack_cns_image }}
  913. flavor: {{ openshift_openstack_cns_flavor }}
  914. key_name: {{ openshift_openstack_keypair_name }}
  915. {% if openshift_openstack_provider_network_name %}
  916. net: {{ openshift_openstack_provider_network_name }}
  917. net_name: {{ openshift_openstack_provider_network_name }}
  918. {% else %}
  919. net: { get_resource: net }
  920. subnet: { get_resource: subnet }
  921. {% if openshift_use_kuryr|default(false)|bool %}
  922. pod_net: { get_resource: pod_net }
  923. pod_subnet: { get_resource: pod_subnet }
  924. {% endif %}
  925. net_name:
  926. str_replace:
  927. template: openshift-ansible-cluster_id-net
  928. params:
  929. cluster_id: {{ openshift_openstack_full_dns_domain }}
  930. {% if openshift_use_flannel|default(False)|bool %}
  931. attach_data_net: true
  932. data_net: { get_resource: data_net }
  933. data_subnet: { get_resource: data_subnet }
  934. {% endif %}
  935. {% endif %}
  936. secgrp:
  937. - { get_resource: common-secgrp }
  938. {% if openshift_openstack_flat_secgrp|default(False)|bool %}
  939. - { get_resource: flat-secgrp }
  940. {% else %}
  941. - { get_resource: node-secgrp }
  942. - { get_resource: cns-secgrp }
  943. {% if openshift_use_kuryr|default(false)|bool %}
  944. pod_secgrp:
  945. - { get_resource: pod_access_sg }
  946. {% endif %}
  947. {% endif %}
  948. {% if not openshift_openstack_provider_network_name %}
  949. floating_network: {{ openshift_openstack_external_network_name }}
  950. {% endif %}
  951. volume_size: {{ openshift_openstack_cns_volume_size }}
  952. {% if not openshift_openstack_provider_network_name %}
  953. depends_on:
  954. - interface
  955. {% endif %}
  956. {% if openshift_openstack_use_lbaas_load_balancer %}
  957. api_lb_floating_ip:
  958. condition: { not: no_floating }
  959. depends_on:
  960. - api_lb
  961. - api_lb_listener
  962. - api_lb_pool
  963. type: OS::Neutron::FloatingIP
  964. properties:
  965. floating_network: {{ openshift_openstack_external_network_name }}
  966. port_id: { get_attr: [api_lb, vip_port_id] }
  967. router_lb:
  968. type: OS::{{ openshift_openstack_lbaasv2_provider }}::LoadBalancer
  969. properties:
  970. vip_subnet: { get_resource: subnet }
  971. router_lb_floating_ip:
  972. condition: { not: no_floating }
  973. depends_on:
  974. - router_lb
  975. - router_lb_listener_http
  976. - router_lb_pool_http
  977. - router_lb_listener_https
  978. - router_lb_pool_https
  979. type: OS::Neutron::FloatingIP
  980. properties:
  981. floating_network: {{ openshift_openstack_external_network_name }}
  982. port_id: { get_attr: [router_lb, vip_port_id] }
  983. router_lb_listener_http:
  984. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  985. properties:
  986. protocol: HTTP
  987. protocol_port: 80
  988. loadbalancer: { get_resource: router_lb }
  989. router_lb_pool_http:
  990. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Pool
  991. properties:
  992. # TODO(shadower): Make this configurable?
  993. lb_algorithm: ROUND_ROBIN
  994. protocol: HTTP
  995. listener: { get_resource: router_lb_listener_http }
  996. router_lb_listener_https:
  997. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Listener
  998. properties:
  999. protocol: HTTPS
  1000. protocol_port: 443
  1001. loadbalancer: { get_resource: router_lb }
  1002. router_lb_pool_https:
  1003. type: OS::{{ openshift_openstack_lbaasv2_provider }}::Pool
  1004. properties:
  1005. # TODO(shadower): Make this configurable?
  1006. lb_algorithm: ROUND_ROBIN
  1007. protocol: HTTPS
  1008. listener: { get_resource: router_lb_listener_https }
  1009. {% endif %}