Places: provisioning hosts¶
The opslib.places
module defines components for provisioning resources
inside hosts. They are used to set up configuration files, scripts, and run
commands.
Hosts¶
LocalHost
represents the local host where Opslib is
run. SshHost
represents a host that can be accessed
over SSH. Both inherit from BaseHost
.
The host components don’t actually deploy anything. They are needed by other components to tell them where to operate, and provide handy factory methods to create them.
from opslib import LocalHost, Stack
stack = Stack(__name__)
stack.host = LocalHost()
Directories and Files¶
Directory
represents a directory in a particular host.
During deployment it gets created and optionally a permissions mode is set.
from pathlib import Path
from opslib import Directory
stack.directory = Directory(
host=stack.host,
path=Path("/opt/opslib"),
)
Using the shorthand directory()
method, this is
equivalent:
stack.directory = stack.host.directory("/opt/opslib")
The directory also has a convenience subdir()
method to create a subdirectory, which is also aliased to the /
operator:
stack.appdir = stack.directory.subdir("app")
stack.appdir = stack.directory / "app"
File
represents a file on a particular host.
stack.hello_txt = File(
host=stack.host,
path=Path("/opt/opslib/app/hello.txt"),
content="Hello World!\n",
)
The BaseHost.file()
and
Directory.file()
methods can be used as
shorthand; the latter in particular makes for terse code that doesn’t repeat
directory paths much:
stack.hello_txt = stack.host.file(
path=Path("/opt/opslib/app/hello.txt"),
content="Hello World!\n",
)
stack.hello_txt = stack.appdir.file(
name="hello.txt",
content="Hello World!\n",
)
Commands¶
Command
will run a command on a particular host upon
deployment.
from textwrap import dedent
from opslib import LocalHost, Stack
stack = Stack(__name__)
stack.host = LocalHost()
stack.directory = stack.host.directory("/opt/opslib/app")
stack.compose_file = stack.directory.file(
name="docker-compose.yml",
content=dedent(
"""\
version: "3"
services:
app:
image: nginx
ports:
- 8080:80
"""
),
)
compose_args = ["docker", "compose", "--project-directory", stack.directory.path]
stack.compose_up = stack.host.command(
args=[*self.compose_args, "up", "-d", "-t1"],
)
This will run docker compose up -d
, in the directory /opt/opslib/app
,
on each deployment.
If the run_after
prop is set, the command will only run after one of the
listed components is deployed and reports that it changed:
stack.compose_up = stack.host.command(
args=[*self.compose_args, "up", "-d", "-t1"],
run_after=[stack.compose_file],
)
Defined like this, the compose_up
command will only run after
docker-compose.yml
is changed.