跳转到主要内容

Chopsticks是一个编排库:它允许您通过SSH管理并配置远程主机。

项目描述

Join the chat at https://gitter.im/chopsticks-chat/Lobby

Chopsticks是一个编排库:它允许您通过SSH管理并配置远程主机。

这是一个无代理的库,除了Python和SSH代理之外,不需要在远程主机上安装任何东西。

它还支持在Docker容器中执行代码。

它可能与Ansible或Fabric相提并论,但它有一些聪明的传输魔法,使得开发变得非常容易:您只需编写可以从编排主机调用的Python函数。无需调用bash命令(例如Fabric)或编写具有限制性输入和输出格式的自包含脚本(例如Ansible)。

也可以将其与Python内置的multiprocessing库进行比较,但与在同一主机上的子进程中调用代码不同,代码可以在远程主机上运行。

示例

使用chopsticks,您可以简单地导入函数并将它们传递给远程主机以执行。

首先建立SSH隧道

from chopsticks.tunnel import Tunnel
tun = Tunnel('troy.example.com')

然后您可以将一个函数传递给远程主机以调用

import time
print('Time on %s:' % tun.host, tun.call(time.time))

您可以使用当前代码库中的任何纯Python函数,这意味着您可以为远程主机创建自己的编排函数库(以及调用远程主机的函数)。

Tunnel提供了在单个主机上执行的支持;还有一个Group可以在多个主机上并行执行可调用函数

from chopsticks.group import Group

group = Group([
    'web1.example.com',
    'web2.example.com',
    'web3.example.com',
])
for host, addr in group.call(ip).successful():
    print('%s ip:' % host, addr)

隧道子类允许使用SSH之外的流进行连接,例如使用sudo,或连接到沙盒中的新鲜Docker容器

from chopsticks.tunnel import Docker
from chopsticks.group import Group
from chopsticks.facts import python_version

group = Group([
    Docker('worker-1', image='python:3.4'),
    Docker('worker-2', image='python:3.5'),
    Docker('worker-3', image='python:3.6'),
])

for host, python_version in group.call(python_version).items():
    print('%s Python version:' % host, python_version)

隧道和组可以懒加载地连接(或者您可以通过调用connect()来主动连接它们)。它们也可以作为上下文管理器使用

# Explictly connect and disconnect
group.connect()
group.call(time.time)
group.close()

# Reconnect and disconnect as context manager
with group:
    group.call(time.time)

# Implicit reconnect
group.call(time.time)

# Disconnect when destroyed
del group

当然,当关闭隧道/组时,任何远程状态(导入、全局变量等)都会丢失。

安装

可以从仓库的克隆版本直接使用Chopsticks;或者使用pip进行安装

$ pip install chopsticks

API

有关完整的文档,请参阅Read The Docs上的文档

Python 2/3

Chopsticks支持Python 2和Python 3。

因为Chopsticks认为代理与控制器运行在相同的代码库中,所以代理将尝试使用与控制器进程相似的Python解释器

  • 如果控制器进程是(任何)Python 2,则使用/usr/bin/python2

  • 如果控制器进程是(任何)Python 3,则使用/usr/bin/python3

工作原理

SSH隧道在远程主机上调用python二进制文件,并通过stdin传递一个引导脚本。

引导完成后,远程的“代理”将通过隧道的stdin/stdout设置双向通信。这种通信(目前)用于两个目的

  • 一个RPC系统,用于在远程代理中调用任意可调用项,并将返回的值传递回控制器。

  • 一个PEP-302导入钩子系统,允许远程代理从控制器导入纯Python代码(注意:控制器只能提供位于文件系统中的Python模块 - 目前不支持如zipimport/compressed eggs之类的导入钩子)。

stderr将被回显到控制台,前面带有主机名以标识它来自哪个隧道。因此,可以使用它将调试信息反馈到编排主机。

许可

Apache License 2.0

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

chopsticks-1.0.tar.gz (57.4 kB 查看哈希值)

上传时间 源代码

构建分发

chopsticks-1.0-py2.py3-none-any.whl (28.5 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下组织支持