from pyinfra import host from pyinfra.api import deploy from pyinfra.facts import files from pyinfra.operations import apt from pyinfra.operations import files as files_op from pyinfra.operations import server def generate_line(config: dict[str, str]) -> str: return f"{config.get('directory')} {config.get('ip')}({','.join(config.get('flags'))})" @deploy("Deploy NFS") def deploy_nfs(): nfs_config = host.data.get("nfs") for export in nfs_config.get("exports"): if not host.get_fact(files.Directory, export.get("directory")): raise ValueError(f"Directory {export.get('directory')} does not exist on remote!") files_op.file( name="Ensure /etx/exports exist", path="/etc/exports", present=True, ) apt.packages( name="Install nfs package", packages=[ "nfs-kernel-server", ], ) for export in nfs_config.get("exports"): files_op.line( name=f"Add {export.get('directory')} to config", path="/etc/exports", line=generate_line(export), present=True, ) server.service( name="Restart nfs service after configuring", service="nfs-kernel-server", restarted=True, enabled=True, )