Find all instances, and build a list

I have a file, as an example, with the following content:

disk = [file:/OVS/Repositories/0004fb0000030000df2ee11376f1cd94/VirtualDisks/b7558d7745c14b02806d08f8003906e1.img,xvda,w,phy:/OVS/Repositories/0004fb0000030000df2ee11376f1cd94/VirtualDisks/0004fb0000120000049ec392e534e039,xvdb,w,file:/OVS/Repositories/0004fb0000030000df2ee11376f1cd94/VirtualDisks/0004fb0000120000843bb7e2fe395f24.img,xvdc,w]

I wish to find all instances of image files, and build a list with them. Here is my regexp:

(\w+.img)

Here is a regexp tester with all of the above:
https://regex101.com/r/UKcYIa/3

I know that I can do this with shell, or similar modules, but I wish to do this in a more ansible-native way (if there is one). Is there a module that will allow me to search a file with a regular expression and then register the results to a variable? I just want to build a list of *img files (can be more than 1 and probably wont exceed 10) so that I can manipulate them later.

I am trying the following, but it isn’t quite working like I hoped:

`

  • name: Gather current virtual disks
    lineinfile:
    path: “{{ file }}”
    regexp: (\w+.img)
    line: ‘’
    check_mode: yes
    register: virt_disk

`

Result (debug of virt_disk):

`
ok: [myftpserver] => {
“virt_disk”: {
“backup”: “”,
“changed”: true,
“diff”: [
{
“after”: “”,
“after_header”: “/var/ftp/vm.cfg (content)”,
“before”: “”,
“before_header”: “/var/ftp/vm.cfg (content)”
},
{
“after_header”: “/var/ftp/vm.cfg (file attributes)”,
“before_header”: “/var/ftp/vm.cfg (file attributes)”
}
],
“failed”: false,
“msg”: “line replaced”
}
}

`

Hi
Read the file contents with the ‘file’ lookup https://docs.ansible.com/ansible/2.6/plugins/lookup/file.html then run regexp filter on the lookup result: https://docs.ansible.com/ansible/2.5/user_guide/playbooks_filters.html#regular-expression-filters
eg: “{{ lookup(‘file’, ‘/path/to/file’) | regex_findall(‘(\w+.img)’) }}”

Great! Thank you.

Perhaps I am doing this wrong, but it doesn’t like my syntax. If I escape the backslash (‘\w+.img’) it tries to run but with a different error:

`

  • name: Find virtual Disks
    set_fact:
    virt_disks: “{{ lookup(‘file’,‘/var/ftp/vm.cfg’) | regex_findall(‘\w+.img’) }}”
    `

Result:

`
ERROR! Syntax Error while loading YAML.
found unknown escape character

The error appears to have been in ‘/etc/ansible/playbooks/one-offs/sanitize_vm.yml’: line 21, column 75, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

set_fact:
virt_disks: “{{ lookup(‘file’,‘/var/ftp/vm.cfg’) | regex_findall(‘\w+.img’) }}”
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:

with_items:

  • {{ foo }}

Should be written as:

with_items:

  • “{{ foo }}”

`

If I escape the backslash:

`
TASK [Find virtual Disks] ****************************************************************************************************************************************************************************************************************
[WARNING]: Unable to find ‘/var/ftp/vm.cfg’ in expected paths (use -vvvvv to see paths)

fatal: [ovmftp]: FAILED! => {“msg”: “An unhandled exception occurred while running the lookup plugin ‘file’. Error was a <class ‘ansible.errors.AnsibleError’>, original message: could not locate file in lookup: /var/ftp/vm.cfg”}

`

I find the error strange on the last one, because I stat the file previous to it and can see it fine.

Perhaps I am doing this wrong, but it doesn't like my syntax. If I escape
the backslash ('\\w+.img') it tries to run but with a different error:
    - name: Find virtual Disks
      set_fact:
        virt_disks: "{{ lookup('file','/var/ftp/vm.cfg') |
regex_findall('\w+.img') }}"

Result:
ERROR! Syntax Error while loading YAML.
  found unknown escape character

The error appears to have been in
'/etc/ansible/playbooks/one-offs/sanitize_vm.yml': line 21, column 75, but
may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      set_fact:
        virt_disks: "{{ lookup('file','/var/ftp/vm.cfg') | regex_findall('\w+.img') }}"

<snip />

I find the error strange on the last one, because I stat the file previous
to it and can see it fine.

In your set_fact, try to swap your single quotes to double quotes and you double to single quotes.

Now, whether escaped or not it says it can’t find the file. Do I need to delegate_to in set_fact? or should it be looking on the host specified?

John,

Thx Piotr. That works. I was hoping to be able to do this without shell, but I haven’t been able to find another way around it either.

lookup plugins run only on localhost not remote, if you file is on the host you can't use lookup.

Yeah, I’ve turned a full circle… Sorry, but I don’t have a better solution…

Piotr

A lot more code.
First use the slurp module to fetch the content and store it to a variable.
The result is base64 encode, so you need to use b64decode filer and then you can use the regex filter.