Discussion:
[ansible-project] How to get item by item from the item.stdout so you can execute a command for each item on the item.stdout.
Esteban Freire
2015-07-06 13:42:16 UTC
Permalink
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
--
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-project+***@googlegroups.com.
To post to this group, send email to ansible-***@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/5cacd39c-52a9-49ed-8be5-9185887947fb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Tom Paine
2015-07-06 20:59:14 UTC
Permalink
https://docs.ansible.com/playbooks_loops.html#iterating-over-the-results-of-a-program-execution
--
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-project+***@googlegroups.com.
To post to this group, send email to ansible-***@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/089ec724-a6e9-40c5-ad0e-fd79a491bae5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Esteban Freire
2015-07-07 07:31:29 UTC
Permalink
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
Post by Tom Paine
https://docs.ansible.com/playbooks_loops.html#iterating-over-the-results-of-a-program-execution
--
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-project+***@googlegroups.com.
To post to this group, send email to ansible-***@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/502864e3-a9e3-4b66-a09f-84c335f41124%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Esteban Freire
2015-07-07 07:44:44 UTC
Permalink
This is what I tried yesterday:

https://docs.ansible.com/playbooks_conditionals.html
Post by Esteban Freire
Hi Tom,
Thanks a lot for your answer :)
I already tried this yesterday but it is not working for me. Probably, I
- 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
- 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}}"
- delete_VMs
ansible-playbook -i inventory/production site.yml -vvvvvvv --limit opennebula --tags=delete_VMs
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.
ansible --version
ansible 1.9.1
configured module search path = None
Thanks in advance,
Esteban
Post by Tom Paine
https://docs.ansible.com/playbooks_loops.html#iterating-over-the-results-of-a-program-execution
--
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-project+***@googlegroups.com.
To post to this group, send email to ansible-***@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/6c0b38a7-db27-4b41-9e62-2bbc36a9f60d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Esteban Freire
2015-07-08 14:31:46 UTC
Permalink
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 :)

Thanks in advance,
Esteban
Post by Tom Paine
https://docs.ansible.com/playbooks_loops.html#iterating-over-the-results-of-a-program-execution
--
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-project+***@googlegroups.com.
To post to this group, send email to ansible-***@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/0f68d3f1-d355-47ce-8dbd-c627524b7049%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Loading...