heat_stack.yaml.j2 33 KB

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