Ansible:覆盖额外变量中的字典变量

rog*_*one 6 ansible ansible-playbook

在我的 Ansible playbook 中,我有一个嵌套变量声明,如下所示在变量文件中。

repo:
  branch: int
  url: git@github:user/repo.git
  dest: "/var/code"
Run Code Online (Sandbox Code Playgroud)

我将如何覆盖额外变量中的分支参数?我在下面尝试了类似的东西,但没有用。

 --extra-vars "repo.branch=exec_refactor"
Run Code Online (Sandbox Code Playgroud)

既不是这个

 --extra-vars "repo[branch]=exec_refactor"
Run Code Online (Sandbox Code Playgroud)

使用像下面这样的 JSON 表示会覆盖整个repo节点,因此 repo.branch 被成功覆盖,但 repo.url 和 repo.dest 都未定义。

 --extra-vars '{"repo":{"branch":"exec_refactor"}}'
Run Code Online (Sandbox Code Playgroud)

udo*_*dan 3

要合并字典,您需要hash_behaviour=mergeansible.cfg. 但不建议这样做,因为您在 Ansible Galaxy 上找到的几乎所有角色都期望默认值replace,并且可能会疯狂。

请参阅hash_behaviour文档。

我曾经遇到过类似的问题,并编写了一个动作插件来解决它:include_vars_merged。对于您的问题来说,这不是开箱即用的解决方案,因为 Ansible 在任何情况下都会用我的插件中的字典覆盖字典,--extra-vars并且使用我的插件,您将再次覆盖您传入的单个值--extra-vars。但修改插件并仅添加新值而不是覆盖值应该不会太难。我认为第 34 行和第 40 行中的切换参数include_vars_merged.py应该已经可以做到这一点。