首页 > 解决方案 > vars中的Ansible深度合并哈希数组

问题描述

想要在某个角色的 vars/main.yml 或 default/main.yml 中声明哈希数组,例如:

mysql:
  instances:
    new:
      port: 3306
      dir: /mydir
      config:
         innodb_log_file_size: '128M'
         tmp_table_size: '128M'
         innodb_buffer_pool_size: '10G'
         ...

我只想更改 YAML 清单或 group_vars 中的一些键值。其他值必须取自某个角色的 vars/main.yml:

mysql:
  instances:
    new:
      config:
        innodb_buffer_pool_size: '2G'

我想要在 jinja2 模板中使用的结果:

mysql:
  instances:
    new:
      port: 3306
      dir: /mydir
      config:
         innodb_log_file_size: '128M'
         tmp_table_size: '128M'
         innodb_buffer_pool_size: '2G'
         ...

标签: ansible

解决方案


问题:“只想更改 YAML 清单或 group_vars 中键的某些值。其他值必须取自某个角色的 vars/main.yml”

1)服务角色(nginx,mysql,pgsql ...)。在这个角色中,我描述了默认设置,...

2) 然后我创建一个项目角色,我可以在其中包含服务角色,我将使用服务角色中描述的大部分默认设置。项目角色中只能更改一小部分服务设置。

回答:

在“服务”角色中,默认为以后可能更改的参数创建特殊变量。例如

mysql_port: "3306"
mysql_dir: "mydir"
mysql_innodb_log_file_size: "128M"
mysql:
  instances:
    new:
      port: "{{ mysql_port }}"
      dir: "{{ mysql_dir }}"
      config:
         innodb_log_file_size: "{{ mysql_innodb_log_file_size }}"
...

在“项目”角色中,任何具有更高优先级的变量都将覆盖角色的默认值。


推荐阅读