In my Ansible playbook I have a nested variable declaration as shown below in a variable file.
repo:
branch: int
url: git@github:user/repo.git
dest: "/var/code"
How would I override the branch param in extra-vars? I tried something like this below but it didn't work.
--extra-vars "repo.branch=exec_refactor"
neither this
--extra-vars "repo[branch]=exec_refactor"
using JSON representation like below results in overriding the entire repo node and hence repo.branch is successfully overridden but both repo.url and repo.dest becomes undefined.
--extra-vars '{"repo":{"branch":"exec_refactor"}}'
To merge dicts, you need to set hash_behaviour=merge in your ansible.cfg. But it is not recommended to do this since pretty much all roles you find on Ansible Galaxy do expect the default value replace and might run crazy.
See hash_behaviour in the docs.
I once had a similar problem and wrote an action plugin to solve it: include_vars_merged. It is no out-of-the-box solution for your problem because Ansible in any case will override the dict with the one from --extra-vars and using my plugin, you would again override that single value you passed in --extra-vars. But it should not be too hard to modify the plugin and only add new values instead of overriding values. I think switching parameters in line 34 & 40 in include_vars_merged.py should already do it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With