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

时间:2016-07-01 14:26:51

标签: ansible ansible-playbook

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

ansible-playbook -e env=staging playbook.yml

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

目录结构可能如下所示:

├── group_vars
│   ├── all
│   │   ├── users.yml
│   │  
│   ├── development
│   │   ├── users.yml
│   │  
│   ├── production
│   │   ├── users.yml
│   │  
│   └── staging
│       ├── users.yml

我最初认为像这样的设置可以完成这项工作。但是,每个环境的users.yml字典永远不会与all/users.yml 合并

ansible-playbook -e env=production playbook.yml只会从production/users.yml读取。

如何从users.yml的特定环境中使用Ansible合并all/users.yml - 这样我始终可以创建公共和特定于env的用户?

1 个答案:

答案 0 :(得分:2)

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

你可以通过更改ansible.cfg中的hash_behaviour选项来覆盖它,如果你真的想要,但我建议在这样的全球范围内反对它。

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

users:
  name: dev-foo
  ...

然后还在所有group_vars中定义了all_users变量,如下所示:

all_users:
  name: common-foo
  ...

然后你可以通过使用combine任务创建合并变量来set_fact变量:

name: combine users
set_fact:
  combined_users: '{{ users | combine(all_users) }}'

或者您可以将其直接组合到您打算使用它的任务中:

name: create users
user:
  name: {{ item.name }}
  ...
with_items: '{{ users | combine(all_users) }}'

如果您只是尝试组合2个列表,可以通过简单添加列表来完成此操作:

name: combine users
set_fact:
  combined_users: '{{ users + all_users }}'

或直接:

name: create users
user:
  name: {{ item.name }}
  ...
with_items: users + all_users