How to get item by item from the item.stdout so you can execute a command for each item on the item.stdout.

Hi all,

I have the two following actions:

`

  • name: Getting the IDs for the VMs running under the user
    sudo: True
    sudo_user: oneadmin
    shell: onevm list | grep {{ item.value.login_name }} | awk ‘BEGIN {FS=" "}{print $1}’
    with_dict: disable_users_account
    register: VMIDs_per_user
    ignore_errors: yes
    tags:

  • delete_VMs

  • name: Delete the VMs running under the user
    sudo: True
    sudo_user: oneadmin
    command: onevm delete {{ item.stdout }}
    with_items: VMIDs_per_user.results
    tags:

  • delete_VMs

`

This is an output example from the the first action:

`

674
675

`

The problem is that the second action is not working due to the command expects to received just one argument per time, I mean, I need to execute:

`

onevm delete 674

onevm delete 675
`

And right now it is not working because it is executing: ```onevm delete 674 675 , which it does not work because the command does not admit to pass more than one argument.`

Therefore, my question is, do you know how to get item by item from the item.stdout so you can execute a command for each item on the item.stdout.

Thanks in advance,
Esteban

``

https://docs.ansible.com/playbooks_loops.html#iterating-over-the-results-of-a-program-execution

Hi Tom,

Thanks a lot for your answer :slight_smile:

I already tried this yesterday but it is not working for me. Probably, I am not understanding it correctly. This is what I tried:

First, I tried this task:


- name: Getting the IDs for the VMs running under the user
 sudo: True
 sudo_user: oneadmin
 shell: onevm list | grep {{ item.value.login_name }} | awk 'BEGIN {FS=" "}{print $1}'
 with_dict: disable_users_account
 register: VMIDs_per_user
 ignore_errors: yes
 tags:
 - delete_VMs

- name: Delete the VMs running under the user
 sudo: True
 sudo_user: oneadmin
 command: onevm delete {{ item }}
 with_items: "{{VMIDs_per_user.stdout_lines}}"
 tags:
 - delete_VMs

But I got the following error:

ansible-playbook -i inventory/production site.yml -vvvvvvv --limit opennebula --tags=delete_VMs
Traceback (most recent call last):
 File "/usr/bin/ansible-playbook", line 324, in <module>
 sys.exit(main(sys.argv[1:]))
 File "/usr/bin/ansible-playbook", line 264, in main
 pb.run()
 File "/usr/lib/python2.7/site-packages/ansible/playbook/__init__.py", line 310, in run
 play = Play(self, play_ds, play_basedir, vault_password=self.vault_password)
 File "/usr/lib/python2.7/site-packages/ansible/playbook/play.py", line 194, in __init__
 self._tasks = self._load_tasks(self._ds.get('tasks', []), load_vars)
 File "/usr/lib/python2.7/site-packages/ansible/playbook/play.py", line 669, in _load_tasks
 loaded = self._load_tasks(data, mv, role_params, default_vars, included_become_vars, list(included_additional_conditions), original_file=include_filename, role_name=new_role)
 File "/usr/lib/python2.7/site-packages/ansible/playbook/play.py", line 650, in _load_tasks
 (k,v) = t.split("=", 1)
ValueError: need more than 1 value to unpack

Also tried with stdout split, I don't remember now the exactly thing that I tried it but it did not work.

This is my ansible version:
 

ansible --version
ansible 1.9.1
 configured module search path = None

Thanks in advance,
Esteban

This is what I tried yesterday:

https://docs.ansible.com/playbooks_conditionals.html

Hi Tom, all

I had a typo on my main task but anyway, I don’t get to manage to do this yet.

If I tried it as in the link provided by you, I get the following issue:

`
with_items: “{{VMIDs_per_user.stdout_lines}}”

`

`

TASK: [ON4_project_managment | Delete the VMs running under the user] *********
fatal: [m-opennebula4] => with_items expects a list or a set

`

Then, I have tried the following things:

`
shell: onevm delete {{ item.stdout.split(‘\n’) }}
shell: onevm delete “{{ item.stdout.split(‘\n’) }}”
shell: onevm delete {{ item.stdout.split(“\n”) }}
shell: onevm delete {{ item.stdout.splitlines() }}

`

`
with_items: “{{VMIDs_per_user.stdout_lines}}”

`

But I got the following issue:

`
failed: [m-opennebula4] => (item={u’cmd’: u’onevm list | grep testing-admin | awk 'BEGIN {FS=" “}{print $1}'‘, u’end’: u’2015-07-08 15:26:43.028904’, u’stderr’: u’‘, u’stdout’: u’685\n686’, u’changed’: True, u’rc’: 0, ‘item’: {‘value’: {‘login_name’: ‘testing-admin’}, ‘key’: ‘user’}, u’warnings’: , u’delta’: u’0:00:00.778189’, ‘invocation’: {‘module_name’: u’shell’, ‘module_args’: u’onevm list | grep testing-admin | awk 'BEGIN {FS=” "}{print $1}'‘}, ‘stdout_lines’: [u’685’, u’686’], u’start’: u’2015-07-08 15:26:42.250715’}) => {“changed”: true, “cmd”: “onevm delete [u’685’, u’686’]”, “delta”: “0:00:01.095980”, “end”: “2015-07-08 15:26:44.508902”, “item”: {“changed”: true, “cmd”: “onevm list | grep testing-admin | awk ‘BEGIN {FS=" "}{print $1}’”, “delta”: “0:00:00.778189”, “end”: “2015-07-08 15:26:43.028904”, “invocation”: {“module_args”: “onevm list | grep testing-admin | awk ‘BEGIN {FS=" "}{print $1}’”, “module_name”: “shell”}, “item”: {“key”: “user”, “value”: {“login_name”: “testing-admin”}}, “rc”: 0, “start”: “2015-07-08 15:26:42.250715”, “stderr”: “”, “stdout”: “685\n686”, “stdout_lines”: [“685”, “686”], “warnings”: }, “rc”: 255, “start”: “2015-07-08 15:26:43.412922”, “warnings”: }
stdout: VM named [u685 not found.
command delete: argument 0 must be one of range, vmid_list

`

So, it seems it is splitting the lines according to stdout_lines': [u'685', u'686'] and ``"stdout": "685\n686", "stdout_lines": ["685", "686"] . The problem is that it is taking the [" characteres as [u and I don’t know how to remove that.

Any idea is welcome :slight_smile:

Thanks in advance,
Esteban

Hi Esteban,
Were you able to find a solution for this, even i’m having the same problem. I’m using ansible 2.0.0.2 but couldn’t find a solution to this.

Thanks,
Santosh

Hi folks,

Just in case this help someone else out

  • name: Retrieve existing vm’s
    vars:
    _vm_iaas_username: “{{ [vm_iaas_username, data.vm_iaas_username, ‘oneadmin’]|reject(‘undefined’)| first }}”
    shell: “onevm list | grep {{ _vm_iaas_username }} | awk ‘BEGIN {FS=" "}{print $1}’”
    register: vm_ids
    become: True
    delegate_to: front

  • name: Delete existing vm’s
    shell: “onevm terminate {{ item }}”
    become: true
    delegate_to: front
    with_items:

  • "{{ vm_idst.stdout_lines }}

Regards,
Carlos M.