--- - name: Converge hosts: all pre_tasks: - name: Get /root/image.img stats ansible.builtin.stat: path: /root/image.img register: xfs_project_quotas_img_stat - name: Create image file when: not xfs_project_quotas_img_stat.stat.exists ansible.builtin.command: dd if=/dev/zero of=/root/image.img bs=1M count=400 register: xfs_project_quotas_dd_result changed_when: xfs_project_quotas_dd_result.rc == 0 - name: Get linked loop devices ansible.builtin.command: losetup -a changed_when: false register: xfs_project_quotas_loop_devs - name: Link image to loop device when: "'/root/image.img' not in xfs_project_quotas_loop_devs.stdout" ansible.builtin.command: losetup --find --show -P /root/image.img register: xfs_project_quotas_loop_device changed_when: "'/dev/loop' in xfs_project_quotas_loop_device.stdout" - name: Get all loop devices ansible.builtin.command: losetup -a register: xfs_project_quotas_losetup_out changed_when: false - name: Find line with /root/image.img ansible.builtin.set_fact: xfs_project_quotas_matched_line: "{{ xfs_project_quotas_losetup_out.stdout_lines | select('search', '/root/image.img') | list | first | default('') }}" - name: Extract loop device name (/dev/loopN) ansible.builtin.set_fact: xfs_project_quotas_loop_dev: "{{ xfs_project_quotas_matched_line | regex_search('(/dev/loop[0-9]+)', '\\1') | default('') }}" - name: Debug result ansible.builtin.debug: msg: "/root/image.img is linked to {{ xfs_project_quotas_loop_dev[0] }}" when: xfs_project_quotas_loop_dev != '' - name: Make xfs filesystem community.general.filesystem: fstype: xfs dev: "{{ xfs_project_quotas_loop_dev[0] }}" - name: Mount xfs virtual disk ansible.posix.mount: path: /mnt src: /root/image.img fstype: xfs opts: defaults,prjquota state: mounted roles: - role: genlab.common.xfs_project_quotas projects: "{{ lookup('file', 'configuration/example.yml') | from_yaml }}" storage_mountpoint: "/mnt"