我使用 ansible 来管理生产和 vagrant box 的配置。
我有带有默认值的文件:组变量/全部.
---
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"
In 主机变量/vagrantbox我想要这样的东西:
db:
root_pwd: super_easy_password
但是这个完全覆盖了数据库字典,而我想覆盖单个键。
如何实现这一目标?
UPDATE 1刚刚检查了 ansible.cfg:
[defaults]
host_key_checking=false
hash_behaviour=merge
组变量/全部
db:
root_pwd: some_strong_pwd
pdo_driver: pdo_mysql
host: localhost
name: dbname
user: dbuser
pwd: some password
charset: utf8
主机变量/vagrantbox
db:
root_pwd: root
我收到以下错误:
One or more undefined variables: 'dict object' has no attribute 'name'
我做错了什么?
默认情况下,Ansible 会覆盖第一级的变量。如果你想能够合并字典,你必须改变你的ansible.cfg
文件并设置:
hash_behaviour=merge
(默认值为replace
).
请注意,Ansible 团队不推荐这个 https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-hash-behaviour。
我想这是用户之间真正的划分设置。一种一劳永逸的决定:当您开始使用此功能时,您无法返回,并且您可能无法与他人分享您的剧本replace
型的人。
但是,您仍然可以从那里的剧本中受益(我不认为剧本使用replace
行为作为“特征”)。这就像拥有 AB 血型,成为通用接收者......但由于魔法通常发生在可变分辨率下,而不是在任务或模板内,我认为通常可以在不进行任何更改的情况下共享您的角色。
如果您需要覆盖角色参数中的单个键,则必须以某种复杂的方式传递参数。
例如,要覆盖post_max_size
and upload_max_size
键在一个php5
对于特定角色的字典,你必须这样做:
- { role: php5-fpm, php5: { post_max_size: 40M,
upload_max_filesize: 20M }}
话虽这么说,我用merge
从一开始的行为,我对此非常满意。组织变量非常方便。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)