The main user-visible differences since 0.23.x are:
- more language features like better conditionals - the Language Tutorial that you found is definitely the best way to find out what's available in manifests now.
- all your manifests and plugins (custom facts, custom types and providers) should now be in a module directory structure and you should be using 'include mymodule::classname' instead of 'import /path/to/manifest.pp'
- as a corollary,
puppet://
URLS for file sources now need to have the module path in them, like puppet:///modules/mymodule/classname/file.txt
would live on the filesystem at _modulepath_/mymodule/files/classname/file.txt
- the CLI has been unified to a 'git' or 'svn' style single program with command arguments, like 'puppet agent' instead of a separate 'puppetd'. That's described on the Tools page
- there are more built-in types and providers available, like the
yumrepo
, and zfs
types, and zypper
, freebsd
, portage
package providers.
There are big structural changes under the hood (on-the-wire communication moved from XMLRPC to a REST interface) but they're mostly invisible for every day use. The ones above are probably what trip up the most people, based on mailing list/irc inquiries.