heat_stack.yaml.j2 34 KB

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