跳转到主要内容

使用Python控制虚拟机、容器和其他机器,利用实时快照

项目描述

指尖

这个程序/库旨在成为

  • 使用实时VM快照在几秒钟内启动虚拟机和容器的方式
  • 通过编写小型而整洁的函数从Python中以统一的方式控制机器
  • 组合并透明地缓存这些函数的结果
  • 构建利用实时VM快照和检查点的酷炫应用程序
  • 控制非本地虚拟机的其他类型的机器

同时,努力保持故意低功耗并施加尽可能少的限制。如果您觉得它以最懒惰的方式什么都没做,那就是它。

目前处于alpha阶段。

预告

从您的shell执行它的示例

$ fingertip os.fedora + ssh  # install Fedora and SSH into it
$ fingertip os.alpine + console  # install Alpine, access serial console
$ fingertip os.alpine + ansible package --state=present --name=patch + ssh
$ fingertip backend.podman-criu + os.alpine + console  # containers!
$ fingertip os.fedora + script.debug myscript.sh  # checkpoint-powered debugger

Python使用和编写您自己的步骤的示例

import fingertip

def main(m=None, alias='itself'):
    m = m or fingertip.build('os.fedora')
    m = m.apply('ansible', 'lineinfile', path='/etc/hosts',
                line=f'127.0.0.1 {alias}')
    with m:
        assert '1 received' in m(f'ping -c1 {alias}').out
    return m

放入 fingertip/plugins/demo.py,现在可以在管道中使用它

$ fingertip demo
$ fingertip os.fedora + demo me
$ fingertip os.alpine + demo --alias=myself + ssh

安装

参阅 INSTALL.md

Shell使用

如果您已安装指尖,请作为 fingertip 调用它。

如果您正在从签出中运行,请使用 python3 <path to checkout> 或创建别名。

如果您正在使用容器化版本,请调用 fingertip-containerized(并抱最好的希望)。

所以,

$ fingertip os.fedora + ssh

您应该观察 Fedora 安装启动,然后关闭,再次启动,最后通过 SSH 获得对该机器的交互式控制。

再次调用相同的命令,它应该几乎不做任何事情,因为下载和安装已经缓存在 ~/.cache/fingertip 中。享受在几秒钟内启动的全新干净的 VM。感觉它们已经在你指尖。可以通过控制台或 Python 来控制它们。

Python 使用方法

让我们看看操作机器的样子可以是什么样子(《fingertip/plugins/self_test/greeting.py》)

def make_greeting(m, greeting='Hello!'):                      # take a machine
    with m:                                                   # start if needed
        m.console.sendline(f"echo '{greeting}' > .greeting")  # type a command
        m.console.expect_exact(m.prompt)                      # wait for prompt
    return m                                                  # cache result


@fingertip.transient                                          # don't lock/save
def main(m, greeting='Hello!'):                               # take a machine
    m = m.apply(make_greeting, greeting=greeting)             # use cached step
    with m:                                                   # start if needed
        assert m('cat .greeting').out.strip() == greeting     # execute command
                                                              # do not save

插件是常规的 Python 函数,没有复杂的功能。您只需将它们传递给 fingertip.build('fedora'),它就会工作。即使是这个 @fingertip.transient 也是一个对 .apply() 的优化提示。

以下是在此类函数内部可能发生的情况

  • 它接受一个机器作为第一个参数(可能已经启动或未启动,您不知道)。
  • 它检查它,并根据需要应用更多函数(通过 .apply 应用额外步骤如果可能的话会缓存/重用)。
  • 如果需要应用任何自定义步骤或更改,则必须首先使用 with 块启动机器(with m as m)。对机器的所有修改都必须在这个块内进行,否则可能会默默取消!
  • 如果结果应该被缓存并用于下一步,则应返回机器。不返回机器通常会导致取消您所做的所有更改。如果您不打算保存结果,请不要返回 m;另外,用 @fingertip.transient 装饰函数,以便 fingertip 可以应用性能优化并避免锁定。还有更多内容,请参阅 docs/on_transiency.md 获取详细信息。

链中的第一个函数(或在 fingertip.build 中使用的函数)不会作为第一个参数接收机器。要编写通用函数,请使用

def func(m=None):
    m = m or fingertip.build('fedora')
    ...

免责声明

由于我确切地缓存了什么以及开发处于早期阶段,请在每次更新后至少清空一次 ~/.cache/fingertip/machines

$ fingertip cleanup machines all

有时需要清除整个 ~/.cache/fingertip

$ fingertip cleanup everything

项目详情


下载文件

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

源分发

fingertip-0.3.7.tar.gz (58.5 kB 查看哈希值

上传时间

构建分发

fingertip-0.3.7-py3-none-any.whl (79.2 kB 查看哈希值

上传时间 Python 3

支持者