Ubuntu – How to change the wallpaper of all clients using puppet

puppet

I have set up puppet (Central Management Server). Can anyone tell me how to change wallpapers of all clients from this puppet server?

Best Answer

To set the wallpaper image from command line (without puppet), you can use something like this:

gsettings set org.gnome.desktop.background picture-uri "file:///path/to/file.jpg"

which obviously needs to be run as the user you're changing the background for.

In terms of puppet, I believe you would be able to upload the file to the controlled machines using file resource:

file { "/usr/share/backgrounds/warty-final-ubuntu.png":
   source => "puppet://server/modules/module_name/background.jpg" 
}

then, to run a command, there's exec directive:

define set_bg($name) {
    exec {"set bg for $name":
        command => "/usr/bin/gsettings set org.gnome.desktop.background picture-uri file:///usr/share/backgrounds/warty-final-ubuntu.png",
        user => "$name",
    }
}

which you can execute for each of your users:

user { "joe":
  ensure      =>  "present",
  uid         =>  "1005",
  comment     =>  "Joe",
  home        =>  "/home/joe",
  shell       =>  "/bin/bash",
  managehome  =>  "true"
} 

user { "ted":
  ensure      =>  "present", 
  uid         =>  "1006", 
  comment     =>  "Ted",
  home        =>  "/home/ted",
  shell       =>  "/bin/bash",
  managehome  =>  "true"
} 

set_bg { "joe": name=>"joe" }
set_bg { "ted": name=>"ted" }

Also, you may want to restrict user's choice of backgrounds only to the one you're setting with Puppet. For that, you need to modify /usr/share/gnome-background-properties/ubuntu-wallpapers.xml (obviously, using Puppet). The file itself would look like:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wallpapers SYSTEM "gnome-wp-list.dtd">
<wallpapers>
   <wallpaper>
    <name>Common Background</name>
    <filename>/usr/share/backgrounds/warty-final-ubuntu.png</filename>
    <options>zoom</options>
    <pcolor>#000000</pcolor>
    <scolor>#000000</scolor>
    <shade_type>solid</shade_type>
   </wallpaper>
</wallpapers>

The rule to upload it would look like:

file { "/usr/share/gnome-background-properties/ubuntu-wallpapers.xml":
   source => "puppet://server/modules/module_name/backgrounds.xml",
}

Also, note that the default Ubuntu background is in the file /usr/share/backgrounds/warty-final-ubuntu.png - I'm finding that replacing this file gives more predictable results then creating another one (i.e. gsettings is unable to change background for new users who never logged in, for example). This also changes the background of the login screen etc, which I suppose is a good thing.