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