FAQ
I've got a bit stuck trying to implement something in Puppet. I'm hoping
I'm just looking at it the wrong way and somebody can point me in the
right direction :-)

So here's what I have. A definition that creates a site (it doesn't
really matter what it's creating):

define mymodule::site ($path) {
# ... do some stuff ...
}

mymodule::site { 'sitename':
path => '/some/path',
}

This is fine. But what I want to do is create an arbitrary set of
symlinks along with the site. So I extend it something like this:

define mymodule::site ($path, $links) {
# ... do some stuff ...
mymodule::links { $links:
path => $path,
}
}

define mymodule::links () {
# create a link: $name -> $path
}

mymodule::site { 'sitename':
path => '/some/path',
links => [ 'foo', 'bar' ],
}

So this works. It creates my site, and calls mymodule::links for each link
separately.

The problem comes if I want to call mymodule::links with more than just
one changing parameter (I'm using $name above). I'd like to be able to
do something like this, but can't see how to make it work:

mymodule::site { 'sitename':
path => '/some/path',
links => [ { 'link1' => 'target1' }, { 'link2' => 'target2' }, ],
}

But you can't pass a hash in through $name, and I can't see how I can
pass separate parameters each call of the definition. I'd like a for
loop really!

Any pointers? Am I looking at this completely the wrong way?

The only alternative I've come up with is to just manually create the
links with file resources where I call mymodule::site, but I ideally
wanted to encapsulate all the behaviour within the module.

Thanks in advance,

Tim.

--
Tim Bishop
http://www.bishnet.net/tim/
PGP Key: 0x5AE7D984

--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.

Search Discussions

  • Mark Roggenkamp at Jul 21, 2012 at 3:22 am
    First, I'll say this sort of thing comes up rather often. It seems that
    perhaps there's a void in dynamic generation of resources based on some
    data structure (where you wish you had full langage features to do so).
    However, you may be able to make use of the create_resources function if it
    makes sense for you to have $links look like this:

    $links = {
    'link1' => {
    'ensure' => 'link',
    'target' => 'target1',
    },
    }

    and then: create_resources(File, $links). the hash key will be used for
    $name passed to File and the value (hash) is used to feed the other params
    of File.

    You may also need to specify your own defined type that takes a base path
    instead of File. Or, you could use the prepend function in stdlib to
    pregenerate the file paths if need be. Or, regsubst.

    Good luck :)

    Mark
    On Friday, July 20, 2012 4:40:42 PM UTC-4, Tim Bishop wrote:

    I've got a bit stuck trying to implement something in Puppet. I'm hoping
    I'm just looking at it the wrong way and somebody can point me in the
    right direction :-)

    So here's what I have. A definition that creates a site (it doesn't
    really matter what it's creating):

    define mymodule::site ($path) {
    # ... do some stuff ...
    }

    mymodule::site { 'sitename':
    path => '/some/path',
    }

    This is fine. But what I want to do is create an arbitrary set of
    symlinks along with the site. So I extend it something like this:

    define mymodule::site ($path, $links) {
    # ... do some stuff ...
    mymodule::links { $links:
    path => $path,
    }
    }

    define mymodule::links () {
    # create a link: $name -> $path
    }

    mymodule::site { 'sitename':
    path => '/some/path',
    links => [ 'foo', 'bar' ],
    }

    So this works. It creates my site, and calls mymodule::links for each link
    separately.

    The problem comes if I want to call mymodule::links with more than just
    one changing parameter (I'm using $name above). I'd like to be able to
    do something like this, but can't see how to make it work:

    mymodule::site { 'sitename':
    path => '/some/path',
    links => [ { 'link1' => 'target1' }, { 'link2' => 'target2' }, ],
    }

    But you can't pass a hash in through $name, and I can't see how I can
    pass separate parameters each call of the definition. I'd like a for
    loop really!

    Any pointers? Am I looking at this completely the wrong way?

    The only alternative I've come up with is to just manually create the
    links with file resources where I call mymodule::site, but I ideally
    wanted to encapsulate all the behaviour within the module.

    Thanks in advance,

    Tim.

    --
    Tim Bishop
    http://www.bishnet.net/tim/
    PGP Key: 0x5AE7D984
    --
    You received this message because you are subscribed to the Google Groups "Puppet Users" group.
    To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/ls16Czyh10cJ.
    To post to this group, send email to puppet-users@googlegroups.com.
    To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com.
    For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppuppet-users @
categoriespuppet
postedJul 20, '12 at 8:52p
activeJul 21, '12 at 3:22a
posts2
users2
websitepuppetlabs.com

2 users in discussion

Mark Roggenkamp: 1 post Tim Bishop: 1 post

People

Translate

site design / logo © 2022 Grokbase