封装Google云客户端以简化部署。
项目描述
gcloudwrap
gcloudwrap提供对Google API客户端的封装,以帮助您管理您的Google云(即其“计算”组件)。原始客户端提供了所有必需的功能,而gcloudwrap在额外功能方面添加得很少。然而,我们发现围绕云管理的一个薄封装更容易使用,这为我们提供了接近我们反复执行的任务的领域语言。
最初,由于原始的Google API客户端缺乏类型注解,并且其动态创建对象的方式在PyCharm等IDE中无法进行代码检查,我们发现使用它进行开发比较困难。由于涉及云管理的脚本通常执行时间较长,我们发现我们的开发迭代周期相当长,并且经常因为与类型错误相关的微小错误而中断。因此,我们添加了类型注解,以便静态分析器(如mypy)可以提前捕获类型错误。这极大地简化了部署脚本的开发。
请注意,我们并没有包装所有的Google Compute API。我们只关注了部署所需的那些部分。如果您希望包装更多功能,请创建一个问题。
场景
批量作业
使用gcloudwrap编写大型批量作业的部署脚本非常直接
启动几台机器。
使用google-cloud-storage模块从存储中复制必要的数据。
使用SSH Python模块(如spurplus)安装依赖项,复制已发布的可执行文件,并在tmux中启动进程(以便在您退出shell后它们仍然保持运行)。
在这种配置下,不需要额外的虚拟化层(如Docker),您也不需要了解如何设置和维护额外的集群管理工具。这对我们来说在不同规模上(从小型的单次批量作业到大规模部署)都工作得非常好。此外,我们发现直接在机器上调试(并在之后恢复)比通过额外的虚拟化层要简单得多。
部署
除了批量作业外,我们还大量使用gcloudwrap进行云部署。我们的工作流程包括
预留外部地址,
创建实例,
标记实例(通常为了修改防火墙规则),
授权SSH密钥,
创建和附加持久磁盘,
(如果需要)格式化磁盘并将它们挂载,
运行初始化和安装脚本(基于SSH模块如spurplus)。
gcloudwrap旨在与原始Google Python API客户端相比大大简化流程。
(如果您需要在其他地点部署,我们建议您明确地将初始化脚本与部署脚本分开。初始化脚本应接受用户名和主机名作为参数,并通过SSH远程执行命令。)
当您在Google Cloud上部署时,创建实例并使用它授权您的SSH密钥。一旦实例启动,运行初始化脚本针对其外部IP地址作为主机名,以及您用SSH密钥授权的任何用户。
如果您需要在其他地点部署,请他们授权您的SSH密钥。现在您可以使用不同的用户名和主机名简单运行相同的初始化脚本。)
使用方法
我们尽可能遵循API的命名。API的定义和描述可以在这里找到:Google Compute API。然而,我们遵循Python命名规范,将所有camelCase参数重命名为snake_case。
以下代码片段显示了一个常见的部署示例,它创建了一个具有持久磁盘和预留外部IP地址的实例。该实例被标记为‘default-allow-http’,以在防火墙中打开HTTP端口。最后,我们授权实例使用公共SSH密钥。
import pathlib
import gcloudwrap
instance = 'some-instance'
address = 'some-address'
disk = 'some-persistent-disk'
device_name = 'persistency'
service_account = 'some-service-account@some-project-221984.iam.gserviceaccount.com
public_ssh_key = pathlib.Path(
'/some/path/to/ssh/id_rsa.pub').read_text()
gce = gcloudwrap.Gce()
gce.addresses.insert(name=address)
static_ip = gce.addresses.static_ip(
address=address)
gce.disks.insert(
name=disk,
disk_type='pd-standard',
size_gb=5)
gce.instances.insert(
name=instance,
machine_type='f1-micro',
address=static_ip,
service_account=service_account)
gce.instances.attach_disk(
instance=instance,
disk=disk,
device_name=device_name)
# open up HTTP port
tags = gce.instances.tags(instance=instance)
tags.items.add('default-allow-http')
gce.instances.set_tags(
instance=instance, tags=tags)
# authorize the SSH key
keys = gcloudwrap.SSHKey(
user='some-user',
public_key=public_key)
metadata = gce.instances.metadata(instance=instance)
metadata.set_ssh_keys(keys=[key])
gce.instances.set_metadata(
instance=instance,
metadata=metadata)
# format the persistent disk and mount it
ssh = gce.instances.ssh(
instance=instance,
user="some-devop-user")
operator = gcloudwrap.Operator(call_fn=ssh.call)
operator.format_disk(
device_name=device_name)
operator.mount_disk(
device_name=device_name,
path=pathlib.Path('/mnt/disks/persistency'))
有时,将授权SSH密钥的列表存储在文件中并在部署实例时重用该列表是很方便的。我们提供了一个快捷函数gcloudwrap.ssh_keys_from_file来实现这一点
import gcloudwrap
instance = 'some-instance'
keys_path = '/path/to/some/keys.txt'
keys = gcloudwrap.ssh_keys_from_file(
path=keys_path,
default_user='some-default-user')
metadata = gce.instances.metadata(instance=instance)
metadata.set_ssh_keys(keys=keys)
gce.instances.set_metadata(
instance=instance,
metadata=metadata)
安装
创建一个虚拟环境
python3 -m venv venv3
激活它
source venv3/bin/activate
使用pip安装gcloudwrap
pip3 install gcloudwrap
设置应用程序默认凭证
gcloud auth application-default login
开发
检出存储库。
在存储库根目录中,创建虚拟环境
python3 -m venv venv3
激活虚拟环境
source venv3/bin/activate
安装开发依赖项
pip3 install -e .[dev]
我们提供了一套实时测试。您需要设置环境,以便测试可以直接推断凭证。除了凭证外,您还可以使用以下环境变量
TEST_GCLOUDWRAP_SERVICE_ACCOUNT 用于指定在测试过程中创建的实例附加的服务账户。如果未指定,则使用GCE项目的默认服务账户。
TEST_GCLOUDWRAP_PREFIX 用于指定所有创建的Google云资源的名称前缀;如果未指定,则等于“test-gcloudwrap”
TEST_GCLOUDWRAP_SSH_PUBLIC_KEY_PATH 用于指定SSH公钥的路径;如果未指定,则等于 ~/.ssh/id_rsa.pub(其中“~”展开为用户主目录)
请注意,实时测试将使用Google Cloud资源,您将为此付费。请始终检查测试完成后没有使用任何资源,以避免产生不必要的费用!
我们使用tox进行测试和打包发行版。假设虚拟环境已激活并且已安装开发依赖项,请运行
tox
我们还提供了一套预提交检查,用于lint和检查代码格式。在激活的虚拟环境中运行带有开发依赖项的本地版本
./precommit.py
预提交脚本还可以自动格式化代码
./precommit.py --overwrite
版本控制
我们遵循语义版本控制。版本X.Y.Z表示
X是主版本(不向后兼容),
Y是次要版本(向后兼容),
Z是补丁版本(向后兼容的bug修复)。
项目详细信息
gcloudwrap-1.0.5.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a745a12f38aacd6f1463932b0324553ac58d6839076fb0d826975b758b6b5552 |
|
MD5 | 938d6a9bff6be8ee159e60c0d998b003 |
|
BLAKE2b-256 | 2183d74a3873ad6bd35ece087808e204e43b7cb7086499859aeaa3eaeb9ae3de |