with_items/iterations over dictionary for a sysctl task.

5,301 views
Skip to first unread message

Walid

unread,
Feb 18, 2014, 3:55:01 PM2/18/14
to ansible...@googlegroups.com

Hi,


I have defined under group_vars, something like the following :


---

dc001_sysctl:

    net.ipv4.ip_local_port_range: 32768 61000

    net.ipv4.tcp_fin_timeout: 30

    net.ipv4.tcp_keepalive_time: 1800

... 

...

    net.ipv4.neigh.default.gc_thresh1: 2048

    net.ipv4.neigh.default.gc_thresh2: 4096

    net.ipv4.neigh.default.gc_thresh3: 8192


the  template of the /etc/sysctl.conf looks something like the following:

 

{%  for parameter,value  in dc001_sysctl.getenteries() %}

{{ parameter  }}= {{ value }}

{% endfor %}

 

my question if I prefer to do this using the sysctl module, what is the best way to iterate over these dictionary values in a systctl module task? my reasoning is to protect against some one have changed the sysctl from the command line without updating the sysctl.conf file or it is in the sysctl.file but was not reloaded. 


kind regards


Walid

Michael DeHaan

unread,
Feb 18, 2014, 8:29:25 PM2/18/14
to ansible...@googlegroups.com
The pattern for iterating over a hash is the same regardless of module and would look like:

vars:
    my_pairs:
       - key: foo
         value: bar
       - key: foo2
         value: bar2

tasks:
   - shell: echo "{{ item.key }} and {{ item.value }}"
     with_items:  my_pairs

So, generally applicable to sysctl or anything else.

You could also define the list right under "with_items" without the intermediate variable.


--
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 ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Walid

unread,
Feb 19, 2014, 12:54:56 AM2/19/14
to ansible...@googlegroups.com
Hi Michael,

but in this case the key name is not a static, they key is the sysctl parameter, would it be possible to use a similar construct to the one in the template? my vars for this use case and also some others are 6-10+ items, each item could be defined easily as follow

vars:
      pana_sys_ctl:

net.ipv4.ip_local_port_range: 32768 610

net.ipv4.tcp_fin_timeout: 30

             net.ipv4.tcp_keepalive_time: 1800 
             ....
       pana_mounts:
              mnt1: 
                     red: filer001:/disk1/vol1
                     blue:filer002:/disk1/vol3
                     ......

if it is possible through some filters or massaging of the dictionary that would be great.

kind regards

Walid

benno joy

unread,
Feb 19, 2014, 2:42:10 AM2/19/14
to ansible...@googlegroups.com
Hi Walid,

Can you try :

- sysctl: name={{ item[0] }} value= {{ item[1] }}

   with_items: pana_sys_ctl|dictsort


Regards,

Benno



Michael DeHaan

unread,
Feb 19, 2014, 8:00:33 AM2/19/14
to ansible...@googlegroups.com
The dictsort just sorts them and doesn't really change much.

It sounds like you have a list of sysctl names and each sysctl name has a lot of settings under it.

You could consider flattening everything to one list, and also maybe using the "when" operator to filter which to apply.

If you had a hash of lists and wanted to apply the sysctls in multiple hashes, that might require a filter plugin.


Michael DeHaan

unread,
Feb 19, 2014, 8:01:32 AM2/19/14
to ansible...@googlegroups.com
Sorry, I meant "lookup" plugin.

I mean if you had something like:

my_sysctls:
    one:
         - { key: x, value: y }
         - { key: x2, value: y2 }
    two:
         ...

and wanted to apply all sysctls in one or two.

I would probably just keep seperate lists and iterate over them, and keep those configurations with the roles that need them instead.


Walid

unread,
Feb 24, 2014, 2:49:14 PM2/24/14
to ansible...@googlegroups.com
Hi Michael, and Benno,

Sorry for not replying early, i had a bad flu. at the end i choose to go with dictionary the way Michael described, and not the  array/list, as dictionaries are more clear in the playbook tasks. e.g item.key vs item.0
 I am currently using Ansible 1.4.5 and i hit a problem with dictionaries if i format the with_items differently see below what worked for me and what did not work

### does not work , complains about ""undefined variables: 'str object' has no attribute 'name' ""
    - debug: var= {{ item.name }}
       with_items:
  - my_pairs

#### works fine
    - debug: var= {{ item.name }}
       with_items:
  - " {{ my_pairs }}"
#####  or this also works fine

    - debug: var= {{ item.name }}
       with_items:  my_pairs

Is that a YAML convention issue, or an ansible parsing bug  ? 

kind regards

Walid
 

Michael DeHaan

unread,
Feb 24, 2014, 3:00:49 PM2/24/14
to ansible...@googlegroups.com
   with_items:
  - my_pairs


This would be iterpreted as a list with one member variable who was a hash, so I'd expect this to cause some problems. 


Generally if I'm traversing a list I would do "with_items: mylist" pretty much every time.

Why the second form works is actually what I'd have a question about, it's probably a bit of a weird side effect :)





Reply all
Reply to author
Forward
0 new messages