Puppet - how can I copy a file to several user folders?
Well I was using the info on this:
Puppet - Any way to copy predefined custom configuration files for software on clients from the puppet master (host)?
But I need some more elaborated, because I have several Desktops and are in use by 2 or 3 users each one, so I want to make a class for copy a shortcut in his desktops.
The computers are joined to a domain, so any user can log in any desktop, and his profile is created in every desktop.
I've tryed with this:
class applink {
file { "/home/installer/Escritorio/Workdesktop.desktop":
owner => installer,
group => root,
mode => 770,
source => "puppet://$server/files/Workdesktop.desktop"
}
This is only for one user called "installer", how can do this for several users?
Can I use $USER
for do this? Any Thoughts?
Thank You!
Solution 1:
There are really two ways to do this: a definition or a virtual resource. I know more about definitions so that's the approach I'll describe. Read about virtual resources here, but be ready to get confused before you gain understanding.
To do this in a definition, create a manifest in your module structure to contain it; in your example it'd be in _modulepath_/applink/manifests/desktoplinks.pp
define applink::desktoplinks {
file { "/home/$title/Escritorio/Workdesktop.desktop":
owner => $title,
group => root,
source => "puppet://$server/files/Workdesktop.desktop",
}
# you could have others here if you wanted
}
Then to use it, you would call it with each user's name, perhaps all at once in an array:
applink::desktoplinks { [ "user1", "user2", "user3" ]: }
The trick is that the username is the "title" of the defined resource, so it is available inside the definition as $title
. Read more about defined types here.
HTH
Solution 2:
I just learned another way to do this. It's more of a syntax quirk than anything, but here you go:
file { ["/home/installer/Escritorio/Workdesktop.desktop",
"/home/user/Escritorio/Workdesktop.desktop"]:
owner => installer,
group => root,
mode => 770,
source => "puppet://$server/files/Workdesktop.desktop"
}
The key is specifying the title
as an array instead of a string; Puppet will parse this as though you'd written the following:
file { "/home/installer/Escritorio/Workdesktop.desktop":
owner => installer,
group => root,
mode => 770,
source => "puppet://$server/files/Workdesktop.desktop"
}
file { "/home/user/Escritorio/Workdesktop.desktop":
owner => installer,
group => root,
mode => 770,
source => "puppet://$server/files/Workdesktop.desktop"
}
i.e., you get both File["/home/installer/Escritorio/Workdesktop.desktop"]
and File["/home/user/Escritorio/Workdesktop.desktop"]
bound in your configuration.
I suspect that this would work for many types of resources, but I haven't tested any other than file
.