with_items to get values from a shell cmd output

24 views
Skip to first unread message

Kiran Kumar

unread,
Apr 9, 2020, 3:06:26 AM4/9/20
to Ansible Project

I got this error for below code - FAILED! => {"msg": "template error while templating string: expected token 'end of print statement', got '='. String: {{ var=oom.stdout }}"} 

Please suggest , i am trying to get pid from shell cmd & then update it with echo 

- hosts: temp
  gather_facts: yes
  become: yes
  remote_user: root
  tasks:
   - name: Capture uname ouput
     shell: "uname"
     register: os_type
   - name: Adjust OOM to negative so that OOM killer does not kill below processes
     shell: 'ps -ef|egrep "sssd|wdmd|portreserve|autofs|automount|ypbind|rpcbind|rpc.statd|rpc.mountd|rpc.idampd|ntpd|lmgrd|Xvnc|vncconfig|irqblance|rpc.rquotad|metric|nscd|crond|snpslmd|getpwname.pl|mysqld|rsyslogd|xinetd|sendmail|lsf|tigervnc|tightvnc|cfadm" |egrep -ve "ps|egrep" |awk "{print \$2}"'
     register: oom
     when: os_type.stdout == 'Linux'
   - debug:  var=oom.stdout
   - name: update the pid 
     raw: echo -17 > /proc/{{ item.pid }}/oom_adj
with_items:
   - "{{ var=oom.stdout }}"

Dick Visser

unread,
Apr 9, 2020, 3:31:02 AM4/9/20
to ansible...@googlegroups.com
The result from your grep/awk shell task consists of multiple lines, each with one PID.
So instead of stdout you should use stdout_lines: https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html#stdout-lines 

Also, you are iterating over a list of 1 item, which is incorrect as well.


Also, you're trying to establish something called "os_type" using a shell task, but that is not necessary - this is already available in the ansible facts (which you've explicitly gathered).
So just use 'ansible_system' instead.

Also, you declare "become: yes", but also "remote_user: root". That's double. Either connect as non-root user and only declare "become: yes" (which implies become_user = root). Or just only declare "remote_user: root".

Try this:

- hosts: temp
  gather_facts: yes
  remote_user: root
  tasks:

   - name: Adjust OOM to negative so that OOM killer does not kill below processes
     shell: 'ps -ef|egrep "sssd|wdmd|portreserve|autofs|automount|ypbind|rpcbind|rpc.statd|rpc.mountd|rpc.idampd|ntpd|lmgrd|Xvnc|vncconfig|irqblance|rpc.rquotad|metric|nscd|crond|snpslmd|getpwname.pl|mysqld|rsyslogd|xinetd|sendmail|lsf|tigervnc|tightvnc|cfadm" |egrep -ve "ps|egrep" |awk "{print \$2}"'
     register: oom
     when: ansible_system == 'Linux'

   - debug:  var=oom.stdout
   - name: update the pid
     raw: echo -17 > /proc/{{ item }}/oom_adj
       loop: "{{ oom.stdout_lines }}"



--
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/620d6682-3345-4069-a31d-78d53924c3aa%40googlegroups.com.


--
Dick Visser
Trust & Identity Service Operations Manager
GÉANT

Stefan Hornburg (Racke)

