json_query & regular expression

1,845 views
Skip to first unread message

Kiran Kumar

unread,
Apr 12, 2020, 12:26:28 AM4/12/20
to Ansible Project
In jason query how can i add regular expression ? eg if have vm1, vm2,vm3 below query can be adjusted ? eg       query: "[?guest_name == 'vm*' ]" , seems does not work in below case 



Thanks


---
- hosts: localhost
  vars_files:
    - vcsim_vars.yml
  tasks:
  - name: Gather all VMs information
    vmware_vm_info:
      hostname: '{{ vcenter_hostname }}'
      username: '{{ vcenter_username }}'
      password: '{{ vcenter_password }}'
      validate_certs: no
    register: vm_facts
    delegate_to: localhost
  - debug:
      msg:  "{{ item.ip_address }}"
    with_items:
    - "{{ vm_facts.virtual_machines | json_query(query) }}"
    vars:
      query: "[?guest_name == 'vm1' ]"

Vladimir Botka

unread,
Apr 12, 2020, 1:02:06 AM4/12/20
to Kiran Kumar, ansible...@googlegroups.com
On Sat, 11 Apr 2020 21:26:28 -0700 (PDT)
Kiran Kumar <esxi...@gmail.com> wrote:

> In jason query how can i add regular expression ? eg if have vm1, vm2,vm3
> below query can be adjusted ? eg query: "[?guest_name == 'vm*' ]" ,
> seems does not work in below case
>
> > tasks:
> > - name: Gather all VMs information
> > vmware_vm_info:
> > hostname: '{{ vcenter_hostname }}'
> > username: '{{ vcenter_username }}'
> > password: '{{ vcenter_password }}'
> > validate_certs: no
> > register: vm_facts
> > delegate_to: localhost
> > - debug:
> > msg: "{{ item.ip_address }}"
> > with_items:
> > - "{{ vm_facts.virtual_machines | json_query(query) }}"
> > vars:
> > query: "[?guest_name == 'vm1' ]"

Filter "selectattr" should do the job. For example

- debug:
msg: "{{ item.ip_address }}"
loop: "{{ vm_facts|
selectattr('guest_name', 'match', '^vm1$')|
list }}"
- debug:
msg: "{{ item.ip_address }}"
loop: "{{ vm_facts|
selectattr('guest_name', 'match', '^vm(.*)$')|
list }}"

I'm not aware of regex in JMESPath.
https://jmespath.readthedocs.io/en/latest/

HTH,

-vlado

Kiran Kumar

unread,
Apr 12, 2020, 2:35:16 AM4/12/20
to Ansible Project
Thanks for the Reply Valdo

I get error 

TASK [debug] *********************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "'str object' has no attribute 'guest_name'"}

Vladimir Botka

unread,
Apr 12, 2020, 3:01:30 AM4/12/20
to Kiran Kumar, ansible...@googlegroups.com
On Sat, 11 Apr 2020 23:35:16 -0700 (PDT)
Kiran Kumar <esxi...@gmail.com> wrote:

> I get error
> TASK [debug]
***********************************************************************************************************************>
fatal: [localhost]: FAILED! => {"msg": "'str object' has no attribute
> 'guest_name'"}

Take a look at the structure of "vm_fact" and fix it. If you still have issues
post:

- debug:
var: vm_fact

Kiran Kumar

unread,
Apr 12, 2020, 3:26:39 AM4/12/20
to Ansible Project
Thanks for your reply Valdo. This is a JSON output 

            {
                "attributes": {},
                "cluster": "xx",
                "esxi_hostname": "xx",
                "guest_fullname": "Microsoftxx",
                "guest_name": "xx",
                "ip_address": "xx",
                "mac_address": [
                    "xx"
                ],
                "power_state": "poweredOn",
                "tags": [],
                "uuid": "xx",
                "vm_network": {
                    "xx": {
                        "ipv4": [
                            "xx"
                        ],
                        "ipv6": []
                    }


I am reading about - selectattr - as i am new to this. 

Thanks 

Vladimir Botka

unread,
Apr 12, 2020, 7:56:54 AM4/12/20
to Kiran Kumar, ansible...@googlegroups.com
On Sun, 12 Apr 2020 00:26:39 -0700 (PDT)
Kiran Kumar <esxi...@gmail.com> wrote:

> {
> "attributes": {},
> "cluster": "xx",
> "esxi_hostname": "xx",
> "guest_fullname": "Microsoftxx",
> "guest_name": "xx",
> "ip_address": "xx",
> "mac_address": [
> "xx"
> ],
> "power_state": "poweredOn",
> "tags": [],
> "uuid": "xx",
> "vm_network": {
> "xx": {
> "ipv4": [
> "xx"
> ],
> "ipv6": []
> }
>
> > fatal: [localhost]: FAILED! => {"msg": "'str object' has no attribute
> > > 'guest_name'"}
> > > >
> > > > - debug:
> > > > msg: "{{ item.ip_address }}"
> > > > loop: "{{ vm_facts|
> > > > selectattr('guest_name', 'match', '^vm(.*)$')|
> > > > list }}"

There shouldn't be any problem with the dictionary "vm_facts" you posted. The
attribute "guest_name" is in place. I can't explain the error. It's up to you
to fix the JSON paths.

Abhijeet Kasurde

unread,
Apr 12, 2020, 12:02:11 PM4/12/20
to ansible...@googlegroups.com, Kiran Kumar
I would do this in a simpler way -

- name: Gather all VMs information
vmware_vm_info:
hostname: '{{ vcenter_hostname }}'
username: '{{ vcenter_username }}'
password: '{{ vcenter_password }}'
validate_certs: no
register: vm_facts
delegate_to: localhost

- debug:
msg: "{{ item.ip_address }}"
loop: "{{ vm_facts.virtual_machines }}"
when:
- item.guest_name | regex_search('^vm')


--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/20200412135631.0fd34f5a%40gmail.com.


--
Thanks,
Abhijeet Kasurde

Abhijeet Kasurde

unread,
Apr 12, 2020, 12:05:20 PM4/12/20
to ansible...@googlegroups.com, Kiran Kumar
Even this works for me -  notice ``vm_facts.virtual_machines``

- debug:
msg: "{{ item.ip_address }}"
loop: "{{ vm_facts.virtual_machines | selectattr('guest_name', 'match', '^vm(.*)$')| list }}"


--
Thanks,
Abhijeet Kasurde

Kiran Kumar

unread,
Apr 12, 2020, 5:08:57 PM4/12/20
to Ansible Project

Thanks Abhijeet & Valdo for your time to check. This works !
To unsubscribe from this group and stop receiving emails from it, send an email to ansible...@googlegroups.com.


--
Thanks,
Abhijeet Kasurde


--
Thanks,
Abhijeet Kasurde
Reply all
Reply to author
Forward
0 new messages