This is a quick and dirty cheatsheet on puppet. first some puppet terms
Puppet Master | The Puppet server that controls the flow and has the authority, SSL is used for communication with Nodes |
Puppet Node | A server with the puppet agent installed and connected to a puppet master. |
Catalog | A catalog is a document that describes the desired state for each resource that Puppet manages on a node. A Puppet master typically compiles a catalog from manifests of Puppet code. The catalog consists of the following agent provided data, external data and puppet manifests. |
Facts | Puppet collects system information, called facts, by using the Facter tool. The facts are assigned as values to variables (key/value pairs) that you can use anywhere in your manifests. |
Report | The actions and infrastructure supplied by a catalog during a puppet run. |
Below are some of the commonly used puppet commands, see documentation for all commands
Install (this may change) | rpm -ivh https://yum.puppetlabs.com/puppet5/puppet5-release-el-7.noarch.rpm yum install puppetserver -y yum install puppet-agent -y |
Files and Directories | puppet config print reportdir ## add external facts (use key/value pairs) /etc/facter/facts.d vi facts.txt # example owner=Paul Valle |
Agents Certificate and Connection test | ## generate agents certifcate (make sure server is configured in puppet.conf file) puppet agent --verbose --no-daemonize --onetime ## get the agents cert (look for the plus sign (+) which means they have been signed) puppet cert list # certs waiting to be signed puppet cert list --all # everything ## make sure you sign the cert for the clients (run on master) puppet cert sign <hostname> puppet cert sign --all ## test connection from puppet master puppet agent --test --server <puppet master> ## remove a specific agents certificate puppet cert clean <cert> ## remove all certs and start again (https://puppet.com/docs/puppet/5.5/ssl_regenerate_certificates.html) rm -rf /etc/puppetlabs/puppet/ssl/ # from server or agent ## automatic agent certificate signing puppet.conf [master]: autosign = true cd /var/lib/puppet/ vi autosign.conf cat autosign.conf *.packt.com |
Version | puppet --version puppet master --version puppet agent --version |
Enable/Disable puppet or agent | ## enable and start service puppet master systemctl enable puppetserver systemctl start puppetserver ## enable and start service puppet agent systemctl enable puppet systemctl start puppet ## disable and enable puppet agent puppet agent --disable puppet agent --enable |
Display/Change config | ## show master config puppet master --configprint all ## change configuration via commandline (or us vi) puppet config set runinterval 5m --section agent |
Debug, Stats and Validate puppet file | ## statistics - this may hang?? puppet apply --summarize ## debug and test run puppet apply --debug puppet apply --noop ## validate puppet file puppet parser validate <pp file> |
Getting help | puppet master --genconfig /var/log/messages or /var/log/syslog (agent messages) puppet resource --types ## list all resource types puppet describe --list ## describe resource types puppet describe <type - see above command> ## detail help on type puppet resource service ## list resource type service (like man page) |
Check server information (facter) | facter domain facter hostname facter fqdn facter system_uptime.hours facter ssh.dsa.fingerprints.sha1 facter [-p|-y|-j] facter -p <name> |
Test mode | puppet -t --noop |
Apply Manifest | ## apply a puppet manifest file, also update basemodulepath in puppet.conf if not deault location puppet apply <manifest file> [--modulepath=/puppet/modules/] ## apply manifest file from client, used for one time only updates puppet agent --verbose --no-daemonize --onetime ## check what manifest file will be used for your environment (master) puppet config print manifest --section master --environment production |
File Bucket | puppet filebucket -l list -b /opt/puppetlabs/puppet/cache/clientbucket |
Below is an example directory structure, I have also includes some examples of a node file and of a module/class file.
Module commands | puppet module list puppet module install <name> puppet module uninstall <name> puppet module upgrade <name> puppet module search <name> |
Example Puppet file | NODE File ------------------------------------------------------------------------ node 'gbvmub01' { include nginx include ssh ## you can move this into another pp file if you so wish class { 'nginx::test': fname1 => 'Paul', lname1 => 'Valle', } ## there are a number of conitional operators: == != >= <= ## for strings there are: in =~ !~ ? ## boolean: and or ## arithmetic: + / * - << ## capture: ${0} ${1}... ## is a good idea to call classes/modules using code, using code to ## determine what to call if $::processorcount >= 16 { notify { 'Heavy Server': } ## include heavy_modules_or_classes } elsif $::processorcount >= 4 { notify { 'Meduim Server': } ## include meduim_modules_or_classes } else { notify { 'Light Server': } ## include light_modules_or_classes } ## you can use case statements case $::operatingsystem { 'Ubuntu', Debian: { notify { 'Ubuntu or Debian': } } 'RedHat': { notify { 'RedHat': } } default : { notify { 'default': } } } } node 'gbvmub02' { include nginx include ssh } node 'node1.packt.com' { user {'paul.valle': ensure => 'present', comment => 'Paul Valle Account', home => '/home/pvalle', shell => '/bin/bash', uid => '1001', } file {'/tmp/sshd_config': ensure => 'present', source => '/etc/ssh/sshd_config', } file_line {'tcp-forwarding': path => '/tmp/sshd_config', line => 'AllowTcpForwarding yes', require => File['/tmp/sshd_config'], } } |
Module/Class file | MODULE/CLASS File ----------------------------------------------------------------------------------- # Manage nginx webserver class nginx { package { 'nginx': ensure => installed, } service { 'nginx': require => Package['nginx'], ensure => running, enable => true, } file { '/etc/nginx/sites-enabled/default': source => 'puppet:///modules/nginx/cat-pictures2.conf', notify => Service['nginx'], } user { 'art': ensure => present, comment => 'Art Vandelay', home => '/home/art', managehome => true, } ssh_authorized_key { 'art_ssh': user => 'art', type => 'rsa', key => 'AAAAB3NzaC1yc2EA...', } exec { 'Run my arbitrary command': command => '/bin/echo I ran this command on `/bin/date` >/tmp/command.output.txt', path => ['/bin', '/usr/bin'], } exec { 'Download public key for John': cwd => '/tmp', command => '/usr/bin/wget http://bitfieldconsulting.com/files/john.pub', creates => '/tmp/john.pub', } ## it will blow away cron to create the below cron { 'Back up cat-pictures': command => '/usr/bin/rsync -az /var/www/cat-pictures/ /catpictures-backup/', hour => '13', minute => '40', } $site_name = 'cat-pictures' $site_domain = 'cat-pictures.com' file { '/tmp/cat-pictures.conf': content => template('nginx/vhost.conf.erb'), notify => Service['nginx'], } ## inline templates, the calcuation is ruby code file { '/tmp/the_answer.txt': content => inline_template("What do you get if you multiply six by nine? <%= 6 * 7 %>.\n") } ## here we use a inline template and facter @ipaddress file { '/tmp/the_answer2.txt': content => inline_template("My IP Address is: <%= @ipaddress %>.\n") } ## some define jobs examples, the job name can be anything define script_job() { file { "/tmp/${name}": source => "puppet:///modules/scripts/${name}", mode => '0755', } } script_job { 'hello_world.txt': } ## passing parameters to a script, notice a default value for location define script_job1($fname, $lname, $location = 'London') { file { "/tmp/$name.txt": content => inline_template("Your name is $fname $lname and you are from $location\n") } } script_job1 { 'the_answer3': fname => 'Paul', lname => 'Valle', } ## You can also call classes from here as well #class { 'nginx::test': # fname1 => 'Paul', # lname1 => 'Valle', #} ## You can use code anywhere #if $::processorcount >= 16 { # notify { 'Heavy Server': } #} elsif $::processorcount >= 4 { # notify { 'Meduim Server': } #} else { # notify { 'Light Server': } #} } |