跳转到主要内容

基于Python Asyncio的异步配置管理

项目描述

Okonf

基于Python Asyncio的异步配置管理系统。

Okonf管理POSIX兼容系统的状态和配置。您可以使用它来配置您的个人电脑、服务器、路由器等。

Okonf推崇一种 声明式语法,其目标是确保目标主机的给定状态,而不是在其上运行命令。

Okonf强调作为库在您自己的应用程序中 易于使用,并且 易于通过可重用组件扩展

Okonf还通过异步运行来关注卓越的性能。

灵感来自: pyinfra, Ansible, SaltStack

状态

Okonf仍处于早期开发阶段,其API可能发生变化。

欢迎提出建议和贡献。

作为库的使用

from okonf.connectors import LocalHost
from okonf.facts.files import FileContent
from okonf.utils import run

host = LocalHost()

run(
    FileContent('/tmp/some_file', b'Some Content').apply(host),
)

更高级的使用

import asyncio
from okonf.connectors.ssh import SSHHost
from okonf import Collection
from okonf.facts.files import FileContent
from okonf.facts.git import GitClone

host = SSHHost(host='127.0.0.1', username='myuser')

facts = Collection([
    FileContent('/tmp/some_file', b'Some Content'),
    GitClone('git@github.com:okeso/Okonf.git', '/opt/Okonf'),
])

asyncio.run(Collection.apply(host))

作为工具的使用

在Python文件(此处命名为infra.py)中声明您的基础设施,包含名为hostsconfigs的两个字典。例如,我们希望在系统中安装vimtreehtop

from okonf.connectors import LocalHost
from okonf.facts.apt import AptPresent

hosts = {
    'laptop': LocalHost(),
}

configs = {
    'laptop': Sequence(
        AptPresent(pkg) for pkg in
        ['vim', 'htop', 'tree'']
    ),
}

如果您通过pip安装了Okonf,然后您应该能够使用以下方法检查当前状态:

okonf check infra.py laptop

并使用以下方法应用您的配置:

okonf apply infra.py laptop

掌握了基础知识后,您可以将连接器替换为SSHHost,并查看您想要使用的其他事实。

集合

Okonf提供了两种类型的集合,将任务分组到新的高级任务中:CollectionSequence

事实的Collection将并行、异步地应用每个事实。

事实的Sequence将以顺序方式,在先前的每个事实之后应用每个事实。

在下面的示例中,两个事实帮助提供共同的功能,但它们之间不依赖,可以并行应用。

vim_configured = Collection([
    AptPresent('vim'),
    FileCopy('~/.vimrc', 'vimrc'),
])

然而,在另一个示例中,每个事实都依赖于前一个事实,因此它们是顺序应用的。

ipython_virtualenv = Sequence([
    AptPresent('virtualenv'),
    DirectoryPresent('~/.virtualenvs/'),
    Virtualenv('~/.virtualenvs/venv-ipython'),
    PipInstalled(['itpython'], '~/.virtualenvs/venv-ipython'),
])

创建事实

下面的示例显示了确保文件存在于磁盘上的事实的定义。如果文件存在,则enquire方法返回,如果文件不存在,则调用enforce方法,在主机上运行shell命令以创建文件。

from okonf.facts.abstract import Fact


class FilePresent(Fact):
    """Ensure that a file is present"""

    def __init__(self, remote_path: str) -> None:
        self.remote_path = remote_path

    async def enquire(self, host):
        command = "ls -d {}".format(self.remote_path)
        return await host.check_output(command, check=False) != ''

    async def enforce(self, host):
        await host.check_output("touch {}".format(self.remote_path))
        return True

许可

Okonf采用Apache License 2.0许可。

项目详情


下载文件

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

源代码分发

Okonf-0.2.2.tar.gz (17.5 kB 查看散列值)

上传时间 源代码

构建分发

Okonf-0.2.2-py3-none-any.whl (22.8 kB 查看散列值)

上传时间 Python 3

由以下支持

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