Как я могу заменить значение во вложенном dict фильтрами или jinja, мне все равно, пока метод работает.
У меня есть отображение службы, определенное в group_vars, например:
backend_services:
svc1:
env_vars:
DB_DATABASE: svc1_db
DB_HOST: "{{postgres_db.host}}"
DB_PASSWORD: "{{postgres_db.password}}"
DB_PORT: "{{postgres_db.port}}"
DB_USER: "{{postgres_db.username}}"
ENVIRONMENT: "{{environment_name}}"
LOG_LEVEL: "{{default_log_level}}"
svc2:
env_vars:
DB_DATABASE: svc2_db
DB_HOST: "{{postgres_db.host}}"
DB_PASSWORD: "{{postgres_db.password}}"
DB_PORT: "{{postgres_db.port}}"
DB_USER: "{{postgres_db.username}}"
ENVIRONMENT: "{{environment_name}}"
LOG_LEVEL: "{{default_log_level}}"
svc3:
env_vars:
DB_DATABASE: svc3_db
DB_HOST: "{{postgres_db.host}}"
DB_PASSWORD: "{{postgres_db.password}}"
DB_PORT: "{{postgres_db.port}}"
DB_USER: "{{postgres_db.username}}"
ENVIRONMENT: "{{environment_name}}"
LOG_LEVEL: "{{default_log_level}}"
Что я хочу сделать, это l oop через эту переменную backend_services и заменить все значения DB_HOST (которые в настоящее время жестко заданы) на значение, которое я динамически извлекаю из среды хоста. Для контекста я развертываю в облачной среде с управляемым экземпляром SQL, который был предоставлен Terraform. Я могу получить этот управляемый sql хост в переменную с заданным фактом, но затем нужно изменить это отображение.
Я пробовал разные методы зацикливания, используя объединение, использование вложенных циклов с файлом include_tasks и использование set_fact с jinja вместо фильтров.
Что я могу заставить работать так:
set_fact:
new_service: "{{ backend_services['svc1'] | combine({'env_vars': {'DB_HOST': 'foo'} }, recursive=True)}}"
Однако я не могу понять, как oop, что со всеми элементами backend_services.