在Ansible中将共享参数与环境特定参数合并

在Ansible中将共享参数与环境特定参数合并,ansible,ansible-playbook,Ansible,Ansible Playbook,我在命令行上运行指定目标服务器环境的playbooks,例如: ansible playbook-e env=staging playbook.yml 现在,我希望能够提供参数,例如,要在服务器上创建的用户字典,以便所有环境中都有通用的用户,也有特定的到我运行playbook的那一个环境的用户 目录结构可能如下所示: ├── group_vars │   ├── all │   │   ├── users.yml │   │   │   ├── development │   │   ├── u

我在命令行上运行指定目标服务器环境的playbooks,例如:

ansible playbook-e env=staging playbook.yml

现在,我希望能够提供参数,例如,要在服务器上创建的用户字典,以便所有环境中都有通用的用户,也有特定的我运行playbook的那一个环境的用户

目录结构可能如下所示:

├── group_vars
│   ├── all
│   │   ├── users.yml
│   │  
│   ├── development
│   │   ├── users.yml
│   │  
│   ├── production
│   │   ├── users.yml
│   │  
│   └── staging
│       ├── users.yml
users:
  name: dev-foo
  ...
all_users:
  name: common-foo
  ...
name: combine users
set_fact:
  combined_users: '{{ users | combine(all_users) }}'
我最初认为这样的设置可以完成这项工作。但是,每个环境的
users.yml
字典从不与
all/users.yml

ansible playbook-e env=production playbook.yml
只需读取
production/users.yml


如何将特定环境中的Ansible merge
users.yml
all/users.yml
-合并,以便始终创建公共用户和特定于环境的用户?

默认情况下,Ansible将通过具有更高优先级的对等值覆盖哈希/字典值

如果您真的愿意,您可以通过更改ansible.cfg中的选项来覆盖此选项,但我建议在这样一个全局级别上不要这样做

相反,您可以这样定义用户:

├── group_vars
│   ├── all
│   │   ├── users.yml
│   │  
│   ├── development
│   │   ├── users.yml
│   │  
│   ├── production
│   │   ├── users.yml
│   │  
│   └── staging
│       ├── users.yml
users:
  name: dev-foo
  ...
all_users:
  name: common-foo
  ...
name: combine users
set_fact:
  combined_users: '{{ users | combine(all_users) }}'
然后在所有组变量中定义一个
all\u users
变量,如下所示:

├── group_vars
│   ├── all
│   │   ├── users.yml
│   │  
│   ├── development
│   │   ├── users.yml
│   │  
│   ├── production
│   │   ├── users.yml
│   │  
│   └── staging
│       ├── users.yml
users:
  name: dev-foo
  ...
all_users:
  name: common-foo
  ...
name: combine users
set_fact:
  combined_users: '{{ users | combine(all_users) }}'
然后,您可以使用任务创建合并变量,如下所示:

├── group_vars
│   ├── all
│   │   ├── users.yml
│   │  
│   ├── development
│   │   ├── users.yml
│   │  
│   ├── production
│   │   ├── users.yml
│   │  
│   └── staging
│       ├── users.yml
users:
  name: dev-foo
  ...
all_users:
  name: common-foo
  ...
name: combine users
set_fact:
  combined_users: '{{ users | combine(all_users) }}'
或者,您可以将其直接组合到您打算使用它的任务中:

name: create users
user:
  name: {{ item.name }}
  ...
with_items: '{{ users | combine(all_users) }}'
如果您只是尝试合并两个列表,您可以通过简单添加列表来实现:

name: combine users
set_fact:
  combined_users: '{{ users + all_users }}'
或者直接:

name: create users
user:
  name: {{ item.name }}
  ...
with_items: users + all_users
可能重复的