Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible:如何替换嵌套dict中的值?_Ansible - Fatal编程技术网

Ansible:如何替换嵌套dict中的值?

Ansible:如何替换嵌套dict中的值?,ansible,Ansible,我如何用过滤器或jinja替换嵌套dict中的值,只要该方法有效,我不在乎它 我在组变量中定义了一个服务映射,如下所示: backend_services: svc1: env_vars: DB_DATABASE: svc1_db DB_HOST: "{{postgres_db.host}}" DB_PASSWORD: "{{postgres_db.password}}" DB_PORT: "{{postgres_db.port}}"

我如何用过滤器或jinja替换嵌套dict中的值,只要该方法有效,我不在乎它

我在组变量中定义了一个服务映射,如下所示:

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}}"
我要做的是循环使用这个backend_services变量,并用我从主机环境动态检索的值替换所有DB_主机值(目前是硬编码的)。在上下文中,我将部署到一个具有托管SQL实例的云环境中,该实例已由Terraform提供。我可以使用set-fact将托管sql主机转换为变量,但随后需要修改此映射

我尝试过不同的循环方法,使用combine,使用包含任务文件的嵌套循环,使用set\u fact和jinja代替过滤器

我能做的是:

set_fact:
  new_service: "{{ backend_services['svc1'] | combine({'env_vars': {'DB_HOST': 'foo'} }, recursive=True)}}"
但是,我不知道如何将其与后端服务的所有元素循环。

set\u事实:
新的_服务:“{{backend_服务['svc1']|
组合({'env_vars':{'DB_HOST':'foo'}},recursive=True)}”
Q:“如何将其与后端服务的所有元素循环?”

下面的任务就可以完成这项工作

-设置事实:
my_services:“{{backend_services.keys()| list}”
-设定事实:
新服务:“{{新服务|
默认值({})|
合并({项:
{'env_vars':
后端\u服务[item]。环境变量|
组合({'DB_HOST':'foo'}}}}
循环:{{my_services}}”

这正好解决了我需要的问题。我以前尝试过double combine方法,但语法不正确。在验证解决方案后,我甚至可以通过将
新的\u服务
替换为
后端\u服务
来就地编辑原始变量。