heat_stack.yaml.j2 21 KB

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