与Vagrant虚拟机交互的Python绑定。
项目描述
简介
Python-vagrant是一个python模块,它提供了一个对vagrant
命令行可执行文件的薄包装,允许以编程方式控制Vagrant虚拟机(盒子)。此模块非常有用,可以
- 启动Vagrant虚拟机(VM)(
up
)。 - 终止Vagrant VM(
destroy
)。 - 停止Vagrant VM而不销毁它(
halt
)。 - 查询VM或VMs的状态(
status
)。 - 获取SSH配置信息,用于SSH连接到VM。(
host
,port
,...) - 使用
vm_name
参数在多虚拟机环境中运行vagrant
命令。 - 使用init()初始化基于命名基础镜像的虚拟机。
- 添加、删除和列出镜像(
box add
、box remove
、box list
)。 - 配置虚拟机 - up()接受如
no_provision
、provision
和provision_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_cm
和err_cm
参数或使用Vagrant.__init__
的quiet_stdout
和quiet_stderr
参数来静音底层vagrant进程的stdout和stderr。
使用out_cm
和err_cm
将stdout和stderr重定向到/dev/null
v = vagrant.Vagrant(out_cm=vagrant.devnull_cm, err_cm=vagrant.devnull_cm)
v.up() # normally noisy
使用quiet_stdout
和quiet_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_cm
和err_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
>>>
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。