我在命令行上运行指定目标服务器环境的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的用户?
答案 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