Ansible: Как заменить значения во вложенном dict? - PullRequest
1 голос
/ 21 февраля 2020

Как я могу заменить значение во вложенном 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.

1 Ответ

1 голос
/ 21 февраля 2020
set_fact:
  new_service: "{{ backend_services['svc1'] |
                   combine({'env_vars': {'DB_HOST': 'foo'} }, recursive=True)}}"

Q: "Как l oop, что со всеми элементами backend_services?"

A: Задачи ниже выполняют работу

    - set_fact:
        my_services: "{{ backend_services.keys()|list }}"
    - set_fact:
        new_service: "{{ new_service|
                         default({})|
                         combine({item:
                                 {'env_vars':
                                  backend_services[item].env_vars|
                                  combine({'DB_HOST': 'foo'})}}) }}"
      loop: "{{ my_services }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...