Ansible批量分发执行脚本的核心是script模块,自动上传、赋权并运行本地脚本;需提前配置SSH免密、inventory分组及Ansible环境;亦可组合copy+command实现分步控制,或封装为Playbook提升复用性与可靠性。

Ansible 批量分发脚本并执行自动化任务,核心在于利用 script 模块完成本地脚本的传输与远程运行,同时配合 inventory 分组、SSH 免密登录和清晰的任务逻辑,就能稳定高效地落地。不需要在目标主机装任何客户端,一条命令即可覆盖几十台机器。
准备前提:确保通信与权限就绪
这是所有操作的基础,缺一不可:
- 控制节点已安装 Ansible(如
yum install -y ansible或apt install -y ansible) - 被管理节点开放 SSH 端口(默认 22),且
sshd正常运行 - 控制节点已生成 SSH 密钥对,并通过
ssh-copy-id将公钥分发到所有目标主机(推荐方式);若暂未配置免密,也可在 inventory 中明文写入ansible_ssh_user和ansible_ssh_pass(不推荐用于生产) - /etc/ansible/hosts 中正确定义主机组,例如:
[web]
192.168.1.101
192.168.1.102
快速分发并执行本地 Shell 脚本
使用 script 模块最直接:它自动将本地脚本复制到远程临时路径并执行,无需手动 scp + chmod + sh。
- 假设本地有一个检查磁盘的脚本
/opt/scripts/check_disk.sh,内容为:#!/bin/bash<br>df -h | grep "/$" | awk '{print "Root usage: " $5}' - 执行命令:
ansible web -m script -a "/opt/scripts/check_disk.sh" - Ansible 会自动处理:上传 → 添加可执行权限 → 远程执行 → 返回 stdout/stderr
- 注意:脚本中不要依赖绝对路径的交互式命令(如
sudo -i),也不建议含read等阻塞操作
进阶用法:结合 copy + command 实现更灵活控制
当需要分步操作(比如先传文件、再授权、再运行、最后清理),或脚本需动态参数时,copy + command 组合更可控:
- 分发脚本:
ansible web -m copy -a "src=/opt/scripts/deploy_app.sh dest=/tmp/deploy_app.sh mode=0755" - 执行并捕获结果:
ansible web -m command -a "/tmp/deploy_app.sh --env=prod" - 可追加
-a "creates=/tmp/deploy_app.sh"避免重复上传,或用args: {chdir: /tmp}指定工作目录
封装为 Playbook 提升复用性与可靠性
单次 ad-hoc 命令适合调试,长期运维应转为 YAML 格式的 Playbook,支持错误处理、条件判断和幂等性:
- 创建
run_script.yml:
---
- hosts: web
become: yes
tasks:
- name: Copy and execute deployment script
script: /opt/scripts/deploy_nginx.sh
- name: Verify nginx is running
command: systemctl is-active nginx
register: nginx_status
- name: Fail if nginx not active
fail:
msg: "Nginx service failed to start"
when: nginx_status.stdout != "active"
- 运行:
ansible-playbook run_script.yml - Playbook 可加入变量、模板、handlers,适合纳管数百台服务器的标准化场景
不复杂但容易忽略:脚本本身要在控制节点有执行权限(chmod +x),且注意目标主机系统环境是否兼容(如 bash vs sh、Python 版本)。只要 inventory 准确、SSH 通、脚本无硬编码路径,批量执行就非常可靠。

















