如何使用pyinfra在目标主机上执行任意Python代码
pyinfra在目标主机执行Python代码的方案
不需要提前手动上传脚本,有更简洁的原生实现方式,两种常用方案如下:
方案1:直接执行内嵌Python代码(绝大多数场景优先推荐)
使用python.execute操作即可,它会自动将你定义的Python函数序列化后传输到目标主机,在目标主机的Python环境中执行,无需处理临时文件的上传、清理逻辑。
示例代码如下:
from pyinfra.operations import python # 该函数内的所有代码都会在目标主机侧执行 def target_runtime_code(): # 用到的依赖导入必须写在函数内部 import os print(os.getcwd()) print(os.getuid()) python.execute( name="在目标主机执行自定义Python逻辑", function=target_runtime_code, )
注意:python.execute传入的函数无法依赖外部作用域的变量、导入语句,所有用到的依赖必须在函数内部声明,否则目标主机执行时会报缺少依赖的错误。
方案2:上传脚本后执行(适合代码量较大、存在自定义依赖的场景)
如果你的Python逻辑代码量很大,或者依赖本地自定义模块,可以先将脚本上传到目标主机再执行,示例代码如下:
from pyinfra.operations import files, server # 上传本地脚本到目标主机指定路径 files.put( name="上传Python脚本至目标主机", src="./本地脚本路径/my_script.py", dest="/opt/目标存放路径/my_script.py", ) # 调用目标主机的Python解释器执行脚本 server.shell( name="执行目标主机上的Python脚本", commands=["python3 /opt/目标存放路径/my_script.py"], )
补充说明
你之前使用的python.call接口本身的设计定位就是在主控端执行,用于根据目标主机的元数据动态生成部署逻辑,本来就不是用来执行目标端代码的,两个接口的功能定位不同不要混淆。
内容的提问来源于stack exchange,提问作者rSim
相关产品推荐
相关产品推荐

