Complete Guide to Executing Shell Scripts on Remote Servers Using Ansible

Nov 21, 2025 · Programming · 10 views · 7.8

Keywords: Ansible | Shell Script | Remote Execution | Automated Deployment | Operations Tool

Abstract: This article provides a comprehensive exploration of executing Shell scripts on remote servers using Ansible. It analyzes common error scenarios, particularly the misuse of the local_action module, and offers solutions based on best practices. By comparing the differences between copy+command and script modules, it delves into the core principles of Ansible's remote execution mechanism. The content covers key technical aspects including permission settings, user configuration, and module selection, offering practical guidance for automated deployment.

Problem Background and Common Error Analysis

In automated operations scenarios, executing Shell scripts on remote servers using Ansible is a common requirement. However, many developers encounter situations where script transfer succeeds but execution fails during their initial attempts. This typically stems from misunderstandings about Ansible's execution model.

A typical erroneous example:

---
- 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

The issue with this configuration is that the local_action module executes commands on the local host, not on the remote target server. When using local_action: command sudo sh /home/test_user/test.sh, Ansible attempts to execute this command on the control node, while the script file on the remote server remains unexecuted.

Correct Solutions

To resolve this issue, proper modules and configurations must be used. Below are improved solutions based on best practices:

Method 1: Using the command Module

The most direct solution is to replace local_action with the command module:

---
- name: Transfer and execute a script.
  hosts: server
  remote_user: test_user
  become: 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

Key improvements:

Method 2: Using the script Module

Ansible provides a dedicated script module for more concise script transfer and execution:

---
- name: Transfer and execute a script using script module
  hosts: server
  remote_user: test_user
  become: yes
  tasks:
     - name: Copy and execute the script
       ansible.builtin.script:
         cmd: /home/user/test.sh

Advantages of the script module:

In-depth Technical Principles

Ansible Execution Model

Understanding Ansible's execution model is crucial for proper module usage. Ansible employs a push model where the control node connects to target nodes via SSH and executes tasks. Each task module has a clear scope:

Permission Management Mechanism

Ansible's permission management operates at multiple levels:

---
- name: Example with proper privilege escalation
  hosts: webservers
  remote_user: deploy_user
  become: yes
  become_method: sudo
  become_user: root
  tasks:
     - name: Ensure script is executable
       file:
         path: /home/deploy_user/script.sh
         mode: '0755'

     - name: Execute with specific user
       command: /home/deploy_user/script.sh
       become: yes
       become_user: app_user

Error Handling and Debugging

When script execution fails, debugging can be performed using the following methods:

---
- name: Execute script with error handling
  hosts: server
  tasks:
     - name: Transfer script
       copy:
         src: test.sh
         dest: /tmp/
         mode: '0755'

     - name: Execute and capture output
       command: sh /tmp/test.sh
       register: script_result
       failed_when: script_result.rc != 0

     - name: Display output
       debug:
         var: script_result.stdout

     - name: Display errors
       debug:
         var: script_result.stderr

Best Practice Recommendations

Security Considerations

Security is paramount when executing remote scripts in production environments:

Performance Optimization

For large-scale deployments, performance optimization is important:

Module Selection Guide

Choose appropriate modules based on specific scenarios:

<table border="1"> <tr><th>Scenario</th><th>Recommended Module</th><th>Reason</th></tr> <tr><td>Simple script execution</td><td>script</td><td>Automatic transfer, no Python required</td></tr> <tr><td>Complex parameter passing</td><td>command/shell</td><td>Better parameter control</td></tr> <tr><td>Environment variables needed</td><td>shell</td><td>Supports shell features</td></tr> <tr><td>Windows targets</td><td>script</td><td>Cross-platform support</td></tr>

Conclusion

Through the analysis in this article, we have gained a deep understanding of the correct methods for executing Shell scripts on remote servers using Ansible. The key lies in understanding the execution scope and mechanism of each module, avoiding common misuse of local_action. Whether using the command module or the script module, ensuring correct configuration and security is essential. In practical applications, it is recommended to choose the most suitable solution based on specific requirements and follow Ansible's best practice principles.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.