Ansible执行Shell脚本分三类:script模块自动上传执行本地脚本;copy+shell组合支持传参与bash特性;单条命令直接用shell模块。注意权限、解释器指定及YAML中$需转义为$$。

在 Linux 中用 Ansible 执行 Shell 脚本命令,核心是选对模块、处理好脚本分发与执行上下文。实际操作中主要分两类场景:本地脚本远程执行 和 已存在脚本直接调用,方法不同但逻辑清晰。
直接执行本地 Shell 脚本(推荐用 script 模块)
script 模块会自动将本地脚本(如 deploy.sh)传输到目标主机临时目录,再以 /bin/sh 执行,无需手动 copy + chmod + run。
ansible web_servers -m script -a "/path/to/local/deploy.sh"
- ✅ 自动上传、设可执行权限、清理临时文件
- ✅ 不依赖目标机 Python 环境(底层走 SSH)
- ❌ 脚本路径必须是管理机上的绝对路径或相对当前目录
- ❌ 不支持传参给脚本(如
./deploy.sh arg1 arg2),需改用shell+copy组合
先复制再执行(用 copy + shell 组合)
适合需要传参、指定解释器(如 #!/bin/bash)、或复用已有脚本的场景:
- name: 复制并执行部署脚本
copy:
src: ./scripts/backup.sh
dest: /tmp/backup.sh
mode: '0755'
- name: 运行脚本并传参
shell: /tmp/backup.sh /var/log nginx
args:
executable: /bin/bash
- ✅ 支持任意 shebang、参数、重定向、管道
- ✅ 可配合
chdir切换工作目录 - ⚠️ 注意:
shell模块默认用/bin/sh,若脚本含bash特性(如[[ ]]、source),务必加executable: /bin/bash
单条命令就用 shell 模块(不涉及脚本文件)
如果只是执行一两行带管道/变量/重定向的命令,直接用 shell 最简洁:
ansible db_servers -m shell -a "ps aux | grep mysql | wc -l" ansible all -m shell -a "echo 'done at $(date)' >> /var/log/ansible-run.log"
- ✅ 支持完整 shell 语法
- ⚠️ 注意:
$符号在 YAML 中需双写$$防止被 Ansible 变量解析(如$$HOME) - ⚠️ 避免在
shell中写长脚本——可读性差、难维护、调试困难
补充要点
-
command模块不适用:它绕过 shell 解释器,无法执行>,|,&&,也不能运行.sh文件(除非显式调用sh script.sh) - 权限问题:确保目标用户有脚本执行权限;若需 root 权限,加
become: yes - 调试技巧:加
-v查看完整命令和输出;用--check预演(但script和shell不支持真正模拟执行)
不复杂但容易忽略。











