main.yml 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. ---
  2. # Deploys the local storage operator specific resources.
  3. #
  4. # Required variables:
  5. #
  6. # local_storage:
  7. # namespace: which namespace the LSO is in
  8. # storage_class_name: what to call the storage class
  9. #
  10. # odf_storage:
  11. # namespace: which namespace ODF operator is in
  12. # name: the name of the storage cluster
  13. # default_sc: TODO: the name of the storage class to set as default
  14. # for the cluster (optional)
  15. # storageclass.kubernetes.io/is-default-class=true
  16. #
  17. # Optional variables:
  18. #
  19. # kubeadmin_config the administrator kubeconfig file (tmp/kubeconfig-ocp4)
  20. #
  21. - name: Check if there is a namespace.
  22. kubernetes.core.k8s_info:
  23. kubeconfig: "{{ kubeadmin_config }}"
  24. validate_certs: no
  25. api_version: v1
  26. kind: namespace
  27. name: "{{ odf_storage.namespace }}"
  28. register: prereq_ns
  29. - name: Fail if not so.
  30. ansible.builtin.assert:
  31. that:
  32. - prereq_ns.resources is defined
  33. - prereq_ns.resources | length == 1
  34. success_msg: "OK, namespace found."
  35. fail_msg: "FATAL: namespace to deploy ({{ odf_storage.namespace }}) not found. Ensure there is an operator already present."
  36. - name: Check if there is a CSV in the namespace.
  37. kubernetes.core.k8s_info:
  38. kubeconfig: "{{ kubeadmin_config }}"
  39. validate_certs: no
  40. api_version: operators.coreos.com/v1alpha1
  41. kind: clusterserviceversion
  42. namespace: "{{ odf_storage.namespace }}"
  43. label_selectors:
  44. - operators.coreos.com/odf-operator.openshift-storage=
  45. register: prereq_csv
  46. - name: Fail if not so.
  47. ansible.builtin.assert:
  48. that:
  49. - prereq_csv.resources is defined
  50. - prereq_csv.resources | length > 0
  51. success_msg: "OK, operator CSV found."
  52. fail_msg: "FATAL: Operator is not deployed in the namespace: {{ odf_storage.namespace }}. Ensure there is an operator already present."
  53. - name: Check if the LSO storage class exists.
  54. kubernetes.core.k8s_info:
  55. kubeconfig: "{{ kubeadmin_config }}"
  56. validate_certs: no
  57. api_version: storage.k8s.io/v1
  58. kind: storageclass
  59. name: "{{ local_storage.storage_class_name }}"
  60. register: lso_sclass
  61. - name: Fail if not so.
  62. ansible.builtin.assert:
  63. that:
  64. - lso_sclass.resources is defined
  65. - lso_sclass.resources | length > 0
  66. success_msg: "OK, LSO storage class found."
  67. fail_msg: "FATAL: Local Storage Operator is not configured correctly: storage class {{ local_storage.storage_class_name }} not found."
  68. - name: Verify the web console settings
  69. kubernetes.core.k8s_info:
  70. kubeconfig: "{{ kubeadmin_config }}"
  71. validate_certs: no
  72. api_version: operator.openshift.io/v1
  73. kind: console
  74. name: cluster
  75. register: cluster_console
  76. - name: Patch the web console with odf-console plugin if not yet there
  77. kubernetes.core.k8s_json_patch:
  78. kubeconfig: "{{ kubeadmin_config }}"
  79. validate_certs: no
  80. api_version: operator.openshift.io/v1
  81. kind: console
  82. name: cluster
  83. patch:
  84. - op: add
  85. path: /spec/plugins/-
  86. value: odf-console
  87. when: not ("odf-console" in cluster_console.resources[0].spec.plugins)
  88. - name: Find how many nodes match the node_selector_key
  89. kubernetes.core.k8s_info:
  90. kubeconfig: "{{ kubeadmin_config }}"
  91. validate_certs: no
  92. api_version: v1
  93. kind: node
  94. label_selectors:
  95. "{{ local_storage.node_selector_key }}"
  96. register: matching_nodes
  97. - name: Just remember how many
  98. ansible.builtin.set_fact:
  99. num_storage_nodes: "{{ matching_nodes.resources | length }}"
  100. - name: Ensure there is a storage cluster resource
  101. kubernetes.core.k8s:
  102. kubeconfig: "{{ kubeadmin_config }}"
  103. validate_certs: no
  104. api_version: ocs.openshift.io/v1
  105. kind: storagecluster
  106. namespace: "{{ odf_storage.namespace }}"
  107. name: "{{ odf_storage.name }}"
  108. resource_definition:
  109. spec:
  110. monDataDirHostPath: /var/lib/rook
  111. storageDeviceSets:
  112. - count: 1
  113. dataPVCTemplate:
  114. spec:
  115. accessModes:
  116. - ReadWriteOnce
  117. resources:
  118. requests:
  119. storage: "1"
  120. storageClassName: "{{ local_storage.storage_class_name }}"
  121. volumeMode: Block
  122. name: odf-lso-device-set
  123. replica: "{{ num_storage_nodes }}"
  124. flexibleScaling: false
  125. placement:
  126. all:
  127. nodeAffinity:
  128. preferredDuringSchedulingIgnoredDuringExecution:
  129. - weight: 5
  130. preference:
  131. matchExpressions:
  132. - key: "{{ local_storage.node_selector_key }}"
  133. operator: Exists
  134. - name: Wait for the Ceph cluster to finish progressing.
  135. kubernetes.core.k8s_info:
  136. kubeconfig: "{{ kubeadmin_config }}"
  137. validate_certs: no
  138. api_version: ceph.rook.io/v1
  139. kind: cephcluster
  140. namespace: "{{ odf_storage.namespace }}"
  141. name: "{{ odf_storage.name }}-cephcluster"
  142. register: cephcluster
  143. until:
  144. - cephcluster.resources | length > 0
  145. - cephcluster.resources[0].status is defined
  146. - cephcluster.resources[0].status.phase == "Ready"
  147. retries: 60
  148. delay: 5
  149. - name: Wait for the storage cluster to finish progressing.
  150. kubernetes.core.k8s_info:
  151. kubeconfig: "{{ kubeadmin_config }}"
  152. validate_certs: no
  153. api_version: ocs.openshift.io/v1
  154. kind: storagecluster
  155. namespace: "{{ odf_storage.namespace }}"
  156. name: "{{ odf_storage.name }}"
  157. register: storagecluster
  158. until: storagecluster.resources[0].status.phase == "Ready"
  159. retries: 120
  160. delay: 5
  161. # TODO: Perhaps verify the storage classes are there?
  162. # The naming scheme is:
  163. # {{ odf_storage.name }}-ceph-rgw
  164. # {{ odf_storage.name }}-ceph-rbd
  165. # {{ odf_storage.name }}-cephfs
  166. # openshift-storage.noobaa.io
  167. ...