heat_stack.yaml.j2 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. heat_template_version: 2016-10-14
  2. description: OpenShift cluster
  3. parameters:
  4. outputs:
  5. etcd_names:
  6. description: Name of the etcds
  7. value: { get_attr: [ etcd, name ] }
  8. etcd_ips:
  9. description: IPs of the etcds
  10. value: { get_attr: [ etcd, private_ip ] }
  11. etcd_floating_ips:
  12. description: Floating IPs of the etcds
  13. value: { get_attr: [ etcd, floating_ip ] }
  14. master_names:
  15. description: Name of the masters
  16. value: { get_attr: [ masters, name ] }
  17. master_ips:
  18. description: IPs of the masters
  19. value: { get_attr: [ masters, private_ip ] }
  20. master_floating_ips:
  21. description: Floating IPs of the masters
  22. value: { get_attr: [ masters, floating_ip ] }
  23. node_names:
  24. description: Name of the nodes
  25. value: { get_attr: [ compute_nodes, name ] }
  26. node_ips:
  27. description: IPs of the nodes
  28. value: { get_attr: [ compute_nodes, private_ip ] }
  29. node_floating_ips:
  30. description: Floating IPs of the nodes
  31. value: { get_attr: [ compute_nodes, floating_ip ] }
  32. infra_names:
  33. description: Name of the nodes
  34. value: { get_attr: [ infra_nodes, name ] }
  35. infra_ips:
  36. description: IPs of the nodes
  37. value: { get_attr: [ infra_nodes, private_ip ] }
  38. infra_floating_ips:
  39. description: Floating IPs of the nodes
  40. value: { get_attr: [ infra_nodes, floating_ip ] }
  41. dns_name:
  42. description: Name of the DNS
  43. value:
  44. get_attr:
  45. - dns
  46. - name
  47. dns_floating_ips:
  48. description: Floating IPs of the DNS
  49. value: { get_attr: [ dns, floating_ip ] }
  50. dns_private_ips:
  51. description: Private IPs of the DNS
  52. value: { get_attr: [ dns, private_ip ] }
  53. resources:
  54. net:
  55. type: OS::Neutron::Net
  56. properties:
  57. name:
  58. str_replace:
  59. template: openshift-ansible-cluster_id-net
  60. params:
  61. cluster_id: {{ stack_name }}
  62. subnet:
  63. type: OS::Neutron::Subnet
  64. properties:
  65. name:
  66. str_replace:
  67. template: openshift-ansible-cluster_id-subnet
  68. params:
  69. cluster_id: {{ stack_name }}
  70. network: { get_resource: net }
  71. cidr:
  72. str_replace:
  73. template: subnet_24_prefix.0/24
  74. params:
  75. subnet_24_prefix: {{ subnet_prefix }}
  76. allocation_pools:
  77. - start:
  78. str_replace:
  79. template: subnet_24_prefix.3
  80. params:
  81. subnet_24_prefix: {{ subnet_prefix }}
  82. end:
  83. str_replace:
  84. template: subnet_24_prefix.254
  85. params:
  86. subnet_24_prefix: {{ subnet_prefix }}
  87. dns_nameservers:
  88. {% for nameserver in dns_nameservers %}
  89. - {{ nameserver }}
  90. {% endfor %}
  91. router:
  92. type: OS::Neutron::Router
  93. properties:
  94. name:
  95. str_replace:
  96. template: openshift-ansible-cluster_id-router
  97. params:
  98. cluster_id: {{ stack_name }}
  99. external_gateway_info:
  100. network: {{ external_network }}
  101. interface:
  102. type: OS::Neutron::RouterInterface
  103. properties:
  104. router_id: { get_resource: router }
  105. subnet_id: { get_resource: subnet }
  106. # keypair:
  107. # type: OS::Nova::KeyPair
  108. # properties:
  109. # name:
  110. # str_replace:
  111. # template: openshift-ansible-cluster_id-keypair
  112. # params:
  113. # cluster_id: {{ stack_name }}
  114. # public_key: {{ ssh_public_key }}
  115. common-secgrp:
  116. type: OS::Neutron::SecurityGroup
  117. properties:
  118. name:
  119. str_replace:
  120. template: openshift-ansible-cluster_id-common-secgrp
  121. params:
  122. cluster_id: {{ stack_name }}
  123. description:
  124. str_replace:
  125. template: Basic ssh/icmp security group for cluster_id OpenShift cluster
  126. params:
  127. cluster_id: {{ stack_name }}
  128. rules:
  129. - direction: ingress
  130. protocol: tcp
  131. port_range_min: 22
  132. port_range_max: 22
  133. remote_ip_prefix: {{ ssh_ingress_cidr }}
  134. - direction: ingress
  135. protocol: icmp
  136. remote_ip_prefix: {{ ssh_ingress_cidr }}
  137. {% if openstack_flat_secgrp|default(False)|bool %}
  138. flat-secgrp:
  139. type: OS::Neutron::SecurityGroup
  140. properties:
  141. name:
  142. str_replace:
  143. template: openshift-ansible-cluster_id-flat-secgrp
  144. params:
  145. cluster_id: {{ stack_name }}
  146. description:
  147. str_replace:
  148. template: Security group for cluster_id OpenShift cluster
  149. params:
  150. cluster_id: {{ stack_name }}
  151. rules:
  152. - direction: ingress
  153. protocol: tcp
  154. port_range_min: 4001
  155. port_range_max: 4001
  156. - direction: ingress
  157. protocol: tcp
  158. port_range_min: 8443
  159. port_range_max: 8444
  160. - direction: ingress
  161. protocol: tcp
  162. port_range_min: 8053
  163. port_range_max: 8053
  164. - direction: ingress
  165. protocol: udp
  166. port_range_min: 8053
  167. port_range_max: 8053
  168. - direction: ingress
  169. protocol: tcp
  170. port_range_min: 24224
  171. port_range_max: 24224
  172. - direction: ingress
  173. protocol: udp
  174. port_range_min: 24224
  175. port_range_max: 24224
  176. - direction: ingress
  177. protocol: tcp
  178. port_range_min: 2224
  179. port_range_max: 2224
  180. - direction: ingress
  181. protocol: udp
  182. port_range_min: 5404
  183. port_range_max: 5405
  184. - direction: ingress
  185. protocol: tcp
  186. port_range_min: 9090
  187. port_range_max: 9090
  188. - direction: ingress
  189. protocol: tcp
  190. port_range_min: 2379
  191. port_range_max: 2380
  192. remote_mode: remote_group_id
  193. - direction: ingress
  194. protocol: tcp
  195. port_range_min: 10250
  196. port_range_max: 10250
  197. remote_mode: remote_group_id
  198. - direction: ingress
  199. protocol: udp
  200. port_range_min: 10250
  201. port_range_max: 10250
  202. remote_mode: remote_group_id
  203. - direction: ingress
  204. protocol: tcp
  205. port_range_min: 10255
  206. port_range_max: 10255
  207. remote_mode: remote_group_id
  208. - direction: ingress
  209. protocol: udp
  210. port_range_min: 10255
  211. port_range_max: 10255
  212. remote_mode: remote_group_id
  213. - direction: ingress
  214. protocol: udp
  215. port_range_min: 4789
  216. port_range_max: 4789
  217. remote_mode: remote_group_id
  218. - direction: ingress
  219. protocol: tcp
  220. port_range_min: 30000
  221. port_range_max: 32767
  222. remote_ip_prefix: {{ node_ingress_cidr }}
  223. - direction: ingress
  224. protocol: tcp
  225. port_range_min: 30000
  226. port_range_max: 32767
  227. remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24"
  228. {% else %}
  229. master-secgrp:
  230. type: OS::Neutron::SecurityGroup
  231. properties:
  232. name:
  233. str_replace:
  234. template: openshift-ansible-cluster_id-master-secgrp
  235. params:
  236. cluster_id: {{ stack_name }}
  237. description:
  238. str_replace:
  239. template: Security group for cluster_id OpenShift cluster master
  240. params:
  241. cluster_id: {{ stack_name }}
  242. rules:
  243. - direction: ingress
  244. protocol: tcp
  245. port_range_min: 4001
  246. port_range_max: 4001
  247. - direction: ingress
  248. protocol: tcp
  249. port_range_min: 8443
  250. port_range_max: 8444
  251. - direction: ingress
  252. protocol: tcp
  253. port_range_min: 8053
  254. port_range_max: 8053
  255. - direction: ingress
  256. protocol: udp
  257. port_range_min: 8053
  258. port_range_max: 8053
  259. - direction: ingress
  260. protocol: tcp
  261. port_range_min: 24224
  262. port_range_max: 24224
  263. - direction: ingress
  264. protocol: udp
  265. port_range_min: 24224
  266. port_range_max: 24224
  267. - direction: ingress
  268. protocol: tcp
  269. port_range_min: 2224
  270. port_range_max: 2224
  271. - direction: ingress
  272. protocol: udp
  273. port_range_min: 5404
  274. port_range_max: 5405
  275. - direction: ingress
  276. protocol: tcp
  277. port_range_min: 9090
  278. port_range_max: 9090
  279. etcd-secgrp:
  280. type: OS::Neutron::SecurityGroup
  281. properties:
  282. name:
  283. str_replace:
  284. template: openshift-ansible-cluster_id-etcd-secgrp
  285. params:
  286. cluster_id: {{ stack_name }}
  287. description:
  288. str_replace:
  289. template: Security group for cluster_id etcd cluster
  290. params:
  291. cluster_id: {{ stack_name }}
  292. rules:
  293. - direction: ingress
  294. protocol: tcp
  295. port_range_min: 2379
  296. port_range_max: 2379
  297. remote_mode: remote_group_id
  298. remote_group_id: { get_resource: master-secgrp }
  299. - direction: ingress
  300. protocol: tcp
  301. port_range_min: 2380
  302. port_range_max: 2380
  303. remote_mode: remote_group_id
  304. node-secgrp:
  305. type: OS::Neutron::SecurityGroup
  306. properties:
  307. name:
  308. str_replace:
  309. template: openshift-ansible-cluster_id-node-secgrp
  310. params:
  311. cluster_id: {{ stack_name }}
  312. description:
  313. str_replace:
  314. template: Security group for cluster_id OpenShift cluster nodes
  315. params:
  316. cluster_id: {{ stack_name }}
  317. rules:
  318. - direction: ingress
  319. protocol: tcp
  320. port_range_min: 10250
  321. port_range_max: 10250
  322. remote_mode: remote_group_id
  323. - direction: ingress
  324. protocol: tcp
  325. port_range_min: 10255
  326. port_range_max: 10255
  327. remote_mode: remote_group_id
  328. - direction: ingress
  329. protocol: udp
  330. port_range_min: 10255
  331. port_range_max: 10255
  332. remote_mode: remote_group_id
  333. - direction: ingress
  334. protocol: udp
  335. port_range_min: 4789
  336. port_range_max: 4789
  337. remote_mode: remote_group_id
  338. - direction: ingress
  339. protocol: tcp
  340. port_range_min: 30000
  341. port_range_max: 32767
  342. remote_ip_prefix: {{ node_ingress_cidr }}
  343. - direction: ingress
  344. protocol: tcp
  345. port_range_min: 30000
  346. port_range_max: 32767
  347. remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24"
  348. {% endif %}
  349. infra-secgrp:
  350. type: OS::Neutron::SecurityGroup
  351. properties:
  352. name:
  353. str_replace:
  354. template: openshift-ansible-cluster_id-infra-secgrp
  355. params:
  356. cluster_id: {{ stack_name }}
  357. description:
  358. str_replace:
  359. template: Security group for cluster_id OpenShift infrastructure cluster nodes
  360. params:
  361. cluster_id: {{ stack_name }}
  362. rules:
  363. - direction: ingress
  364. protocol: tcp
  365. port_range_min: 80
  366. port_range_max: 80
  367. - direction: ingress
  368. protocol: tcp
  369. port_range_min: 443
  370. port_range_max: 443
  371. dns-secgrp:
  372. type: OS::Neutron::SecurityGroup
  373. properties:
  374. name:
  375. str_replace:
  376. template: openshift-ansible-cluster_id-dns-secgrp
  377. params:
  378. cluster_id: {{ stack_name }}
  379. description:
  380. str_replace:
  381. template: Security group for cluster_id cluster DNS
  382. params:
  383. cluster_id: {{ stack_name }}
  384. rules:
  385. - direction: ingress
  386. protocol: udp
  387. port_range_min: 53
  388. port_range_max: 53
  389. remote_ip_prefix: {{ node_ingress_cidr }}
  390. - direction: ingress
  391. protocol: udp
  392. port_range_min: 53
  393. port_range_max: 53
  394. remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24"
  395. - direction: ingress
  396. protocol: tcp
  397. port_range_min: 53
  398. port_range_max: 53
  399. remote_ip_prefix: {{ node_ingress_cidr }}
  400. - direction: ingress
  401. protocol: tcp
  402. port_range_min: 53
  403. port_range_max: 53
  404. remote_ip_prefix: "{{ openstack_subnet_prefix }}.0/24"
  405. {% if num_masters > 1 %}
  406. lb-secgrp:
  407. type: OS::Neutron::SecurityGroup
  408. properties:
  409. name: openshift-ansible-{{ stack_name }}-lb-secgrp
  410. description: Security group for {{ stack_name }} cluster Load Balancer
  411. rules:
  412. - direction: ingress
  413. protocol: tcp
  414. port_range_min: {{ openshift_master_api_port | default(8443) }}
  415. port_range_max: {{ openshift_master_api_port | default(8443) }}
  416. remote_ip_prefix: {{ lb_ingress_cidr }}
  417. {% if openshift_master_console_port is defined and openshift_master_console_port != openshift_master_api_port %}
  418. - direction: ingress
  419. protocol: tcp
  420. port_range_min: {{ openshift_master_console_port | default(8443) }}
  421. port_range_max: {{ openshift_master_console_port | default(8443) }}
  422. remote_ip_prefix: {{ lb_ingress_cidr }}
  423. {% endif %}
  424. {% endif %}
  425. etcd:
  426. type: OS::Heat::ResourceGroup
  427. properties:
  428. count: {{ num_etcd }}
  429. resource_def:
  430. type: server.yaml
  431. properties:
  432. name:
  433. str_replace:
  434. template: k8s_type-%index%.cluster_id
  435. params:
  436. cluster_id: {{ stack_name }}
  437. k8s_type: etcd
  438. cluster_env: {{ public_dns_domain }}
  439. cluster_id: {{ stack_name }}
  440. group:
  441. str_replace:
  442. template: k8s_type.cluster_id
  443. params:
  444. k8s_type: etcds
  445. cluster_id: {{ stack_name }}
  446. type: etcd
  447. image: {{ openstack_image }}
  448. flavor: {{ etcd_flavor }}
  449. key_name: {{ ssh_public_key }}
  450. net: { get_resource: net }
  451. subnet: { get_resource: subnet }
  452. secgrp:
  453. - { get_resource: {% if openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}etcd-secgrp{% endif %} }
  454. - { get_resource: common-secgrp }
  455. floating_network: {{ external_network }}
  456. net_name:
  457. str_replace:
  458. template: openshift-ansible-cluster_id-net
  459. params:
  460. cluster_id: {{ stack_name }}
  461. volume_size: {{ etcd_volume_size }}
  462. depends_on:
  463. - interface
  464. {% if num_masters > 1 %}
  465. loadbalancer:
  466. type: OS::Heat::ResourceGroup
  467. properties:
  468. count: 1
  469. resource_def:
  470. type: server.yaml
  471. properties:
  472. name:
  473. str_replace:
  474. template: k8s_type-%index%.cluster_id
  475. params:
  476. cluster_id: {{ stack_name }}
  477. k8s_type: lb
  478. cluster_env: {{ public_dns_domain }}
  479. cluster_id: {{ stack_name }}
  480. group:
  481. str_replace:
  482. template: k8s_type.cluster_id
  483. params:
  484. k8s_type: lb
  485. cluster_id: {{ stack_name }}
  486. type: lb
  487. image: {{ openstack_image }}
  488. flavor: {{ lb_flavor }}
  489. key_name: {{ ssh_public_key }}
  490. net: { get_resource: net }
  491. subnet: { get_resource: subnet }
  492. secgrp:
  493. - { get_resource: lb-secgrp }
  494. - { get_resource: common-secgrp }
  495. floating_network: {{ external_network }}
  496. net_name:
  497. str_replace:
  498. template: openshift-ansible-cluster_id-net
  499. params:
  500. cluster_id: {{ stack_name }}
  501. volume_size: 5
  502. depends_on:
  503. - interface
  504. {% endif %}
  505. masters:
  506. type: OS::Heat::ResourceGroup
  507. properties:
  508. count: {{ num_masters }}
  509. resource_def:
  510. type: server.yaml
  511. properties:
  512. name:
  513. str_replace:
  514. template: k8s_type-%index%.cluster_id
  515. params:
  516. cluster_id: {{ stack_name }}
  517. k8s_type: master
  518. cluster_env: {{ public_dns_domain }}
  519. cluster_id: {{ stack_name }}
  520. group:
  521. str_replace:
  522. template: k8s_type.cluster_id
  523. params:
  524. k8s_type: masters
  525. cluster_id: {{ stack_name }}
  526. type: master
  527. image: {{ openstack_image }}
  528. flavor: {{ master_flavor }}
  529. key_name: {{ ssh_public_key }}
  530. net: { get_resource: net }
  531. subnet: { get_resource: subnet }
  532. secgrp:
  533. {% if openstack_flat_secgrp|default(False)|bool %}
  534. - { get_resource: flat-secgrp }
  535. {% else %}
  536. - { get_resource: master-secgrp }
  537. - { get_resource: node-secgrp }
  538. {% if num_etcd == 0 %}
  539. - { get_resource: etcd-secgrp }
  540. {% endif %}
  541. {% endif %}
  542. - { get_resource: common-secgrp }
  543. floating_network: {{ external_network }}
  544. net_name:
  545. str_replace:
  546. template: openshift-ansible-cluster_id-net
  547. params:
  548. cluster_id: {{ stack_name }}
  549. volume_size: {{ master_volume_size }}
  550. depends_on:
  551. - interface
  552. compute_nodes:
  553. type: OS::Heat::ResourceGroup
  554. properties:
  555. count: {{ num_nodes }}
  556. removal_policies:
  557. - resource_list: {{ nodes_to_remove }}
  558. resource_def:
  559. type: server.yaml
  560. properties:
  561. name:
  562. str_replace:
  563. template: subtype-k8s_type-%index%.cluster_id
  564. params:
  565. cluster_id: {{ stack_name }}
  566. k8s_type: node
  567. subtype: app
  568. cluster_env: {{ public_dns_domain }}
  569. cluster_id: {{ stack_name }}
  570. group:
  571. str_replace:
  572. template: k8s_type.cluster_id
  573. params:
  574. k8s_type: nodes
  575. cluster_id: {{ stack_name }}
  576. type: node
  577. subtype: app
  578. node_labels:
  579. region: primary
  580. image: {{ openstack_image }}
  581. flavor: {{ node_flavor }}
  582. key_name: {{ ssh_public_key }}
  583. net: { get_resource: net }
  584. subnet: { get_resource: subnet }
  585. secgrp:
  586. - { get_resource: {% if openstack_flat_secgrp|default(False)|bool %}flat-secgrp{% else %}node-secgrp{% endif %} }
  587. - { get_resource: common-secgrp }
  588. floating_network: {{ external_network }}
  589. net_name:
  590. str_replace:
  591. template: openshift-ansible-cluster_id-net
  592. params:
  593. cluster_id: {{ stack_name }}
  594. volume_size: {{ app_volume_size }}
  595. depends_on:
  596. - interface
  597. infra_nodes:
  598. type: OS::Heat::ResourceGroup
  599. properties:
  600. count: {{ num_infra }}
  601. resource_def:
  602. type: server.yaml
  603. properties:
  604. name:
  605. str_replace:
  606. template: subtypek8s_type-%index%.cluster_id
  607. params:
  608. cluster_id: {{ stack_name }}
  609. k8s_type: node
  610. subtype: infra
  611. cluster_env: {{ public_dns_domain }}
  612. cluster_id: {{ stack_name }}
  613. group:
  614. str_replace:
  615. template: k8s_type.cluster_id
  616. params:
  617. k8s_type: infra
  618. cluster_id: {{ stack_name }}
  619. type: node
  620. subtype: infra
  621. node_labels:
  622. region: infra
  623. image: {{ openstack_image }}
  624. flavor: {{ infra_flavor }}
  625. key_name: {{ ssh_public_key }}
  626. net: { get_resource: net }
  627. subnet: { get_resource: subnet }
  628. secgrp:
  629. # TODO(bogdando) filter only required node rules into infra-secgrp
  630. {% if openstack_flat_secgrp|default(False)|bool %}
  631. - { get_resource: flat-secgrp }
  632. {% else %}
  633. - { get_resource: node-secgrp }
  634. {% endif %}
  635. - { get_resource: infra-secgrp }
  636. - { get_resource: common-secgrp }
  637. floating_network: {{ external_network }}
  638. net_name:
  639. str_replace:
  640. template: openshift-ansible-cluster_id-net
  641. params:
  642. cluster_id: {{ stack_name }}
  643. volume_size: {{ infra_volume_size }}
  644. depends_on:
  645. - interface
  646. dns:
  647. type: OS::Heat::ResourceGroup
  648. properties:
  649. count: {{ num_dns }}
  650. resource_def:
  651. type: server.yaml
  652. properties:
  653. name:
  654. str_replace:
  655. template: k8s_type-%index%.cluster_id
  656. params:
  657. cluster_id: {{ stack_name }}
  658. k8s_type: dns
  659. cluster_env: {{ public_dns_domain }}
  660. cluster_id: {{ stack_name }}
  661. group:
  662. str_replace:
  663. template: k8s_type.cluster_id
  664. params:
  665. k8s_type: dns
  666. cluster_id: {{ stack_name }}
  667. type: dns
  668. image: {{ openstack_image }}
  669. flavor: {{ dns_flavor }}
  670. key_name: {{ ssh_public_key }}
  671. net: { get_resource: net }
  672. subnet: { get_resource: subnet }
  673. secgrp:
  674. - { get_resource: dns-secgrp }
  675. - { get_resource: common-secgrp }
  676. floating_network: {{ external_network }}
  677. net_name:
  678. str_replace:
  679. template: openshift-ansible-cluster_id-net
  680. params:
  681. cluster_id: {{ stack_name }}
  682. volume_size: {{ dns_volume_size }}
  683. depends_on:
  684. - interface