可靠的。覆盖单个字典键

新手上路,请多包涵

我正在使用 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 许可协议

阅读 400
1 个回答

默认情况下,Ansible 在第一级覆盖变量。如果您希望能够合并词典,则必须更改您的 ansible.cfg 文件并设置:

 hash_behaviour=merge

(默认值为 replace )。

请注意,Ansible 团队 不推荐这样做。我想这是用户之间真正的划分设置。一种一劳永逸的决定:当您开始使用此功能时,您将无法返回,并且您可能无法与 replace 类型的人分享您的剧本。

但是,您仍然可以从那里的剧本中受益(我不认为剧本使用 replace 行为作为“功能”)。这就像拥有 AB 血型,成为万能接受者……但由于魔术通常发生在可变分辨率下,而不是在任务或模板内,我认为通常可以在不进行任何更改的情况下共享您的角色。

如果您需要从比方说角色参数覆盖单个键,您将不得不以某种复杂的方式传递参数。

例如,要覆盖 post_max_sizeupload_max_size 中的键 php5 特定角色的字典,你必须这样做:

 - { role: php5-fpm, php5: { post_max_size: 40M,
                            upload_max_filesize: 20M }}

话虽如此,我从一开始就使用 merge 行为,我对此非常满意。组织变量非常方便。

原文由 leucos 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