У меня похожая задача решена, только отличия в том, что факты на сервере статичные, и прописываются централизовано, а никак у тебя берутся из docker ps -a.
У меня на каждом сервере такой факт с массивом
Например server1:
"projects": [
"project1",
"project2",
"project3"
]
server2:
projects": [
"project1",
"project4",
"project5"
]
В hiera.yaml для этого факта такая конструкция:
-
name: "projects"
mapped_paths: [projects, p, "projects/%{environment}/%{p}.yaml"]
Таким образом я получаю возможность через hiera задавать параметры классов на определенный проект, без разницы на каких серверах он находится.
Например project1 есть на server1, server2
Агенты на обоих серверах получат ключи из projects/production/project1.yaml
Но тут есть нюанс, особенно у тебя. Так как ты получаешь факт из docker ps, то если у тебя не запущен контейнер, то факта не будет, соотвесвтенно твои ключи в hiera агент не увидет. То есть поднятие контейнера лучше оставить там где оно у тебя реализовано. А таким сопобом просто переопределять дефолтные настройки. Если параметры необходимые для того чтобы контейнер был поднят на сервере будут зависить от такого факта, то в случае если контейнер будет остановлен, puppet уже его не поднимет.
Ну и надо будет помнить, что потребуется два прогона агента в случае остановки контейнера. Первый раз прогоняешь, puppet запускает контейнер, второй прогон он уже видит факт и переопределяет параметры.