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

8,048 views
Skip to first unread message

Esteban Freire

unread,
Jul 6, 2015, 9:42:16 AM7/6/15
to ansible...@googlegroups.com
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



Tom Paine

unread,
Jul 6, 2015, 4:59:14 PM7/6/15
to ansible...@googlegroups.com

Esteban Freire

unread,
Jul 7, 2015, 3:31:29 AM7/7/15
to ansible...@googlegroups.com
Hi Tom,

Thanks a lot for your answer :)

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




 

El lunes, 6 de julio de 2015, 22:59:14 (UTC+2), Tom Paine escribió:

Esteban Freire

unread,
Jul 7, 2015, 3:44:44 AM7/7/15
to ansible...@googlegroups.com

Esteban Freire

unread,
Jul 8, 2015, 10:31:46 AM7/8/15
to ansible...@googlegroups.com
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 :)

santosh reddy

unread,
Jan 21, 2016, 8:35:43 AM1/21/16
to Ansible Project
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

Carlos María Cornejo Crespo

unread,
Sep 8, 2017, 7:28:08 AM9/8/17
to Ansible Project
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.
Reply all
Reply to author
Forward
0 new messages