136 lines
4.6 KiB
YAML
136 lines
4.6 KiB
YAML
---
|
|
# 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 }}"
|