--- # Install LVM Storage (LVMS) operator via OpenShift OLM. # # Creates an LVMCluster with a volume group backed by the specified # block devices, providing a StorageClass for persistent volume claims. # All tasks are idempotent (kubernetes.core.k8s state: present). # ------------------------------------------------------------------ # Step 1: Install LVMS operator via OLM # ------------------------------------------------------------------ - name: Create LVMS namespace kubernetes.core.k8s: state: present definition: apiVersion: v1 kind: Namespace metadata: name: "{{ lvms_operator_namespace }}" - name: Create OperatorGroup for LVMS kubernetes.core.k8s: state: present definition: apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: "{{ lvms_operator_name }}" namespace: "{{ lvms_operator_namespace }}" spec: targetNamespaces: - "{{ lvms_operator_namespace }}" upgradeStrategy: Default - name: Subscribe to LVMS operator kubernetes.core.k8s: state: present definition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: "{{ lvms_operator_name }}" namespace: "{{ lvms_operator_namespace }}" spec: channel: "{{ lvms_operator_channel }}" installPlanApproval: Automatic name: "{{ lvms_operator_name }}" source: "{{ lvms_operator_source }}" sourceNamespace: openshift-marketplace # ------------------------------------------------------------------ # Step 2: Wait for operator to be ready # ------------------------------------------------------------------ - name: Wait for LVMCluster CRD to be available kubernetes.core.k8s_info: api_version: apiextensions.k8s.io/v1 kind: CustomResourceDefinition name: lvmclusters.lvm.topolvm.io register: __lvms_operator_crd until: __lvms_operator_crd.resources | length > 0 retries: "{{ __lvms_operator_wait_retries }}" delay: 10 - name: Wait for LVMS operator deployment to be ready kubernetes.core.k8s_info: api_version: apps/v1 kind: Deployment namespace: "{{ lvms_operator_namespace }}" label_selectors: - "operators.coreos.com/{{ lvms_operator_name }}.{{ lvms_operator_namespace }}" register: __lvms_operator_deploy until: >- __lvms_operator_deploy.resources | length > 0 and (__lvms_operator_deploy.resources | rejectattr('status.readyReplicas', 'undefined') | selectattr('status.readyReplicas', '>=', 1) | list | length) == (__lvms_operator_deploy.resources | length) retries: "{{ __lvms_operator_wait_retries }}" delay: 10 # ------------------------------------------------------------------ # Step 3: Create LVMCluster # ------------------------------------------------------------------ - name: Create LVMCluster kubernetes.core.k8s: state: present definition: apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: lvms-cluster namespace: "{{ lvms_operator_namespace }}" spec: storage: deviceClasses: - name: "{{ lvms_operator_vg_name }}" default: true deviceSelector: paths: "{{ lvms_operator_device_paths }}" thinPoolConfig: name: thin-pool sizePercent: 90 overprovisionRatio: 10 # ------------------------------------------------------------------ # Step 4: Wait for LVMCluster to be ready # ------------------------------------------------------------------ - name: Wait for LVMCluster to be ready kubernetes.core.k8s_info: api_version: lvm.topolvm.io/v1alpha1 kind: LVMCluster namespace: "{{ lvms_operator_namespace }}" name: lvms-cluster register: __lvms_operator_cluster_status until: >- __lvms_operator_cluster_status.resources | length > 0 and (__lvms_operator_cluster_status.resources[0].status.state | default('')) == 'Ready' retries: "{{ __lvms_operator_wait_retries }}" delay: 10 - name: Verify StorageClass exists kubernetes.core.k8s_info: api_version: storage.k8s.io/v1 kind: StorageClass name: "{{ lvms_operator_storage_class_name }}" register: __lvms_operator_sc failed_when: __lvms_operator_sc.resources | length == 0 - name: Display LVMS summary ansible.builtin.debug: msg: - "LVM Storage deployment complete!" - " Namespace : {{ lvms_operator_namespace }}" - " Volume Group : {{ lvms_operator_vg_name }}" - " Device Paths : {{ lvms_operator_device_paths | join(', ') }}" - " StorageClass : {{ lvms_operator_storage_class_name }}"