This role allows users to configure local storage with minimal input.
As of now, the role supports managing file systems and mount entries on
- disks
- LVM volume groups
- Stratis pools (with Stratis v3 and newer)
Encryption (using LUKS) and RAID (using MD) is also supported. Support for managing pre-existing devices is limited, but new LVM volumes and Stratis filesystems can be added to existing setups and mount points and some other features can be added to (or removed from) existing devices.
See below
The role requires external collections. Use the following command to install them:
ansible-galaxy collection install -vv -r meta/collection-requirements.ymlNOTE: Beginning with version 1.3.0, unspecified parameters are interpreted
differently for existing and non-existing pools/volumes. For new/non-existent
pools and volumes, any omitted parameters will use the default value as
described in defaults/main.yml. For existing pools and volumes, omitted
parameters will inherit whatever setting the pool or volume already has.
This means that to change/override role defaults in an existing pool or volume,
you must explicitly specify the new values/settings in the role variables.
The storage_pools variable is a list of pools to manage. Each pool contains a
nested list of volume dicts as described below, as well as the following
keys:
-
nameThis specifies the name of the pool to manage/create as a string. (One example of a pool is an LVM volume group.)
-
typeThis specifies the type of pool to manage. Valid values for
type:lvm,stratis. -
stateValid values are
present(default behavior) orabsent. Pools marked asabsentwill be removed by the role. Pools marked aspresentwill be either created (if pool with the specifiednamedoesn't already exist) or preserved. -
grow_to_fillWhen set, the pool Physical Volumes will be resized to match their respective device sizes. (e.g. after Virtual Machine disk size increase)
Default:
falseNOTE: This argument is valid only for LVM pools.
-
sharedIf set to
true, the role creates or manages a shared volume group. Requires lvmlockd and dlm services configured and running.Default:
falseWARNING: Modifying the
sharedvalue on an existing pool is a destructive operation. The pool itself will be removed as part of the process.NOTE: This argument is valid only for LVM pools.
-
disksA list which specifies the set of disks to use as backing storage for the pool. Supported identifiers include: device node (like
/dev/sdaor/dev/mapper/mpathb), device node basename (likesdaormpathb), /dev/disk/ symlink (like/dev/disk/by-id/wwn-0x5000c5005bc37f3f).For LVM pools this can be also used to add and remove disks to/from an existing pool. Disks in the list that are not used by the pool will be added to the pool. Disks that are currently used by the pool but not present in the list will be removed from the pool only if
storage_safe_modeis set tofalse. -
raid_levelWhen used with
type: lvmit manages a volume group with a mdraid array of given level on it. Inputdisksare in this case used as RAID members. Accepted values are:linear,raid0,raid1,raid4,raid5,raid6,raid10 -
volumesThis is a list of volumes that belong to the current pool. It follows the same pattern as the
storage_volumesvariable, explained below. -
encryptionThis specifies whether the pool will be encrypted using LUKS. WARNING: Toggling encryption for a pool is a destructive operation, meaning the pool itself will be removed as part of the process of adding/removing the encryption layer.
-
encryption_passwordThis string specifies a password or passphrase used to unlock/open the LUKS volume(s).
-
encryption_keyThis string specifies the full path to the key file on the managed nodes used to unlock the LUKS volume(s). It is the responsibility of the user of this role to securely copy this file to the managed nodes, or otherwise ensure that the file is on the managed nodes.
-
encryption_cipherThis string specifies a non-default cipher to be used by LUKS.
-
encryption_key_sizeThis integer specifies the LUKS key size (in bytes).
-
encryption_luks_versionThis integer specifies the LUKS version to use.
-
encryption_clevis_pinFor Stratis pools, the clevis method that should be used to encrypt the created pool. Accepted values are:
tangandtpm2 -
encryption_tang_urlWhen creating a Stratis pool encrypted via NBDE using a tang server, specifies the URL of the server.
-
encryption_tang_thumbprintWhen creating a Stratis pool encrypted via NBDE using a tang server, specifies the thumbprint of the server.
The storage_volumes variable is a list of volumes to manage. Each volume has the following
variables:
-
nameThis specifies the name of the volume.
-
typeThis specifies the type of volume on which the file system will reside. Valid values for
type:lvm,disk,partitionorraid. The default is determined according to the OS and release (currentlylvm). -
stateValid values are
present(default behavior) orabsent. Volumes marked asabsentwill be removed by the role. Volumes marked aspresentwill be either created (if volume with specifiednamedoesn't exist) or preserved and possibly changed to match other values (for example if a volume with the specifiednameexists but doesn't have the requiredsizeit will be resized if possible). -
disksThis specifies the set of disks to use as backing storage for the file system. This is currently only relevant for volumes of type
disk, where the list must contain only a single item. -
sizeThe
sizespecifies the size of the file system. The format for this is intended to be human-readable, e.g.: "10g", "50 GiB". The size of LVM volumes can be specified as a percentage of the pool/VG size, eg: "50%" as of v1.4.2.When using
compressionordeduplication,sizecan be set higher than actual available space, e.g.: 3 times the size of the volume, based on duplicity and/or compressibility of stored data.NOTE: The requested volume size may be reduced as necessary so the volume can fit in the available pool space, but only if the required reduction is not more than 2% of the requested volume size.
-
fs_typeThis indicates the desired file system type to use, e.g.: "xfs", "ext4", "swap". The default is determined according to the OS and release (currently
xfsfor all the supported systems). Use "unformatted" if you do not want file system to be present. WARNING: Using "unformatted" file system type on an existing filesystem is a destructive operation and will destroy all data on the volume. -
fs_labelThe
fs_labelis a string to be used for a file system label. -
fs_create_optionsThe
fs_create_optionsspecifies custom arguments tomkfsas a string. -
mount_pointThe
mount_pointspecifies the directory on which the file system will be mounted. -
mount_optionsThe
mount_optionsspecifies custom mount options as a string, e.g.: 'ro'. -
mount_userThe
mount_userspecifies desired owner of the mount directory. -
mount_groupThe
mount_groupspecifies desired group of the mount directory. -
mount_modeThe
mount_modespecifies desired permissions of the mount directory. -
raid_levelSpecifies RAID level. LVM RAID can be created as well. "Regular" RAID volume requires type to be
raid. LVM RAID needs that volume hasstorage_poolsparent with typelvm,raid_disksneed to be specified as well. Accepted values are:- for LVM RAID volume:
raid0,raid1,raid4,raid5,raid6,raid10,striped,mirror - for RAID volume:
linear,raid0,raid1,raid4,raid5,raid6,raid10
WARNING: Changing
raid_levelfor a volume is a destructive operation, meaning all data on that volume will be lost as part of the process of removing old and adding new RAID. RAID reshaping is currently not supported. - for LVM RAID volume:
-
raid_device_countWhen type is
raidspecifies number of active RAID devices. -
raid_spare_countWhen type is
raidspecifies number of spare RAID devices. -
raid_metadata_versionWhen type is
raidspecifies RAID metadata version as a string, e.g.: '1.0'. -
raid_chunk_sizeWhen type is
raidspecifies RAID chunk size as a string, e.g.: '512 KiB'. Chunk size has to be multiple of 4 KiB. -
raid_stripe_sizeWhen type is
lvmspecifies LVM RAID stripe size as a string, e.g.: '512 KiB'. -
raid_disksSpecifies which disks should be used for LVM RAID volume.
raid_levelneeds to be specified and volume has to havestorage_poolsparent with typelvm. Accepts sublist ofdisksof parentstorage_pools. In case multiple LVM RAID volumes within the same storage pool, the same disk can be used in multipleraid_disks. -
encryptionThis specifies whether the volume will be encrypted using LUKS. WARNING: Toggling encryption for a volume is a destructive operation, meaning all data on that volume will be removed as part of the process of adding/removing the encryption layer.
-
encryption_passwordThis string specifies a password or passphrase used to unlock/open the LUKS volume.
-
encryption_keyThis string specifies the full path to the key file on the managed nodes used to unlock the LUKS volume(s). It is the responsibility of the user of this role to securely copy this file to the managed nodes, or otherwise ensure that the file is on the managed nodes.
-
encryption_cipherThis string specifies a non-default cipher to be used by LUKS.
-
encryption_key_sizeThis integer specifies the LUKS key size (in bits).
-
encryption_luks_versionThis integer specifies the LUKS version to use.
-
deduplicationThis specifies whether the Virtual Data Optimizer (VDO) will be used. When set, duplicate data stored on storage volume will be deduplicated resulting in more storage capacity. Can be used together with
compressionandvdo_pool_size. Volume has to be part of the LVMstorage_pool. Limit one VDOstorage_volumeperstorage_pool. Underlying volume has to be at least 9 GB (bare minimum is around 5 GiB). -
compressionThis specifies whether the Virtual Data Optimizer (VDO) will be used. When set, data stored on storage volume will be compressed resulting in more storage capacity. Volume has to be part of the LVM
storage_pool. Can be used together withdeduplicationandvdo_pool_size. Limit one VDOstorage_volumeperstorage_pool. -
vdo_pool_sizeWhen Virtual Data Optimizer (VDO) is used, this specifies the actual size the volume will take on the device. Virtual size of VDO volume is set by
sizeparameter.vdo_pool_sizeformat is intended to be human-readable, e.g.: "30g", "50GiB". Default value is equal to the size of the volume. -
cachedThis specifies whether the volume should be cached or not. This is currently supported only for LVM volumes where dm-cache is used.
-
cache_sizeSize of the cache.
cache_sizeformat is intended to be human-readable, e.g.: "30g", "50GiB". -
cache_modeMode for the cache. Supported values include
writethrough(default) andwriteback. -
cache_devicesList of devices that will be used for the cache. These should be either physical volumes or drives these physical volumes are allocated on. Generally you want to select fast devices like SSD or NVMe drives for cache.
-
thinWhether the volume should be thinly provisioned or not. This is supported only for LVM volumes.
-
thin_pool_nameFor
thinvolumes, this can be used to specify the name of the LVM thin pool that will be used for the volume. If the pool with the provided name already exists, the volume will be added to that pool. If it doesn't exist a new pool namedthin_pool_namewill be created. If not specified:- if there are no existing thin pools present, a new thin pool will be created with an automatically generated name,
- if there is exactly one existing thin pool, the thin volume will be added to it and
- if there are multiple thin pools present an exception will be raised.
-
thin_pool_sizeSize for the thin pool.
thin_pool_sizeformat is intended to be human-readable, e.g.: "30g", "50GiB". -
part_typeThis specifies partition type for newly created partitions on MSDOS/MBR partition table. Supported values include
primary,extendedandlogical. If not specified, first three partitions on the disk will be created as primary and fourth one will be created as logical inside a newly created extended partition.part_typeis ignored on GPT partition table.
When true (the default), an error will occur instead of automatically removing existing devices and/or formatting.
When true (the default is false), the role will use udevadm trigger to cause udev changes to take effect immediately. This may help on some platforms with "buggy" udev.
- name: Manage storage
hosts: all
roles:
- name: linux-system-roles.storage
storage_pools:
- name: app
disks:
- sdb
- sdc
volumes:
- name: shared
size: "100 GiB"
mount_point: "/mnt/app/shared"
#fs_type: xfs
state: present
- name: users
size: "400g"
fs_type: ext4
mount_point: "/mnt/app/users"
storage_volumes:
- name: images
type: disk
disks: ["mpathc"]
mount_point: /opt/images
fs_label: images
See README-ostree.md
MIT