unread,
Apr 9, 2020, 8:52:03 AM4/9/20
to ansible...@googlegroups.com
On 4/9/20 9:30 AM, Dick Visser wrote:
> The result from your grep/awk shell task consists of multiple lines, each with one PID.
> So instead of stdout you should use
> stdout_lines: https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html#stdout-lines 
>
> Also, you are iterating over a list of 1 item, which is incorrect as well.
>
>
> Also, you're trying to establish something called "os_type" using a shell task, but that is not necessary - this is
> already available in the ansible facts (which you've explicitly gathered).
> So just use 'ansible_system' instead.
>
> Also, you declare "become: yes", but also "remote_user: root". That's double. Either connect as non-root user and only
> declare "become: yes" (which implies become_user = root). Or just only declare "remote_user: root".
>
> Try this:
>
> - hosts: temp
>   gather_facts: yes
>   remote_user: root
>   tasks:
>    - name: Adjust OOM to negative so that OOM killer does not kill below processes
>      shell: 'ps -ef|egrep
> "sssd|wdmd|portreserve|autofs|automount|ypbind|rpcbind|rpc.statd|rpc.mountd|rpc.idampd|ntpd|lmgrd|Xvnc|vncconfig|irqblance|rpc.rquotad|metric|nscd|crond|snpslmd|getpwname.pl
> <http://getpwname.pl>|mysqld|rsyslogd|xinetd|sendmail|lsf|tigervnc|tightvnc|cfadm" |egrep -ve "ps|egrep" |awk "{print \$2}"'
>      register: oom
>      when: ansible_system == 'Linux'
>    - debug:  var=oom.stdout
>    - name: update the pid
>      raw: echo -17 > /proc/{{ item }}/oom_adj
>        loop: "{{ oom.stdout_lines }}"
>

This looks like a bad hack to me. Why don't you adjust OOMScoreAdjust in the system unit files of these services (or
corresponding setting in init scripts) ??

Regards
Racke

>
>
> On Thu, 9 Apr 2020 at 09:06, Kiran Kumar <esxi...@gmail.com <mailto:esxi...@gmail.com>> wrote:
>
>
> I got this error for below code - FAILED! => {"msg": "template error while templating string: expected token 'end of
> print statement', got '='. String: {{ var=oom.stdout }}"} 
>
> Please suggest , i am trying to get pid from shell cmd & then update it with echo 
>
> - hosts: temp
>   gather_facts: yes
>   become: yes
>   remote_user: root
>   tasks:
>    - name: Capture uname ouput
>      shell: "uname"
>      register: os_type
>    - name: Adjust OOM to negative so that OOM killer does not kill below processes
>      shell: 'ps -ef|egrep
> "sssd|wdmd|portreserve|autofs|automount|ypbind|rpcbind|rpc.statd|rpc.mountd|rpc.idampd|ntpd|lmgrd|Xvnc|vncconfig|irqblance|rpc.rquotad|metric|nscd|crond|snpslmd|getpwname.pl
> <http://getpwname.pl>|mysqld|rsyslogd|xinetd|sendmail|lsf|tigervnc|tightvnc|cfadm" |egrep -ve "ps|egrep" |awk
> "{print \$2}"'
>      register: oom
>      when: os_type.stdout == 'Linux'
>    - debug:  var=oom.stdout
>    - name: update the pid 
>      raw: echo -17 > /proc/{{ item.pid }}/oom_adj
> with_items:
>    - "{{ var=oom.stdout }}"
>
> --
> 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 <mailto:ansible-proje...@googlegroups.com>.
> <https://groups.google.com/d/msgid/ansible-project/620d6682-3345-4069-a31d-78d53924c3aa%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
>
>
> --
> Dick Visser
> Trust & Identity Service Operations Manager
> GÉANT
>
> --
> 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 <mailto:ansible-proje...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/CAL8fbwOVV-SB4aHQZ%2BHWAixVnJKNQQoxJCTqxQXuDZmcUTW7Hw%40mail.gmail.com
> <https://groups.google.com/d/msgid/ansible-project/CAL8fbwOVV-SB4aHQZ%2BHWAixVnJKNQQoxJCTqxQXuDZmcUTW7Hw%40mail.gmail.com?utm_medium=email&utm_source=footer>.


--
Ecommerce and Linux consulting + Perl and web application programming.
Debian and Sympa administration. Provisioning with Ansible.

signature.asc

Kiran Kumar

unread,
Apr 9, 2020, 1:16:51 PM4/9/20
to Ansible Project
@Dick Visser 

Wow, that helped, thanks a lot ! 

Thanks for the valuable suggestions & nice explanation as well 

To unsubscribe from this group and stop receiving emails from it, send an email to ansible...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages