我正在使用 ansible 来管理生产配置,以及 vagrant box。我有默认值的文件: group_vars/all 。
---
env: prod
wwwuser: www-data
db:
root_pwd: root_pwd
pdo_driver: pdo_mysql
host: localhost
name: test
user: test
pwd: test
charset: utf8
domain: somedomain
projectdir: /var/www/application
webrootdir: "{{ projectdir }}/web"
在 host_vars/vagrantbox 我想有这样的东西:
db:
root_pwd: super_easy_password
但是这个完全覆盖了 db 字典,而我想覆盖单个键。如何实现?
更新 1 刚刚检查了 ansible.cfg:
[defaults]
host_key_checking=false
hash_behaviour=merge
groups_vars/所有
db:
root_pwd: some_strong_pwd
pdo_driver: pdo_mysql
host: localhost
name: dbname
user: dbuser
pwd: some password
charset: utf8
host_vars/vagrantbox
db:
root_pwd: root
我收到以下错误:
One or more undefined variables: 'dict object' has no attribute 'name'
我做错了什么?
原文由 Jevgeni Smirnov 发布,翻译遵循 CC BY-SA 4.0 许可协议
默认情况下,Ansible 在第一级覆盖变量。如果您希望能够合并词典,则必须更改您的
ansible.cfg
文件并设置:(默认值为
replace
)。请注意,Ansible 团队 不推荐这样做。我想这是用户之间真正的划分设置。一种一劳永逸的决定:当您开始使用此功能时,您将无法返回,并且您可能无法与
replace
类型的人分享您的剧本。但是,您仍然可以从那里的剧本中受益(我不认为剧本使用
replace
行为作为“功能”)。这就像拥有 AB 血型,成为万能接受者……但由于魔术通常发生在可变分辨率下,而不是在任务或模板内,我认为通常可以在不进行任何更改的情况下共享您的角色。如果您需要从比方说角色参数覆盖单个键,您将不得不以某种复杂的方式传递参数。
例如,要覆盖
post_max_size
和upload_max_size
中的键php5
特定角色的字典,你必须这样做:话虽如此,我从一开始就使用
merge
行为,我对此非常满意。组织变量非常方便。