How to execute a shell script on a remote server using Ansible?

ShellAnsibleRemote Server

Shell Problem Overview


I am planning to execute a shell script on a remote server using Ansible playbook.

blank test.sh file:

touch test.sh

Playbook:

---
- name: Transfer and execute a script.
  hosts: server
  user: test_user
  sudo: yes
  tasks:
     - name: Transfer the script
       copy: src=test.sh dest=/home/test_user mode=0777

     - name: Execute the script
       local_action: command sudo sh /home/test_user/test.sh

When I run the playbook, the transfer successfully occurs but the script is not executed.

Shell Solutions


Solution 1 - Shell

you can use script module

Example

- name: Transfer and execute a script.
  hosts: all
  tasks:

     - name: Copy and Execute the script 
       script: /home/user/userScript.sh

Solution 2 - Shell

local_action runs the command on the local server, not on the servers you specify in hosts parameter.

Change your "Execute the script" task to

- name: Execute the script
  command: sh /home/test_user/test.sh

and it should do it.

You don't need to repeat sudo in the command line because you have defined it already in the playbook.

According to http://docs.ansible.com/playbooks_intro.html">Ansible Intro to Playbooks user parameter was renamed to remote_user in Ansible 1.4 so you should change it, too

remote_user: test_user

So, the playbook will become:

---
- name: Transfer and execute a script.
  hosts: server
  remote_user: test_user
  sudo: yes
  tasks:
     - name: Transfer the script
       copy: src=test.sh dest=/home/test_user mode=0777

     - name: Execute the script
       command: sh /home/test_user/test.sh

Solution 3 - Shell

It's better to use script module for that:
http://docs.ansible.com/script_module.html

Solution 4 - Shell

For someone wants an ad-hoc command

ansible group_or_hostname -m script -a "/home/user/userScript.sh"

or use relative path

ansible group_or_hostname -m script -a "userScript.sh"

Solution 5 - Shell

You can use template module to copy if script exists on local machine to remote machine and execute it.

 - name: Copy script from local to remote machine
   hosts: remote_machine
   tasks:
    - name: Copy  script to remote_machine
      template: src=script.sh.2 dest=<remote_machine path>/script.sh mode=755
    - name: Execute script on remote_machine
      script: sh <remote_machine path>/script.sh

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPattuView Question on Stackoverflow
Solution 1 - ShellKunwarView Answer on Stackoverflow
Solution 2 - ShellPasi HView Answer on Stackoverflow
Solution 3 - ShellvoroninView Answer on Stackoverflow
Solution 4 - ShellfangxingView Answer on Stackoverflow
Solution 5 - Shellgln reddyView Answer on Stackoverflow