How pass an array of dictionaries to my custom module elegantly?

I’m not trying to re-invent the “replace” module that Ansible has.

I’m trying to write a (my FIRST) custom module to encapsulate the repetitive Linux source build process, namely,

  • run ./configure $CONF_OPTS
  • run make
  • run make $TARGETS

However, i have an outlying case where I have to modify Makefile (ugh) that ./configure produces (not my idea), so my steps are now

  • run ./configure $CONF_OPTS
  • modify Makefile
  • run make
  • run make $TARGETS

If I was writing above steps using generic Ansible modules, I’d of course use the replace module, like so, correct? This will change all the instances of “/usr/local” into “/usr/my/local” and “/usr/perl” into “/usr/my/perl” in my Makefile

`

  • name: Update Makefile (ugh)
    replace:
    dest: “/path_to/Makefile”
    regexp: “{{item.old_str}}”
    replace: “{{item.new_str}}”
    with_items:
  • {old_str: “/usr/local”, new_str: “/usr/my/local”}
  • {old_str: “/local/perl”, new_str: “/usr/my/perl”}

`

I want my module call to look like this. Or is there a better way to represent the “modify_regex” parameters?

`

  • name: Run configure, make, and make targets
    config_make_targets:
    path: /path_to_source
    modify_file: “Makefile”
    modify_regex: [
    {old_str: “/usr/local”, new_str: “/usr/my/local”},
    {old_str: “/local/perl”, new_str: “/usr/my/perl”}
    ]

`

Thanks!

You could probably do:

{“/usr/local”: “/usr/my/local”,
“/local/perl”: “/usr/my/perl”}

That will work as long as order does not matter (if the replacements do not cause there to be more or less of the replacer substrings). If you can’t guarantee that, then the list is better, although you can do single element dicts or two element lists inside:

[{“/usr/local”: “/usr/my/local”},
{“/local/perl”: “/usr/my/perl”}]

[ [“/usr/local”, “/usr/my/local”],
[“/local/perl”, “/usr/my/perl”]]