# Command not working on remote host through shell module or playbook

**URL:** <https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590>\
**Category:** Ansible Project\
**Created:** [September 20, 2016, 8:00am UTC](https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590 "2016-09-20T08:00:00Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![DHAVAL\_JAISWAL](https://avatars.discourse-cdn.com/v4/letter/d/34f0e0/32.png) [@DHAVAL\_JAISWAL](https://forum.ansible.com/u/DHAVAL_JAISWAL)\
**Post date:** [September 20, 2016, 8:00am UTC](https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590/1 "2016-09-20T08:00:00Z")

</div>

Ansible version: ansible 1.9.2

I am unable to execute following command from shell module neither through playbook. It could be any command at the run time. While reading found $,% need the escape string. Tried but not working. Is there any way/module through which i can run any command on the remote host and no need to explicitly define any escape string.

netstat -tanpu | awk ‘{{print $5}}’ | sort -n | uniq -cd | sort -n | awk ‘$1 \> 3{{printf (“%5s\t%s\n”, $1, $2)}}’

With shell module:

/usr/bin/ansible remote\_host -m shell -a ‘netstat -tanpu | awk ‘{{print $5}}’ | sort -n | uniq -cd | sort -n | awk ‘$1 \> 3{{printf (“%5s\t%s\n”, $1, $2)}}’’  
-bash: syntax error near unexpected token `(’

With playbook.

- hosts: “{{ip}}”  
gather\_facts: no  
remote\_user: remote  
connection: local

tasks:

- name: Running command  
shell: netstat -tanpu | awk ‘{{print $5}}’ | sort -n | uniq -cd | sort -n | awk ‘$1 \> 3{{printf (“%5s\t%s\n”, $1, $2)}}’

fatal: [192.168.4.7] =\> Failed to template netstat -tanpu | awk ‘{{print $5}}’ | sort -n | uniq -cd | sort -n | awk ‘$1 \> 3{{printf (“%5s\t%s\n”, $1, $2)}}’: template error while templating string: unexpected char u’$’ at 30

---

<div class="post-metadata">

**Author:** ![Kai\_Stian\_Olstad](https://avatars.discourse-cdn.com/v4/letter/k/e19adc/32.png) [@Kai\_Stian\_Olstad](https://forum.ansible.com/u/Kai_Stian_Olstad)\
**Post date:** [September 21, 2016, 7:51am UTC](https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590/2 "2016-09-21T07:51:18Z")

</div>

Ansible thinks {{ }} is a template, you need to just use { }, so this should work:

- name: Running command  
&nbsp;&nbsp;&nbsp;shell: netstat -tanpu | awk '{print $5}' | sort -n | uniq -cd | sort -n | awk '$1 \> 3{printf ("%5s\t%s\n",$1, $2)}'

---

<div class="post-metadata">

**Author:** ![DHAVAL\_JAISWAL](https://avatars.discourse-cdn.com/v4/letter/d/34f0e0/32.png) [@DHAVAL\_JAISWAL](https://forum.ansible.com/u/DHAVAL_JAISWAL)\
**Post date:** [September 21, 2016, 4:44pm UTC](https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590/3 "2016-09-21T16:44:16Z")

</div>

That’s working.

But I guess here i have to hard code the command. Is there any way where i can pass any command at the run time to execute on the remote host.

I saw the raw module and below are the behavior i got.

working:

/usr/bin/ansible test -m raw -a netstat -tanpu | /bin/awk ‘{print $5}’ | sort -n | uniq -cd | sort -n | awk ‘$1 \> 3{printf (“%5s\t%s\n”, $1, $2)}’

Not working

/usr/bin/ansible test -m raw -a netstat -an | grep :8080

---

<div class="post-metadata">

**Author:** ![DHAVAL\_JAISWAL](https://avatars.discourse-cdn.com/v4/letter/d/34f0e0/32.png) [@DHAVAL\_JAISWAL](https://forum.ansible.com/u/DHAVAL_JAISWAL)\
**Post date:** [September 22, 2016, 2:47pm UTC](https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590/4 "2016-09-22T14:47:06Z")

</div>

Can some one help here.

---

<div class="post-metadata">

**Author:** ![Kai\_Stian\_Olstad](https://avatars.discourse-cdn.com/v4/letter/k/e19adc/32.png) [@Kai\_Stian\_Olstad](https://forum.ansible.com/u/Kai_Stian_Olstad)\
**Post date:** [October 9, 2016, 10:16am UTC](https://forum.ansible.com/t/command-not-working-on-remote-host-through-shell-module-or-playbook/22590/5 "2016-10-09T10:16:21Z")

</div>

> &nbsp;&nbsp;Can some one help here.

You have multiple challenges to overcome, so what you are trying to achieve is going to be rather difficult.

> > That's working.
> > 
> > But I guess here i have to hard code the command. Is there any way where i  
> > can pass any command at the run time to execute on the remote host.
> > 
> > I saw the raw module and below are the behavior i got.
> > 
> > working:
> > 
> > /usr/bin/ansible test -m raw -a netstat -tanpu | /bin/awk '{print $5}' |  
> > sort -n | uniq -cd | sort -n | awk '$1 \> 3{printf ("%5s\t%s\n", $1, $2)}'

This is not working as you expect. Since you are not quoting the -a.  
It's actually running  
&nbsp;&nbsp;&nbsp;/usr/bin/ansible test -m raw -a netstat -tanpu

Only "netstat" is running on the host test. -t is a valid option to ansible, and it is saving the result in directory anpu. If you check your directory where you run ansible from you will see this directory.

The rest of the command  
&nbsp;&nbsp;&nbsp;\> /bin/awk '{print $5}' | sort -n | uniq -cd | sort -n | awk '$1 \> 3{printf ("%5s\t%s\n", $1, $2)}'

is running on the control machine and not the remote host.

> > Not working
> > 
> > /usr/bin/ansible test -m raw -a netstat -an | grep :8080

This is not working since you don't have quotes, ansible doesn't support using -a twice.

I short, because of your shell expansion and Ansible expansion, this is not trivial to get right. You will need to use alternating single and double quotes and escaping things to prevent expansions.

You might wont to look at ansible-console, then you don't have to think about shell expansion.  
Or explain why you need to do this, maybe someone here can show a better way to solve you need.
