The default behavior of Ansible is to "replace" the entire data structure instead of merging it. This is defined/configured by the hash_behavior parameter in an ansible.cfg file.
Because switching to merge is a process that requires a user to modify their Ansible configuration, I feel that is most appropriate to *not* use nested data structures where you expect users to provide configurations for your role, but instead use what you were doing previously with sensu_api_host. On Sunday, November 15, 2015, cmacrae <[email protected]> wrote: > Hey People, > > Having some trouble using YAML dictionaries. > I'm refactoring my variable structure in a role a wrote a while ago. > > The variables used to all look like: sensu_api_host, but I wanted to move to > using dictionaries, so when referencing them it wouldn't be: > {{ sensu_api_host }} > it'd be: > {{ sensu['api']['host'] }} > > In doing so, I've restructured my roles' defaults/main.yml like so: > sensu: > api: > host: "{{ groups['sensu_masters'][0] }}" > port: 4567 > ssl: "false" > user_name: admin > password: secret > uchiwa_path: '' > timeout: 5000 > client_config: client.json.j2 > config_path: /opt/local/etc/sensu > gem_state: present > plugin_gem_state: present > user_name: sensu > group_name: sensu > include_plugins: true > include_dashboard: false > master: false > > Though, I have a problem. Lookups for the above variables work fine... until > I try to assign them values elsewhere, where it should take precedence. > > Some of the key values above are clobbered when they are defined elsewhere, > such as host_vars/hostname.yml or group_vars/groupname.yml. > It seems that if I want to define one of the nested keys' value elsewhere, it > ruins the dictionary lookup for all other child keys who share that parent. > > For example, above you can see that sensu['include_dashboard'] is set to > false. > If I want to set this to `true` for a particular host, in > host_vars/hostname.yml like so: > --- > sensu: > include_dashboard: true > > This then clobbers the lookup for any other child keys belonging to the sensu > dictionary. > So, for example, lookups for sensu['group_name'] will fail with the > following:fatal: [my.host.tld] => One or more undefined variables: 'dict > object' has no attribute 'group_name' > When trying to evaluate the following play: > - name: Ensure the Sensu group is present > group: name={{ sensu['group_name'] }} > state=present > > I'm not sure what it is I'm doing wrong here - I'd really appreciate any help! > For the record: I'm running Ansible 1.9.4 > > Thanks in advance, > Calum > > -- > You received this message because you are subscribed to the Google Groups > "Ansible Project" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] > <javascript:_e(%7B%7D,'cvml','ansible-project%[email protected]');> > . > To post to this group, send email to [email protected] > <javascript:_e(%7B%7D,'cvml','[email protected]');>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/ansible-project/01207bb1-325a-4d80-93ad-ab501a60d422%40googlegroups.com > <https://groups.google.com/d/msgid/ansible-project/01207bb1-325a-4d80-93ad-ab501a60d422%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- Matt Martz @sivel sivel.net -- You received this message because you are subscribed to the Google Groups "Ansible Project" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/CAD8N0v_x5hmhJjq94GkLA3%2B3jYc7fFAzz6_gs2jU7Vzt0gqnnQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
