Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mgax/opslib
A Pythonic toolkit to manage infrastructure
https://github.com/mgax/opslib
Last synced: 8 days ago
JSON representation
A Pythonic toolkit to manage infrastructure
- Host: GitHub
- URL: https://github.com/mgax/opslib
- Owner: mgax
- License: mit
- Created: 2023-03-09T20:07:20.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-07-07T10:19:50.000Z (4 months ago)
- Last Synced: 2024-08-09T23:04:54.500Z (3 months ago)
- Language: Python
- Homepage: https://pyopslib.readthedocs.io
- Size: 333 KB
- Stars: 8
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
- Contributing: docs/contributing.rst
- License: LICENSE
Awesome Lists containing this project
README
# Opslib
[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/TbaFKfusS6)
Opslib is a Python infrastructure-as-code framework which offers powerful abstractions to make deployment straightforward and fun.
Check out [opslib-contrib](https://github.com/mgax/opslib-contrib) for ready-made integrations with various tools and technologies.
### Installing
```shell
$ pip install -U pyopslib
```## A Simple Example
```python
# stack.py
from opslib import SshHost, Stack
from opslib.ansible import AnsibleAction
from opslib.terraform import TerraformProviderstack = Stack(__name__)
stack.hetzner = TerraformProvider(
name="hcloud",
source="hetznercloud/hcloud",
version="~> 1.38.2",
)stack.server = stack.hetzner.resource(
type="hcloud_server",
args=dict(
name="opslib-example",
server_type="cx11",
image="debian-11",
location="hel1",
ssh_keys=["my-key"],
),
output=["ipv4_address"],
)stack.vm = SshHost(
hostname=stack.server.output["ipv4_address"],
username="root",
)stack.install_docker = AnsibleAction(
host=stack.vm,
module="ansible.builtin.shell",
args=dict(
cmd="curl -s https://get.docker.com | bash",
creates="/opt/bin/docker",
),
)
```Deploy the stack. It's called `-` because it's the top level _Stack_ object:
```shell
export HCLOUD_TOKEN="..." # https://docs.hetzner.com/cloud/api/getting-started/generating-api-token
opslib - deploy
```Now we can interact with the VPS host, which we named `vm` above:
```shel
opslib vm run 'set -x; whoami; uptime'
opslib vm run docker run --rm hello-world
```Finally, we tear down the stack:
```shell
opslib - destroy
```## Features
Opslib does its best to enable readable code so you can reason about your stack. This means making use of [descriptors](https://docs.python.org/3/howto/descriptor.html), [typing](https://docs.python.org/3/library/typing.html) and other Python language features where it makes sense.
* Defining components
* Define the stack in terms of [nested components](https://pyopslib.readthedocs.io/en/latest/components.html) with typed [props](https://pyopslib.readthedocs.io/en/latest/components.html#props).
* [Extensible cli](https://pyopslib.readthedocs.io/en/latest/cli.html): any component in the stack can be referenced directly and may [define its own commands](https://pyopslib.readthedocs.io/en/latest/cli.html#defining-custom-commands).
* Batteries included
* Terraform: invoke any provider from the Terraform Registry.
* Ansible: invoke any module from Ansible Collections.
* Places: native modeling of local/remote hosts, files, directories and shell commands.
* A handful of specific integrations (e.g. systemd, restic). _I plan to spin them off into a library of reusable components._
* Operations model
* Most actions boil down to invoking [subprocess commands](https://pyopslib.readthedocs.io/en/latest/api.html#opslib.local.run) or HTTP requests. All actions return [Results](https://pyopslib.readthedocs.io/en/latest/api.html#opslib.results.Result), which are understood by the reporting layer.
* Many components, after being successfully deployed, are skipped on subsequent deployments, unless their props change, or are manually refreshed to account for remote state changes.
* [Commands](https://pyopslib.readthedocs.io/en/latest/api.html#opslib.places.Command) may track deployment of other components (e.g. configuration files) and only get re-run when needed.
* [Lazy variables](https://pyopslib.readthedocs.io/en/latest/components.html#lazy-values), that wrap values which are available after another component is deployed, get evaluated when they are needed.## Links
* Documentation: https://pyopslib.readthedocs.io
* Examples: https://github.com/mgax/opslib/tree/main/examples
* Discord: https://discord.gg/TbaFKfusS6