How to mount partition when NTFS only

177 views
Skip to first unread message

Gilberto Valentin

unread,
Jul 25, 2017, 8:42:25 AM7/25/17
to Ansible Project
Hello,

I have a playbook that scans for hard drives and mounts them in order to do a backup of the data from those drives. I am able to scan for the drives just fine and I can also mount them (thanks to the Ansible IRC community). The only issue I am having is mounting ONLY when the partition is fstype: ntfs. As you can see below, when I run the parted module, I can see a key value of fstype: ntfs

ok: [localhost] => (item=sda) => {
    "changed": false,
    "disk": {
        "dev": "/dev/sda",
        "logical_block": 512,
        "model": "VMware Virtual disk",
        "physical_block": 512,
        "size": 33554432.0,
        "table": "msdos",
        "unit": "kib"
    },
    "invocation": {
        "module_args": {
            "align": "optimal",
            "device": "/dev/sda",
            "flags": null,
            "label": null,
            "name": null,
            "number": null,
            "part_end": "100%",
            "part_start": "0%",
            "part_type": "primary",
            "state": "info",
            "unit": "KiB"
        }
    },
    "item": "sda",
    "partitions": [
        {
            "begin": 1024.0,
            "end": 308224.0,
            "flags": [
                "boot"
            ],
            "fstype": "ntfs",
            "num": 1,
            "size": 307200.0,
            "unit": "kib"
        },
        {
            "begin": 308224.0,
            "end": 33553408.0,
            "flags": [],
            "fstype": "ntfs",
            "num": 2,
            "size": 33245184.0,
            "unit": "kib"
        }
    ],
    "script": "unit 'KiB' print"
}

I use the setup module to scan for the devices and the parted module to see the fstype. Thinking about it further, I should probably just use the parted module to get me both since parted does provide both.

Using parted alone without setup, how can I tell my mount task to just mount ONLY if the fstype is ntfs? Here is my current playbook:

---
## This playbook will backup user data from HD's found

- name: Backup data
hosts: all
connection: local
become: true
become_user: root
become_method: su
#vars_files:
# - vault.yml
#remote_user: root

tasks:
- name: Install jmespath via pip if missing
pip:
name: jmespath
- name: Check for hard drive devices
setup:
filter: ansible_devices

- name: Check for hard drive devices
parted: device=/dev/{{ item }}
register: driveFStype
with_items: "{{ json_query('*.partitions.keys(@)[]') }}"

- name:
mount:
path: "/mnt/{{ item }}"
src: "/dev/{{ item }}"
fstype: ntfs
state: mounted
with_items: "{{ ansible_devices | json_query('*.partitions.keys(@)[]') }}"



The Check for hard drive device task above doesn't work. The rest of the tasks do. I was thinking I could do something like this playbook below to get what I want but it doesn't work either:

---
## This playbook will backup user data from HD's found

- name: Backup data
hosts: all
connection: local
become: true
become_user: root
become_method: su
#vars_files:
# - vault.yml
#remote_user: root

tasks:
- name: Install jmespath via pip if missing
pip:
name: jmespath
- name: Check for hard drive fstype
parted: device=/dev/{{ item }}
register: whichFS
with_items: "{{ json_query('*.partitions.fstype.keys(@)[]') }}"

- name: Check for hard drive devices
parted: device=/dev/{{ item }}
register: whichPartition
with_items: "{{ json_query('*.partitions.keys(@)[]') }}"

- name:
mount:
path: "/mnt/{{ item }}"
src: "/dev/{{ item }}"
fstype: ntfs
state: mounted
with_items: "{{ ansible_devices | json_query('*.partitions.keys(@)[]') }}"
when: "{{ whichFS }}" == ntfs



In summary, I want to mount any device it finds ONLY if it is NTFS

Gilberto Valentin

unread,
Jul 27, 2017, 12:10:19 PM7/27/17
to Ansible Project
Any suggestions? :)

Kai Stian Olstad

unread,
Jul 27, 2017, 1:00:14 PM7/27/17
to ansible...@googlegroups.com
On 27. juli 2017 18:10, Gilberto Valentin wrote:
> Any suggestions? :)

