跳转到主要内容

与Vagrant虚拟机交互的Python绑定。

项目描述

简介

Python-vagrant是一个python模块,它提供了一个对vagrant命令行可执行文件的薄包装,允许以编程方式控制Vagrant虚拟机(盒子)。此模块非常有用,可以

  • 启动Vagrant虚拟机(VM)(up)。
  • 终止Vagrant VM(destroy)。
  • 停止Vagrant VM而不销毁它(halt)。
  • 查询VM或VMs的状态(status)。
  • 获取SSH配置信息,用于SSH连接到VM。(hostport,...)
  • 使用vm_name参数在多虚拟机环境中运行vagrant命令。
  • 使用init()初始化基于命名基础镜像的虚拟机。
  • 添加、删除和列出镜像(box addbox removebox list)。
  • 配置虚拟机 - up()接受如no_provisionprovisionprovision_with等选项,并且有一个provision()方法。
  • 使用来自Sahara的沙盒模式。

这个项目开始是因为我想为Vagrant编写Python绑定,这样我就可以使用Fabric以编程方式访问我的vagrant box。请告诉我您如何使用python-vagrant。我很乐意分享更多的用例。-Todd DeLuca

版本控制和API稳定性

此包为beta版本,其API可能不稳定。API试图与vagrant API术语保持一致,以方便熟悉Vagrant的用户进行知识迁移。随着时间的推移,python-vagrant API已更改,以更好地匹配底层vagrant CLI,并随着该CLI的变化而发展。

包版本号的形式为0.X.Y。最初的0反映了此项目的beta性质。当出现不兼容的更改时,X号增加。当添加向后兼容的功能或错误修复时,Y号增加。

需求

  • Vagrant 2.2或更高版本。强烈建议使用Vagrant的最新版本。
  • Vagrant需要VirtualBox、VMWare或其他支持的提供程序。
  • Python 3.8或更高版本。
  • Sahara gem for Vagrant是可选的。它将允许您使用SandboxVagrant

安装

从pypi.python.org安装

下载并安装python-vagrant

pip install python-vagrant

从github.com安装

克隆并安装python-vagrant

cd ~
git clone git@github.com:pycontribs/python-vagrant.git
cd python-vagrant
python setup.py install

用法

一个虚构的示例,展示如何启动vagrant box(使用当前目录中的Vagrantfile)并在其上运行fabric任务

import vagrant
from fabric.api import env, execute, task, run

@task
def mytask():
    run('echo $USER')

v = vagrant.Vagrant()
v.up()
env.hosts = [v.user_hostname_port()]
env.key_filename = v.keyfile()
env.disable_known_hosts = True # useful for when the vagrant box ip changes.
execute(mytask) # run a fabric task on the vagrant host.

另一个示例展示如何使用fabric与vagrant多虚拟机功能一起使用

import vagrant
from fabric.api import *

@task
def start(machine_name):
   """Starts the specified machine using vagrant"""
   v = vagrant.Vagrant()
   v.up(vm_name=machine_name)
   with settings(host_string= v.user_hostname_port(vm_name=machine_name),
                 key_filename = v.keyfile(vm_name=machine_name),
                 disable_known_hosts = True):
        run("echo hello")

默认情况下,python vagrant实例是安静的,这意味着它们捕获stdout和stderr。对于“大声”实例,使用vagrant.Vagrant(quiet_stdout=False)。将quiet_stderr=False设置为更响亮的版本。

与Vagrant子进程交互

Vagrant类通过在子进程中执行vagrant命令并解释输出来工作。根据用户的需求,可以通过更改其环境和将其stdout和stderr发送到何处来定制与子进程的通信。

静音Vagrant子进程的Stdout或Stderr

可以使用out_cmerr_cm参数或使用Vagrant.__init__quiet_stdoutquiet_stderr参数来静音底层vagrant进程的stdout和stderr。

使用out_cmerr_cm将stdout和stderr重定向到/dev/null

v = vagrant.Vagrant(out_cm=vagrant.devnull_cm, err_cm=vagrant.devnull_cm)
v.up() # normally noisy

使用quiet_stdoutquiet_stderr将stdout和stderr重定向到/dev/null

v = vagrant.Vagrant(quiet_stdout=True, quiet_stderr=True)
v.up() # normally noisy

这些功能上是等效的。

记录Vagrant子进程的Stdout或Stderr

用户可能希望将vagrant子进程的stdout和stderr重定向到文件,例如记录和分析自动化过程的结果。这可以通过使用Vagrant.__init__out_cmerr_cm参数来完成。

例如,将子进程的stdout和stderr记录到文件'deployment.log'中

log_cm = vagrant.make_file_cm('deployment.log')
v = vagrant.Vagrant(out_cm=log_cm, err_cm=log_cm)
v.up() # normally noisy

更改Vagrant子进程的环境

可以使用环境变量与Vagrant子进程进行通信。Vagrantfile可以期望环境变量存在并根据其进行操作。环境变量可以通过python-vagrant设置。

import vagrant

v = vagrant.Vagrant()

os_env = os.environ.copy()
os_env['USE_NFS'] = '1'

v.env = os_env
v.up()  # will pass env to the vagrant subprocess

或者,可以在实例化时传递环境变量。

import vagrant

os_env = os.environ.copy()
os_env['USE_NFS'] = '1'

v = vagrant.Vagrant(env=env)
assert v.env is env  # True
v.up()  # will pass env to the vagrant subprocess

贡献

如果您使用python和vagrant,而这个项目不能满足您的需求,请在该项目的GitHub上打开一个issue或pull request:github

请参阅CHANGELOG.md以获取贡献者和详细贡献列表。

在提交pull request时,请包括测试您更改的单元测试,并确保任何现有测试仍然有效。请参阅下方的测试部分。

测试

运行完整的测试套件可能需要大约10分钟。它涉及到下载虚拟机镜像和多次启动和停止虚拟机。

从存储库的顶级目录运行测试

tox -e py

以下是运行单个测试的示例

tox -e py -- -k tests.test_vagrant:test_boxes

手动测试控制vagrant子命令输出发送到控制台或devnull的功能

>>> import vagrant
>>> import os
>>> vagrantfile = '/Users/tfd/proj/python-vagrant/tests/vagrantfiles/single_box'
>>> # Demonstrate a quiet Vagrant.  Equivalent to out_cm=vagrant.devnull_cm
... v1 = vagrant.Vagrant(vagrantfile)
>>> v1.destroy() # output to /dev/null
>>> # Demonstrate a loud Vagrant.  Equivalent to out_cm=vagrant.stdout_cm
... v2 = vagrant.Vagrant(vagrantfile, quiet_stdout=False)
>>> v2.destroy() # stdout sent to console
==> default: VM not created. Moving on...
>>> # Demonstrate that out_cm takes precedence over quiet_stdout=True
... v3 = vagrant.Vagrant(vagrantfile, out_cm=vagrant.stdout_cm)
>>> v3.destroy() # output to console
==> default: VM not created. Moving on...
>>> # Demonstrate a quiet Vagrant using devnull_cm directly
... v4 = vagrant.Vagrant(vagrantfile, out_cm=vagrant.devnull_cm)
>>> v4.destroy() # output to console
>>>

项目详情


下载文件

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

源代码分发

python-vagrant-1.0.0.tar.gz (36.7 kB 查看哈希值)

上传时间: 源代码

构建分发

python_vagrant-1.0.0-py3-none-any.whl (19.4 kB 查看哈希值)

上传时间: Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面