pipeline (|) not working with the -e option

Why extra variables (-e) ignoring commands after pipeline (“|”) while running playbook with -e options.

Following playbook giving output till “netstat -an” only. I want the output of this “netstat -an | grep 8080” or any command which can be run at the run time on remote host.

ansible-playbook /etc/ansible/command_run.yml -e “ip=192.168.4.10” -e ‘command=“netstat -an | grep 8080”’

command_run.yml

  • hosts: “{{ip}}”
    gather_facts: no
    remote_user: remote
    connection: local

tasks:

  • name: Running command
    command: ansible {{ip}} -a “{{command}}”

However, Following is working.

ansible-playbook /etc/ansible/command_run.yml -e “ip=192.168.4.10” -e ‘command=“free -m”’.

Why extra variables (-e) ignoring commands after pipeline ("|") while
running playbook with -e options.

http://docs.ansible.com/ansible/command_module.html says

  The command module takes the command name followed by a list of
  space-delimited arguments. The given command will be executed on all
  selected nodes. It will not be processed through the shell, so variables
  like $HOME and operations like "<", ">", "|", ";" and "&" will not work
  (use the shell module if you need these features).

So, you need the 'shell' module if you want to run a pipeline. (See
http://docs.ansible.com/ansible/shell_module.html#notes for some reasons
why you might not want to use 'shell' unless you really need to.)

                                      -Josh (jbs@care.com)

(apologies for the automatic corporate disclaimer that follows)

This email is intended for the person(s) to whom it is addressed and may contain information that is PRIVILEGED or CONFIDENTIAL. Any unauthorized use, distribution, copying, or disclosure by any person other than the addressee(s) is strictly prohibited. If you have received this email in error, please notify the sender immediately by return email and delete the message and any attachments from your system.

Tried with the shell module. It’s working for the following scenario. However, not working for cluster where more than one server define in the inventory.

working:
ansible-playbook /etc/ansible/command_run.yml -e “ip=192.168.4.10” -e ‘command=“netstat -an | grep 8080”’

Not working:
ansible-playbook /etc/ansible/command_run.yml -e “ip=group_domain” -e ‘command=“netstat -an | grep 8080”’

command_run.yml

  • hosts: “{{ip}}”
    gather_facts: no
    remote_user: remote
    connection: local

tasks:

  • name: Running command
    shell: ssh remote@{{ip}} {{command}}

If {{ip}} might be an Ansible group name, rather than a thing you can SSH
to, then you can't SSH to {{ip}}.

Backing up a step, what are you trying to do here? if you want to run a
command on a bunch of hosts, Ansible will already SSH to those hosts from
your control host to run the command, so you may just need

  shell: {{command}}

for your task.

And, if you just want to run a command that you specify on the command
line, you can use the ad-hoc 'ansible' command for that, rather than a
playbook, e.g.

  ansible group_domain -m shell -a 'netstat -an | grep 8080'

If you leave off the '-m shell' part, it uses the 'command' module by
default, so you can do stuff like

  ansible group_domain -a 'free -m'

if you don't have pipelines or other stuff that requires the 'shell' module.

                                      -Josh (jbs@care.com)

(apologies for the automatic corporate disclaimer that follows)

This email is intended for the person(s) to whom it is addressed and may contain information that is PRIVILEGED or CONFIDENTIAL. Any unauthorized use, distribution, copying, or disclosure by any person other than the addressee(s) is strictly prohibited. If you have received this email in error, please notify the sender immediately by return email and delete the message and any attachments from your system.

you touch the exact part where i was missing

It works !!

Thanks