## Pre-Flight - The puppet server is `puppet.example.com` (CentOS 5.8 x64) - The puppet client is `client.example.com` (CentOS 6.2 x64) - Trying puppet 2.6+ - The default ports are **8140** on server and **8139** on client; we won't be changing this. - See [Tweaking Puppet (and other notes)](Tweaking_Puppet_(and_other_notes) "wikilink") when you're finished here. ## On Server yum install puppet-server Now edit `/etc/sysconfig/puppetmaster` and uncomment these two lines: PUPPETMASTER_MANIFEST=/etc/puppet/manifests/site.pp PUPPETMASTER_LOG=syslog The site-wide manifest is `/etc/puppet/manifests/site.pp`. Let's add this: ```ruby # Define a few test classes class testclass1 { file { "/tmp/test1": ensure => present, mode => 644, owner => root, group => root } } class testclass2 { file { "/tmp/test2": ensure => present, mode => 700, owner => nobody, group => nobody } } # Every node has this file node default { include testclass1 } # This particular node is a little different node 'client.example.com' inherits default { include testclass2 } ``` Start the puppetmaster: service puppetmaster start ## Configuring the Client yum install puppet Now edit `/etc/sysconfig/puppet` and uncomment these: PUPPET_SERVER=puppet.example.com PUPPET_LOG=/var/log/puppet/puppet.log Test your configuration by: * Running `/etc/init.d/puppet once --verbose` * Then tailing `/var/log/puppet/puppet.log` Thu Apr 12 13:52:12 -0500 2012 Puppet (notice): Reopening log files Thu Apr 12 13:52:12 -0500 2012 Puppet (info): Creating a new SSL key for client.example.com Thu Apr 12 13:52:12 -0500 2012 Puppet (info): Caching certificate for ca Thu Apr 12 13:52:13 -0500 2012 Puppet (info): Creating a new SSL certificate request for client.example.com Thu Apr 12 13:52:13 -0500 2012 Puppet (info): Certificate Request fingerprint (md5): A8:FE:8B:19:A8:9F:23:4C:19:27:65:7F:98:4D:E2:E6 You now need to sign the SSL request on the server. See the list of SSL certificates: [root@sauron manifests]# puppetca --list -a   client.example.com (A8:FE:8B:19:A8:9F:23:4C:19:27:65:7F:98:4D:E2:E6) + puppet.example.com (7A:78:B2:B8:78:F3:26:53:23:1C:6B:5D:E0:40:C6:06) (alt names: [DNS:puppet](DNS:puppet), [DNS:puppet.example.com](DNS:puppet.example.com)) A "+" sign indicates a signed certificate. Sign the request: [root@sauron manifests]# puppetca --sign client.example.com notice: Signed certificate request for client.example.com notice: Removing file Puppet::SSL::CertificateRequest client.example.com at '/var/lib/puppet/ssl/ca/requests/client.example.com.pem' All should be well, so start the puppet service and make sure it starts at boot (you could've done this with puppet!): service puppet start chkconfig --level 345 puppet on ## Setting up file services I edit `/etc/puppet/fileserver.conf` to add this: [files]  path /var/lib/puppet/files  allow 128.255.22.0/24 Note the **\[files\]** stub above. Created a sample file: cd /var/lib/puppet/files mkdir -p etc/nikhil.conf echo "Testing" > etc/nikhil.conf Now in the manifest, add this: file { "/etc/nikhil.conf":     ensure => present,     owner => nobody,     group => root,     mode => 770     source => "puppet:///files/etc/nikhil.conf" } You can kick the puppet to see the file created with the contents on the server. **Note carefully** that * You'd have to specify the puppetmaster with two slashes (e.g. `puppet:*//*master.tld/files/nikhil.conf`) * You could omit the master using three slashes (e.g. `puppet:*///*files/etc/nikhil.conf`) ## Issues ### Versioning The puppet client version should be equal to or lower than the server version. This one fact will save you a lot of trouble. ### Could not request certificate: Retrieved certificate does not match private key; please remove certificate from server and regenerate it with the current key # ON CLIENT: Remove all keys rm -rfv /var/lib/puppet/ssl/* # ON CLIENT: Make sure that the user puppet can write to /var/lib/puppet/ssl/ # ON SERVER: Revoke all certificates signed for client puppetca --revoke client.example.com puppetca --clean client.example.com Then try again. Should work. ### Could not retrieve catalog from remote server: getaddrinfo: Name or service not known * Add an alias for `puppet` to `/etc/hosts` (DNS is better) * Add a `server = puppetmaster.domain.tld` to `/etc/puppet/puppet.conf` under the `[main]` section. ### Connection refused (2) when kicking puppet Add a `listen = true` to the client's `/etc/puppet/puppet.conf` file. See [the Puppet Configuration Reference](http://docs.puppetlabs.com/references/2.7.9/configuration.html) for other directives. ### Could not retrieve catalog from remote server: Error 400 on SERVER: No support for http method POST This happens if the client runs a later version than the server. For example, 2.6 on the server and 2.7 on the client. ### Could not retrieve catalog from remote server: certificate verify failed Make sure that the time on both server and client are in sync. Restart the NTP service. ### puppet host "is already running" [Issue with 2.6.18.274 kernels](http://projects.puppetlabs.com/issues/4948). Update to some 2.6.18.300+ kernel and reboot. ## Tweaks et al ### Autosign Certificate requests Add this to the bottom of `/etc/puppet/puppet.conf` on the puppetmaster: [master]   autosign = true You can also, apparently, create `/etc/puppet/autosign.conf` and append the domain or CIDR for which the master will autosign. *.example.com 10.212.8.0/24 ### 'Kicking' a Puppet Clients, by default, listen on port 8139. Set up `/etc/puppet/auth.conf` to have these lines: path /run auth any method save allow puppet.server.com # Must be above these lines! path / auth any Restart the puppet daemon. Now kick it from the server: puppet kick --host client.domain.tld An exit status of 0 is good. You *can* kick all clients, but will need a LDAP. ### Debugging the Client service puppet stop puppet agent --listen --debug --no-daemonize --verbose ### Check your manifest syntax puppet --parseonly manifest.pp ## Sources * http://archive09.linux.com/feature/143893 * http://people.redhat.com/dlutter/puppet-app.html * http://projects.puppetlabs.com/projects/puppet/wiki/Core_Types_Cheat_Sheet * http://www.puppetcookbook.com/posts/creating-a-directory-tree.html * [Puppet Errors Explained](http://bitcube.co.uk/content/puppet-errors-explained) * [Tips and Tricks to debug puppet](http://www.devco.net/archives/2009/08/19/tips_and_tricks_for_puppet_debugging.php) * http://docs.puppetlabs.com/man/cert.html