Chapter 2. Managing local storage by using RHEL system roles
			To manage LVM and local file systems (FS) by using Ansible, you can use the storage role, which is one of the RHEL system roles available in RHEL 8.
		
			Using the storage role enables you to automate administration of file systems on disks and logical volumes on multiple machines and across all versions of RHEL starting with RHEL 7.7.
		
For more information about RHEL system roles and how to apply them, see Introduction to RHEL system roles.
2.1. Creating an XFS file system on a block device by using the storage RHEL system role
				The example Ansible playbook uses the storage role to create an XFS file system on a block device using the default parameters. If the file system on the /dev/sdb device or the mount point directory does not exist, the playbook creates them.
			
					The storage role can create a file system only on an unpartitioned, whole disk or a logical volume (LV). It cannot create the file system on a partition.
				
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - The setting specified in the example playbook include the following: - name: barefs
- 
									The volume name (barefsin the example) is currently arbitrary. Thestoragerole identifies the volume by the disk device listed under thedisksattribute.
- fs_type: <file_system>
- 
									You can omit the fs_typeparameter if you want to use the default file system XFS.
- disks: <list_of_disks_and_volumes>
- A YAML list of disk and LV names. To create the file system on an LV, provide the LVM setup under the - disksattribute, including the enclosing volume group. For details, see Creating or resizing a logical volume by using the storage RHEL system role.- Do not provide the path to the LV device. 
 - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.2. Persistently mounting a file system by using the storage RHEL system role
				The example Ansible playbook uses the storage role to persistently mount an existing file system. It ensures that the file system is immediately available and persistently mounted by adding the appropriate entry to the /etc/fstab file. This allows the file system to remain mounted across reboots. If the file system on the /dev/sdb device or the mount point directory does not exist, the playbook creates them.
			
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.3. Creating or resizing a logical volume by using the storage RHEL system role
				Use the storage role to perform the following tasks:
			
- To create an LVM logical volume in a volume group consisting of many disks
- To resize an existing file system on LVM
- To express an LVM volume size in percentage of the pool’s total size
If the volume group does not exist, the role creates it. If a logical volume exists in the volume group, it is resized if the size does not match what is specified in the playbook.
If you are reducing a logical volume, to prevent data loss you must ensure that the file system on that logical volume is not using the space in the logical volume that is being reduced.
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - The settings specified in the example playbook include the following: - size: <size>
- You must specify the size by using units (for example, GiB) or percentage (for example, 60%).
 - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- Verify that specified volume has been created or resized to the requested size: - ansible managed-node-01.example.com -m command -a 'lvs myvg' - # ansible managed-node-01.example.com -m command -a 'lvs myvg'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.4. Enabling online block discard by using the storage RHEL system role
You can mount an XFS file system with the online block discard option to automatically discard unused blocks.
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- Verify that online block discard option is enabled: - ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data' - # ansible managed-node-01.example.com -m command -a 'findmnt /mnt/data'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.5. Creating and mounting a file system by using the storage RHEL system role
				The example Ansible playbook uses the storage role to create and mount a file system. It ensures that the file system is immediately available and persistently mounted by adding the appropriate entry to the /etc/fstab file. This allows the file system to remain mounted across reboots. If the file system on the /dev/sdb device or the mount point directory does not exist, the playbook creates them.
			
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - The setting specified in the example playbook include the following: - disks: <list_of_devices>
- A YAML list of device names that the role uses when it creates the volume.
- fs_type: <file_system>
- 
									Specifies the file system the role should set on the volume. You can select xfs,ext3,ext4,swap, orunformatted.
- label-name: <file_system_label>
- Optional: sets the label of the file system.
- mount_point: <directory>
- 
									Optional: if the volume should be automatically mounted, set the mount_pointvariable to the directory to which the volume should be mounted.
 - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.6. Configuring a RAID volume by using the storage RHEL system role
				With the storage system role, you can configure a RAID volume on RHEL by using Red Hat Ansible Automation Platform and Ansible-Core. Create an Ansible playbook with the parameters to configure a RAID volume to suit your requirements.
			
Device names might change in certain circumstances, for example, when you add a new disk to a system. Therefore, to prevent data loss, use persistent naming attributes in the playbook. For more information about persistent naming attributes, see Overview of persistent naming attributes.
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- Verify that the array was correctly created: - ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data' - # ansible managed-node-01.example.com -m command -a 'mdadm --detail /dev/md/data'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.7. Configuring an LVM pool with RAID by using the storage RHEL system role
				With the storage system role, you can configure an LVM pool with RAID on RHEL by using Red Hat Ansible Automation Platform. You can set up an Ansible playbook with the available parameters to configure an LVM pool with RAID.
			
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- Verify that your pool is on RAID: - ansible managed-node-01.example.com -m command -a 'lsblk' - # ansible managed-node-01.example.com -m command -a 'lsblk'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.8. Configuring a stripe size for RAID LVM volumes by using the storage RHEL system role
				With the storage system role, you can configure a stripe size for RAID LVM volumes on RHEL by using Red Hat Ansible Automation Platform. You can set up an Ansible playbook with the available parameters to configure an LVM pool with RAID.
			
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- Verify that stripe size is set to the required size: - ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume' - # ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.9. Configuring an LVM-VDO volume by using the storage RHEL system role
				You can use the storage RHEL system role to create a VDO volume on LVM (LVM-VDO) with enabled compression and deduplication.
			
					Because of the storage system role use of LVM-VDO, only one volume can be created per pool.
				
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - The settings specified in the example playbook include the following: - vdo_pool_size: <size>
- The actual size that the volume takes on the device. You can specify the size in human-readable format, such as 10 GiB. If you do not specify a unit, it defaults to bytes.
- size: <size>
- The virtual size of VDO volume.
 - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --syntax-check ~/playbook.yml - $ ansible-playbook --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook ~/playbook.yml - $ ansible-playbook ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- View the current status of compression and deduplication: - ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state' - $ ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state' LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDOCompression VDOCompressionState VDODeduplication VDOIndexState mylv1 myvg vwi-a-v--- 3.00t vpool0 enabled online enabled online- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.10. Creating a LUKS2 encrypted volume by using the storage RHEL system role
				You can use the storage role to create and configure a volume encrypted with LUKS by running an Ansible playbook.
			
Prerequisites
- You have prepared the control node and the managed nodes.
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
- 
						The account you use to connect to the managed nodes has sudopermissions on them.
Procedure
- Store your sensitive variables in an encrypted file: - Create the vault: - ansible-vault create ~/vault.yml - $ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- After the - ansible-vault createcommand opens an editor, enter the sensitive data in the- <key>: <value>format:- luks_password: <password> - luks_password: <password>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Save the changes, and close the editor. Ansible encrypts the data in the vault.
 
- Create a playbook file, for example, - ~/playbook.yml, with the following content:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - For details about all variables used in the playbook, see the - /usr/share/ansible/roles/rhel-system-roles.storage/README.mdfile on the control node.
- Validate the playbook syntax: - ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml - $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Note that this command only validates the syntax and does not protect against a wrong but valid configuration. 
- Run the playbook: - ansible-playbook --ask-vault-pass ~/playbook.yml - $ ansible-playbook --ask-vault-pass ~/playbook.yml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
Verification
- Find the - luksUUIDvalue of the LUKS encrypted volume:- ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb' - # ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb' 4e4e7970-1822-470e-b55a-e91efe5d0f5c- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- View the encryption status of the volume: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Verify the created LUKS encrypted volume: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow