Skip to main content

Chopsticks

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

Chopsticks is an orchestration library: it lets you manage and configure remote hosts over SSH.

Naturally this is agentless and nothing needs to be installed on the remote host except Python and an SSH agent.

It also has support for executing code in Docker containers.

It’s perhaps best compared to Ansible or Fabric, but has some clever transport magic which means it’s very easy to develop with: you just write Python functions that can be called from the orchestration host. No invoking bash commands (eg. Fabric) or writing self-contained scripts with constrained input and output formats (eg. Ansible).

One might also draw a comparison with Python’s built-in multiprocessing library, but instead of calling code in subprocesses on the same host, the code may be run on remote hosts.

Example

With chopsticks you can simply import functions and hand them to the remote host to be executed.

First stand up an SSH Tunnel:

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

Then you can pass a function, to be called on the remote host:

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

You can use any pure-Python function in the current codebase, meaning you can create your own libraries of orchestration functions to call on remote hosts (as well as functions that call out to remote hosts using Chopsticks).

Tunnel provides support for executing on a single host; there is also a Group that can execute a callable on a number of hosts in parallel:

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)

Subclasses of tunnels allow connecting using streams other than SSH, such as using sudo, or to fresh Docker containers for sandboxing:

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)

Tunnels and Groups connect lazily (or you can connect them proactively by calling connect()). They are also usable as context managers:

# 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

Naturally, any remote state (imports, globals, etc) is lost when the Tunnel/Group is closed.

Installation

Chopsticks can be used directly from a clone of the repo; or installed with pip:

$ pip install chopsticks

API

See the full documentation on Read The Docs.

Python 2/3

Chopsticks supports both Python 2 and Python 3.

Because Chopsticks takes the view that agents run out of the same codebase as the controller, agents will attempt to use a similar Python interpreter to the one for the controller process:

  • /usr/bin/python2 if the controller process is (any) Python 2.

  • /usr/bin/python3 if the controller process is (any) Python 3.

How it works

The SSH tunnel invokes the python binary on the remote host, and feeds it a bootstrap script via stdin.

Once bootstrapped, the remote “agent” sets up bi-directional communication over the stdin/stdout of the tunnel. This communication is used (currently) for two purposes:

  • An RPC system to invoke arbitrary callables within the remote agent and pass the returned values back to the controller.

  • A PEP-302 import hook system, allowing the remote agent to import pure-Python code from the controller (NB. the controller can only serve Python modules that live within the filesystem - import hooks such as zipimport/compressed eggs are not currently supported).

stderr is echoed to the controlling console, prefixed with a hostname to identify which Tunnel it issued from. This can therefore be used to feed debugging information back to the orchestration host.

License

Apache License 2.0

Metadata

Release files for chopsticks 1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for chopsticks 1.0
File Size Uploaded Provenance
chopsticks-1.0.tar.gz 57.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for chopsticks 1.0
File Interpreter ABI Platform
chopsticks-1.0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 85.9 kB

Release files / chopsticks-1.0.tar.gz

Download URL chopsticks-1.0.tar.gz
Size 57.4 kB
Tags Source
SHA-256 checksum
How to use checksums
b85856e7757884a3e866d8925d8c8949aa1fe8b9849fe9bfc1a50a5ff7c4e817
BLAKE2b-256 checksum
How to use checksums
9f81d6c21092db5e57a5114cce9c88955558bad1d8b42b5f0f815a9b7a9eba60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / chopsticks-1.0-py2.py3-none-any.whl

Download URL chopsticks-1.0-py2.py3-none-any.whl
Size 28.5 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
9c84876c76e79c006651018f90be7c318e8e9531280bee9571a87bd11725a13f
BLAKE2b-256 checksum
How to use checksums
9533566b001375f673ca245d1e57f1fbf77a4ad1ea8bc38601f18888f8aeff80
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for chopsticks 1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page