本地执行脚本到远程

前言

SSH我们大家都不陌生,它是Linux下进行远程连接的基本工具,不单单可以登录,还可以远程操作。接下来我们来说一下怎么本地执行脚本到远程?没错!就是使用SSH。

日常工作中我们常常遇到在多个主机上远程部署,比如要在一台主机上写好shell脚本,执行脚本到远程主机。有两种方法:

1. 使用scp将本地脚本文件拷贝到远端,然后再通过ssh执行远端的脚本;(弊端是脚本修改后,每次都需要scp);
2. 直接在本地执行脚本到远程。

我们就说第二种方法了
一、 执行本地脚本

  1. 执行一个脚本到远程,我们用两个主机测试,主机1 IP:192.168.2.111 和主机2 IP:192.168.2.112
$ cat test.sh					//主机1上写一个简单脚本 获取当前主机IP
ifconfig | grep inet | awk -F "[: ]+" '{print $4}' | head -n1

$ sh test.sh					//本地执行一下
192.168.2.111					//获取到本机内网IP


重点来了!!执行本地脚本到远程的方法
$ ssh root@192.168.2.112 < test.sh
192.168.2.112					//在本地执行脚本获取到目标主机的IP

通过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执行

  1. 为脚本传递参数
$ cat test2.sh 
echo $1
echo $2 

在本地执行结构如下:
$ sh test2.sh a b
a
b 

通过重定向远程执行,会报错
$ ssh root@10.153.195.138 < test2.sh a b
bash: a: command not found

要想在这种情况下(远程执行本地的脚本)执行带有参数的脚本,需要为 bash 指定 -s 参数:

$ ssh root@10.153.195.138 'bash -s' < test2.sh a b
a
b

二、 执行远程主机上的脚本
除了执行本地的脚本,还有情况是脚本文件存放在远程服务器上,而我们需要远程执行它。现在我们在主机2上创建test3.sh脚本,在主机1上远程执行。

$ cat test3.sh					//主机2中的脚本
ifconfig | grep inet | awk -F "[: ]+" '{print $4}' | head -n1

$ ssh root@192.168.2.112 sh /root/test3.sh	//主机1中去执行 (一定要是绝对路径去执行)
192.168.2.112

##传递参数
$ cat test4.sh					//主机2中的脚本
echo $1
echo $2

$ ssh root@192.168.2.112 sh /root/test4.sh aa bb	//主机1中传参数执行
aa
bb

<think>好的,用户想了解如何通过Ansible在本地执行脚本远程运行。首先,我需要回忆一下Ansible的相关模块和用法。根据用户提供的引用内容,他们提到了使用copy模块、shell模块以及script模块。需要明确这些模块的区别和适用场景。 用户引用的信息显示,Ansible可以通过copy模块将脚本复制到远程主机,然后用shell模块执行。同时,script模块可以直接在本地执行脚本,但实际是在远程主机上运行。需要确认用户的需求到底是需要在本地执行脚本然后影响远程主机,还是将本地脚本传输到远程主机执行。 接下来,用户的问题可能涉及到几个步骤:如何传输脚本远程主机,如何执行权限设置,以及如何确保脚本远程正确运行。此外,用户可能需要处理权限提升,比如切换到root用户,这在引用中也有提到,比如使用become参数。 还需要考虑Ansible Playbook的结构,任务顺序,以及如何处理执行结果,比如保存输出到控制节点。用户可能还关心如何验证脚本执行是否成功,或者如何处理错误情况。 另外,用户提供的引用中有使用script模块的例子,这个模块和shell模块的区别在于,script模块会将本地脚本复制到远程临时目录执行,并自动清理,而shell模块需要手动处理脚本传输和执行。因此需要解释这两个模块的不同使用场景,以及各自的优缺点。 可能还需要提醒用户注意脚本的路径问题,权限设置,以及如何传递参数给脚本。同时,关于主机清单文件的配置,如如何定义主机组和变量,也是关键点之一。 最后,需要确保回答结构清晰,步骤明确,并给出具体的示例代码,帮助用户理解如何实际操作。同时,生成的相关问题需要覆盖用户可能进一步询问的方向,比如权限提升、输出处理等。</think>### 通过Ansible实现本地脚本远程执行的三种方法 #### 方法一:使用`script`模块(推荐) ```yaml --- - name: 执行本地脚本并获取结果 hosts: webservers become: yes tasks: - name: 执行本地脚本并保存输出 script: cmd: /path/to/local/script.sh creates: /tmp/script.lock # 幂等性控制 register: script_output args: executable: /bin/bash # 指定解释器 - name: 显示执行结果 debug: var: script_output.stdout_lines ``` **特点**: 1. 自动将本地脚本传输到远程`$HOME/.ansible/tmp/`目录执行 2. 支持`creates`/`removes`参数保证幂等性[^1] 3. 默认使用`SHELL`环境变量指定的解释器 #### 方法二:`copy`+`shell`组合 ```yaml - name: 传输脚本远程 copy: src: /opt/scripts/deploy.sh dest: /tmp/ mode: 0755 # 必须设置执行权限 - name: 执行远程脚本 shell: /tmp/deploy.sh {{ app_version }} # 支持参数传递 args: chdir: /opt/app # 指定工作目录 register: execution_result changed_when: "'SUCCESS' in execution_result.stdout" ``` #### 方法三:直接远程执行(无文件传输) ```yaml - name: 通过管道执行本地脚本 shell: | /bin/bash -s <<'EOF' {{ lookup('file', '/path/to/script.sh') }} EOF args: executable: /bin/bash ``` **适用场景**: - 临时调试脚本 - 禁止在远程主机存储脚本文件 ### 关键参数说明 | 参数 | 作用 | 示例值 | |---------------|------------------------------|----------------------| | `chdir` | 切换工作目录 | /opt/app | | `creates` | 文件存在则跳过执行 | /tmp/installed.flag | | `executable` | 指定脚本解释器 | /usr/bin/python3 | | `stdin` | 向脚本传递标准输入 | "{{ ssh_key }}" | ### 最佳实践建议 1. **权限控制** 推荐使用`become`提权而非root直接连接: ```yaml ansible_user: deploy ansible_become: yes ansible_become_method: sudo ``` 2. **输出处理** 通过`register`捕获执行结果并保存到本地: ```yaml - copy: content: "{{ script_result.stdout }}" dest: "/backup/{{ inventory_hostname }}.log" ``` 3. **调试技巧** 使用`-vvv`参数查看详细执行过程: ```bash ansible-playbook playbook.yml -vvv ``` ### 执行效果验证 ```bash # 查看脚本传输情况 ansible webservers -m shell -a "ls -l /tmp/deploy.sh" # 检查crontab配置(示例) ansible webservers -m shell -a "crontab -l | grep backup_job" ``` ### 常见问题排查 1. **权限拒绝错误** 确保`ansible_ssh_user`在远程主机有目标目录写权限 2. **脚本编码问题** 在脚本开头添加`#!/bin/bash`或`#!/usr/bin/env python` 3. **环境变量缺失** 使用`environment`参数显式声明: ```yaml environment: PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值