CI run 40979252521 Weblate#1 (swarm) never converged: every task after
the first died in collectstatic with "PermissionError: [Errno 13]
Permission denied: '/app/cache/static/weblate_fonts'". The tmpfs at
/app/cache/static sits inside the shared weblate_cache volume; the first
task's runc creates the mountpoint as root 0755, and runc gives a tmpfs
on an existing mountpoint that directory's mode. 99a7d28067 declared
mode 1777, which compose honours, but docker stack deploy keeps only the
tmpfs size (docker/cli 29.9.2 convert/volume.go), so swarm still got a
root 0755 tmpfs.
- utils/storage/nfs.py: nested_tmpfs_mountpoints() derives every tmpfs
mountpoint whose innermost enclosing volume of the same service is
NFS-backed, with its declared mode; a nested tmpfs without a mode, or
one mountpoint declared with two modes, raises.
- plugins/lookup/nfs_tmpfs_mountpoints.py feeds it the rendered compose
volumes, so compose_volumes stays the source of which volumes live on
NFS.
- sys-svc-compose nfs_prep.yml creates those mountpoints on the NFS
server with the declared mode before every stack deploy, which also
repairs a mountpoint an earlier deploy left at 0755.
- web-app-weblate: the cache volume declares nfs uid 1000, gid 0,
mode 0770; a pre-created mountpoint makes the volume non-empty, so
Docker no longer copies the image's /app/cache root in.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This directory contains custom Ansible lookup plugins used within the Infinito.Nexus project.
When to Use a Lookup Plugin
Load external data: Use lookups to retrieve data from files, APIs, databases, environment variables, or other external sources.
Context-aware data access: Lookups can access the full Ansible context, including inventory, facts, and runtime variables.
Generate dynamic lists: Lookups are often used to build inventories, secrets, or host lists dynamically.
Examples
# Load the contents of a file as a variablemy_secret:"{{ lookup('file', '/path/to/secret.txt') }}"# Retrieve a list of hostnames from an external sourcehost_list:"{{ lookup('infinito_inventory_hosts', 'group_name') }}"
When not to Use a Lookup Plugin
If you only need to manipulate or transform data already available in your playbook, prefer a filter plugin instead.