Nested directory walking question

77 views
Skip to first unread message

Bill Lubanovic

unread,
Jul 23, 2014, 1:30:42 PM7/23/14
to ansible...@googlegroups.com
I'd like to walk a directory hierarchy of the form <a>/<b>/<c>/<d>. <a> is a fixed root directory, and isn't relevant. I have a number of <b> directories, which represent machine categories. Under each <b> are zero or more <c> directories, which are string values for that category. Finally, <d> is a directory hierarchy to copy to machines that match the parent <b>/<c> combination. For example:

/tmp/test/color/red/etc/passwd
/tmp/test/color/green/etc/motd
/tmp/test/flavor/cinnamon/var/something

<a> here is /tmp/test. There are two <b> categories (color and flavor): the first (color) has two <c> subdirectories (red and green) and the second (flavor) has one (cinnamon). Each <c> has a different <d> (file hierarchy) to be copied to machines that match <b>/<c>.

How do I walk each <b>, passing its value, its <c> subdirectories, and their <d> subdirectories to a task? I need to consider <b> and <c> together with other vars and facts (machine "colors" and "flavors") to pick target destinations for <d>.

I've looked at the various loop constructs, and see how to chain with register, but not how to populate the lists for with_nested.

Thanks!


Michael DeHaan

unread,
Jul 23, 2014, 6:18:21 PM7/23/14
to ansible...@googlegroups.com
So there's already "with_fileglob" in Ansible

- debug: msg={{ path }}
  with_fileglob: /path/to/files/*/*.tgz

This isn't recursive however, despite being able to specify multiple directories to read.

It would be possible to make a lookup plugin that was, like a "with_fileglob_recursive" that used the results of something like os.path.walk.

So basically yes, you need a new one.

With_nested is for constructing nested loops and is something a bit different.




--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/5ec31b08-1b0d-4041-b867-1c46f8c13c46%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Bill Lubanovic

unread,
Jul 24, 2014, 10:05:17 AM7/24/14
to ansible...@googlegroups.com
Thanks, Michael. It looks like with_fileglob() only shows files, not directories, so that wouldn't work for me.

I'm testing a workaround using "find" or "ls", then split() to grab <b>, <c>, and <d>. It would be nice to pass <b> and <c> as arguments to a task using the synchronize module.

Michael DeHaan

unread,
Jul 24, 2014, 6:45:49 PM7/24/14
to ansible...@googlegroups.com
I wouldn't shell out.

I'd call python's very handy os.path.walk with a custom function.  If you'd like to talk about this, ansible-devel is probably a bit more on topic (and I'm trying to spur that list into greater life).




Reply all
Reply to author
Forward
0 new messages