You should check your with_items: under "Check for hard drive devices"
it's in practice empty.

--
Kai Stian Olstad

Gilberto Valentin

unread,
Jul 31, 2017, 7:26:53 PM7/31/17
to Ansible Project, ansible-pr...@olstad.com
Kai,

Thanks for the response. Can you elaborate on what you by "it's in practice empty"? From what I can tell, I am parted to then pull the key values for a list of drives. This doesn't fully work based on what I am trying to do. In essence, I am looking for help to accomplish what I want and that would be filtering through partitions that are NTFS only. An example, if you have one, would be great. I am still lost on how to only list out and mount partitions that are NTFS only

Kai Stian Olstad

unread,
Jul 31, 2017, 8:09:31 PM7/31/17
to ansible...@googlegroups.com
On 01. aug. 2017 01:26, Gilberto Valentin wrote:
> On Thursday, July 27, 2017 at 1:00:14 PM UTC-4, Kai Stian Olstad wrote:
>>
>> On 27. juli 2017 18:10, Gilberto Valentin wrote:
>>> Any suggestions? :)
>>
>> You should check your with_items: under "Check for hard drive devices"
>> it's in practice empty.
>
> Thanks for the response. Can you elaborate on what you by "it's in practice
> empty"? From what I can tell, I am parted to then pull the key values for a
> list of drives. This doesn't fully work based on what I am trying to do. In
> essence, I am looking for help to accomplish what I want and that would be
> filtering through partitions that are NTFS only. An example, if you have
> one, would be great. I am still lost on how to only list out and mount
> partitions that are NTFS only

json_query is a filter, for a filter to work it need content.
When you only use a filter and not any content it's basically empty.

- name: Check for hard drive devices
parted: device=/dev/{{ item }}
register: driveFStype
with_items: "{{ json_query('*.partitions.keys(@)[]') }}"

Here you only have a filter in with_items, no content at all.


- name:
mount:
path: "/mnt/{{ item }}"
src: "/dev/{{ item }}"
fstype: ntfs
state: mounted
with_items: "{{ ansible_devices |
json_query('*.partitions.keys(@)[]') }}"

Here you have content in the form of the variable ansible_device that's
why this task work and the task above fails.


--
Kai Stian Olstad

Gilberto Valentin

unread,
Jul 31, 2017, 10:15:01 PM7/31/17
to Ansible Project, ansible-pr...@olstad.com
Yep, I get that...my point is I don't know how to pull the NTFS partition info from the filter. It seems like a nested key pair value and I don't know how to extract it for comparison

Gilberto Valentin

unread,
Aug 1, 2017, 1:48:45 PM8/1/17
to Ansible Project
I got a bit further. I was able to add the following:

tasks:
    - name: Install jmespath via pip if missing
      pip:
        name: jmespath

    - name: check for hard drive devices
      setup:
        filter: ansible_devices
      tags:
        - test

    - name: get device info
      parted: device=/dev/{{ item.key }} unit=MiB
      register: results
      tags:
        - test
      ignore_errors: yes
      with_dict: "{{ ansible_devices }}"

    - name: mount ntfs partitions
      mount:
        path: "/mnt/{{ item.item }}"
        src: "{{ item.disk.dev }}"
        fstype: ntfs
      when: "item.partitions | length > 0 and item.partitions | selectattr('fstype', 'equalto', 'ntfs') | list | length > 0"
      with_items: "{{ results.results }}"
      tags:
       - test

However, I am getting the following errors:

PLAY [Backup customer data] **************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************
ok: [localhost]
TASK [check for hard drive devices] ******************************************************************************************************************************************************************
ok: [localhost]
TASK [get device info] *******************************************************************************************************************************************************************************
failed: [localhost] (item={'key': u'sr0', 'value': {u'scheduler_mode': u'cfq', u'sectorsize': u'512', u'vendor': u'NECVMWar', u'sectors': u'2097151', u'sas_device_handle': None, u'sas_address': None, u'host': u'IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)', u'rotational': u'1', u'removable': u'1', u'support_discard': u'0', u'holders': [], u'partitions': {}, u'model': u'VMware IDE CDR10', u'size': u'1024.00 MB'}}) => {"err": "Error: Error opening /dev/sr0: No medium found\n", "failed": true, "item": {"key": "sr0", "value": {"holders": [], "host": "IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)", "model": "VMware IDE CDR10", "partitions": {}, "removable": "1", "rotational": "1", "sas_address": null, "sas_device_handle": null, "scheduler_mode": "cfq", "sectors": "2097151", "sectorsize": "512", "size": "1024.00 MB", "support_discard": "0", "vendor": "NECVMWar"}}, "msg": "Error while getting device information with parted script: '/usr/sbin/parted -s -m /dev/sr0 -- unit 'MiB' print'", "out": "", "rc": 1}
ok: [localhost] => (item={'key': u'sda', 'value': {u'scheduler_mode': u'cfq', u'sectorsize': u'512', u'vendor': u'VMware', u'sectors': u'67108864', u'sas_device_handle': None, u'sas_address': None, u'host': u'Serial Attached SCSI controller: LSI Logic / Symbios Logic SAS1068 PCI-X Fusion-MPT SAS (rev 01)', u'rotational': u'1', u'removable': u'0', u'support_discard': u'0', u'holders': [], u'partitions': {u'sda2': {u'sectorsize': 512, u'uuid': u'A880A12480A0FA48', u'sectors': u'66490368', u'start': u'616448', u'holders': [], u'size': u'31.71 GB'}, u'sda1': {u'sectorsize': 512, u'uuid': u'9844A05B44A03E3E', u'sectors': u'614400', u'start': u'2048', u'holders': [], u'size': u'300.00 MB'}}, u'model': u'Virtual disk', u'size': u'32.00 GB'}})
...ignoring
TASK [mount ntfs partitions] *************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check 'item.partitions | length > 0 and item.partitions | selectattr('fstype', 'equalto', 'ntfs') | list | length > 0' failed. The error was: error while evaluating conditional (item.partitions | length > 0 and item.partitions | selectattr('fstype', 'equalto', 'ntfs') | list | length > 0): 'dict object' has no attribute 'partitions'\n\nThe error appears to have been in '/home/svcacctansible/automation/backup/customerBackup.yml': line 35, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: mount ntfs partitions\n      ^ here\n"}
to retry, use: --limit @/home/svcacctansible/automation/backup/customerBackup.retry
PLAY RECAP *******************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=1

I'm only wanting to mount any partition that is NTFS

On Tuesday, July 25, 2017 at 8:42:25 AM UTC-4, Gilberto Valentin wrote:

Gilberto Valentin

unread,
Aug 1, 2017, 7:29:02 PM8/1/17
to Ansible Project
I was able to resolve this by redoing all of my tasks as follows:

tasks:
    - name: Install jmespath via pip if missing
      pip:
        name: jmespath

    - name: run the setup module for some facts about the hardware
      setup:
        filter: ansible_devices
      tags:
        - new

    - name: check what drives are available
      parted:
        device: /dev/{{ item }}
      with_items: "{{ ansible_devices }}"
      when:
        - item != 'sr0'
      register: result

    - name: get a list of paritions that are only ntfs
      debug:
        msg: "{{ item.0.disk.dev }}{{ (item.0.disk.table == 'loop') | ternary('', item.1.num) }}"
      when: item.1.fstype == 'ntfs'
      with_subelements:
        - "{{ result.results }}"
        - partitions

    - name: mount ntfs partitions
      mount:
        path: "/mnt/{{ item.0.disk.dev }}{{ (item.0.disk.table == 'loop') | ternary('', item.1.num) }}"
        src: "{{ item.0.disk.dev }}{{ (item.0.disk.table == 'loop') | ternary('', item.1.num) }}"
        fstype: ntfs
        state: mounted
      when: item.1.fstype == 'ntfs'
      # when: results.item.value.partitions.fstype == "ntfs"
      with_subelements:
        - "{{ result.results }}"
        - partitions



On Tuesday, July 25, 2017 at 8:42:25 AM UTC-4, Gilberto Valentin wrote:
Reply all
Reply to author
Forward
0 new messages