The Learning VM TUtorial is here: https://kjhenner.gitbooks.io/puppet-quest-guide/content/quests/application_orchestrator.html
Te learning VM is available here: https://puppet.com/download-learning-vm
Resources | Describing node configuration works by declaring resources. Server provides the descriptions of relevant resources to the nodes then. Resource may describe
Abstract declaration of a resource “user” user { 'root': ensure => 'present', comment => 'root', gid => '0', home => '/root', password => '$1$PrY3W9V8$JTfCFGrmJ7tl7VwgXga14.', password_max_age => '99999', password_min_age => '0', shell => '/bin/bash', uid => '0', } |
Classes |
The class is the next level of abstraction above a resource. Class may describe
To define a class - means to describe it in a module, so that it can be used on nodes. <fc #FF0000>Achtung: you only can apply a clas once to a node. So if you wish to use the same peace of code with ifferent parameters (e.g. create multiple users, folders…) use defined resource types</fc> |
defined resource types | like classes, but appliable to nodes multiple times |
node definition | The task of configuring which classes will be applied to a given node - is called node classification. Node definitions are a puppet concept to write node classification down. |
.pp manifests | Puppet language files. Rules
|
Modules |
A Puppet module is a self-contained bundle of all the Puppet code and other data needed to manage some aspect of your configuration. |
Puppet master | The puppet server which configures the puppet agents |
Puppet agent | Installed on machines, which should be controlled by puppet (by puppet master) |
puppet module search <MODULENAME> | Search module |
puppet module install <MODULENAME> -v 5.16.1 | Install module |
puppet agent –test puppet agent -t | manually trigger puppet agent run. Puppet run is the check for new configurations. It usually occurs every 30 Minutes automatically |
puppet resource user root | check user root as resource |
puppet describe user | describe resource “user”. Especially available attributes. |
puppet apply -e “user { 'galatea': ensure ⇒ present, }” | Createa resource user |
puppet apply –noop -e “user | –noop allows to try out what would be if your would do that on the node |
puppet resource -e user galatea | Modify resourece user in VIM. (ESC i is editing. :wq is quit and save.) |
puppet resource package fortune-mod ensure=absent | Uninstall a package resource from node |
puppet master –configprint all puppet config print graphdir | print configs |
puppet module list | print module list |
tree -L 2 -d /etc/puppetlabs/code/environments/production/modules/ | Print the modules as a tree, and only modules from one location, limiting modules to 2 levels âââ cowsayings â  âââ examples â  âââ manifests âââ graphite â  âââ manifests â  âââ spec â  âââ templates âââ vsftpd âââ examples âââ manifests âââ templates âââ tests |
Class definition - description of the class. Done before association with nodes.
# /etc/puppetlabs/code/environments/production/modules/cowsayings/manifests/cowsay.pp class cowsayings::cowsay { package { 'cowsay': ensure => present, provider => 'gem', } } # /etc/puppetlabs/code/environments/production/modules/cowsayings/manifests/fortune.pp class cowsayings::fortune { package { 'fortune-mod': ensure => present, } } # /etc/puppetlabs/code/environments/production/modules/cowsayings/manifests/init.pp class cowsayings { include cowsaying::cowsay include cowsaying::fortune } Pefix **cowsayings** is the name of the module in this case. Default path **manifests/init.pp** contains the default module's manifest **manifests/init.pp**. It contains the name of the module. == declaration == Class **declaration** of a class "cowsay" on a node. <code> # /etc/puppetlabs/code/environments/production/modules/cowsayings/examples/cowsay.pp include cowsayings::cowsay
Class declaration of a parent class “cowsayings” on a node.
Parent class “cowsayings” includes both of them
# /etc/puppetlabs/code/environments/production/modules/cowsayings/examples/init.pp include cowsayings
Apply the class “cowsay” on the node
puppet apply /etc/puppetlabs/code/environments/production/modules/cowsayings/examples/cowsay.pp
Apply the parent class “cowsayings” on the node, which would install both subclasses “cowsay”, “fortune”
puppet apply /etc/puppetlabs/code/environments/production/modules/cowsayings/examples/init.pp
You can pass some parameters, when including external classes.
Here instead of writing include poodle and so accepting the defaults,
we define the $ensure to be true.
example of NO parametrized poodle class include
node 'beetle.example.com' { include basicstuff include poodle }
example of parametrized poodle class include
Here NO INCLUDE-keyword was used.
node 'beetle.example.com' { include basicstuff class { 'poodle': $ensure => 'stopped' } }
# /etc/puppetlabs/code/environments/production/modules/web_user/manifests/user.pp
define web_user::user ( $content = "<h1>Welcome to ${title}'s home page!</h1>", $password = undef, ) { $home_dir = "/home/${title}" $public_html = "${home_dir}/public_html" user { $title: ensure => present, password => $password, } file { [$home_dir, $public_html]: ensure => directory, owner => $title, group => $title, mode => '0755', } file { "${public_html}/index.html": ensure => file, owner => $title, group => $title, replace => false, content => $content, mode => '0644', } }
Declaration of users on a node.
'shelob', 'frodo' are the titles of the users, which may be references via the $title variable
# /etc/puppetlabs/code/environments/production/modules/web_user/examples/user.pp
web_user::user { 'shelob': } web_user::user { 'frodo': content => 'Custom Content!', password => pw_hash('sting', 'SHA-512', 'mysalt'), }
Defines relationships between resources.
Define the ordering of reources, in which they have to be installed
SSH config File required package “openssh-server” <ode> file { '/etc/ssh/sshd_config':
ensure => present, source => 'puppet:///modules/sshd/sshd_config', require => Package['openssh-server'], }
</code>
Package “openssh-server” must be installed, before service “sshd”
before turns the requirenments around
package { 'openssh-server': ensure => present, before => Service['sshd'], }
You can generate a graph, to check resource dependencies
# generate the dependency graph puppet apply sshd/examples/init.pp --noop --graph # check where the .dot graphs are going to puppet config print graphdir #generate a png dot -Tpng /opt/puppetlabs/puppet/cache/state/graphs/relationships.dot -o /var/www/quest/relationships.png
You can distribute files via puppet.
Files under modules “files” dir are made available via puppet URL and may be used in class definitions.
To create a module, which will distribute a config file do:
add the config files to /etc/puppetlabs/code/environments/production/modules/vimrc/files/vimrc
Creating a class vimrc to distribute file “vimrc”
class vimrc { file { '/root/.vimrc': ensure => present, source => 'puppet:///modules/vimrc/vimrc', } }
The URL to file in puppet-module has the form
puppet://{server hostname (optional)}/{mount point}/{remainder of path}
server hostname | the name of the puppet server. Can omit that, when referencing the default server. |
mount point | Where are the files? modules is a shortcut, to the folders with puppet modules |
remainder of path | Module name vimrc. All files are always under files dir, so omit that. vimrc is the name of the file. |
So path becomes
File | URL |
---|---|
/etc/puppetlabs/code/environments/production/modules/vimrc/files/vimrc | puppet:///modules/vimrc/vimrc |
Make sure that puppet has the rights to change the file
chown pe-puppet:pe-puppet /etc/puppetlabs/code/environments/production/modules/vimrc/files/vimrc
Create as usual a init.pp with include vimrc.
Install by
puppet apply vimrc/examples/init.pp
Manifest site.pp
in /etc/puppetlabs/code/environments/production/manifests/site.pp
defines the default node configuration.
Puppet master provides a bash script for setting up nodes:
curl -k https://<master.example.com>:8140/packages/current/install.bash | sudo bash
Puppet MASTER keeps signed certificates of each Node, which is a part of the infrastructure. To involve a node - sighn its certificate.
List all unsigned certificates of Nodes. Executable on master.
puppet cert list
Sign a certificate of node named webserver.learning.puppetlabs.vm
puppet cert sign webserver.learning.puppetlabs.vm
Definition
$doc_root = '/var/www/quest/'
Access
"${doc_root}hello.html"
class web { $doc_root = '/var/www/quest/' $english = 'Hello world!' $french = 'Bonjour le monde!' file { "${doc_root}hello.html": ensure => present, content => "<em>${english}</em>", } file { "${doc_root}bonjour.html": ensure => present, content => "<em>${french}</em>", } }
Global variables, available via facter or in code (like variables).
Output facts
facter -p | less facter operatingsystem
Syntax to access facts in code
$::factname
class accounts ($user_name) { if $::operatingsystem == 'centos' { $groups = 'wheel' } elsif $::operatingsystem == 'debian' { $groups = 'admin' } else { fail( "This module doesn't support ${::operatingsystem}." ) } notice ( "Groups for user ${user_name} set to ${groups}" ) ... }
Apply manifest, with modified facts, via prefix:
FACTER_factname=new_value
Example
FACTER_operatingsystem=Debian puppet apply --noop accounts/examples/init.pp
Define a class, with parameters, which can be modifed later on.
class classname ( $parameter = 'default' ) { ... } <code> <code> class web ( $page_name="title", $message="message" ) {
Declare (include on a node) a class, with parameters.
Fill them with values.
class {'classname': parameter => 'value', } <code> <code> class {'web': page_name => 'hola', message => 'Hola mundo!', }
You can retrieve ALL puppet configurations by executing
puppet master --configprint all
Or just single lines by doing
puppet master --configprint agent_catalog_run_lockfile puppet master --configprint agent_disabled_lockfile ... puppet master --configprint modulepath ...
Example configuration
agent_catalog_run_lockfile = /opt/puppetlabs/puppet/cache/state/agent_catalog_run.lock agent_disabled_lockfile = /opt/puppetlabs/puppet/cache/state/agent_disabled.lock allow_duplicate_certs = false always_cache_features = true app_management = true archive_file_server = learning.puppetlabs.vm archive_files = true autoflush = true autosign = /etc/puppetlabs/puppet/autosign.conf basemodulepath = /etc/puppetlabs/code/modules:/opt/puppetlabs/puppet/modules bindaddress = 0.0.0.0 binder_config = bucketdir = /opt/puppetlabs/puppet/cache/bucket ca = true ca_name = Puppet CA: learning.puppetlabs.vm ca_port = 8140 ca_server = learning.puppetlabs.vm ca_ttl = 157680000 cacert = /etc/puppetlabs/puppet/ssl/ca/ca_crt.pem cacrl = /etc/puppetlabs/puppet/ssl/ca/ca_crl.pem cadir = /etc/puppetlabs/puppet/ssl/ca cakey = /etc/puppetlabs/puppet/ssl/ca/ca_key.pem capass = /etc/puppetlabs/puppet/ssl/ca/private/ca.pass caprivatedir = /etc/puppetlabs/puppet/ssl/ca/private capub = /etc/puppetlabs/puppet/ssl/ca/ca_pub.pem catalog_cache_terminus = store_configs catalog_terminus = compiler cert_inventory = /etc/puppetlabs/puppet/ssl/ca/inventory.txt certdir = /etc/puppetlabs/puppet/ssl/certs certificate_revocation = true certname = learning.puppetlabs.vm cfacter = false classfile = /opt/puppetlabs/puppet/cache/state/classes.txt client_datadir = /opt/puppetlabs/puppet/cache/client_data clientbucketdir = /opt/puppetlabs/puppet/cache/clientbucket clientyamldir = /opt/puppetlabs/puppet/cache/client_yaml code = "" codedir = /etc/puppetlabs/code color = ansi confdir = /etc/puppetlabs/puppet config = /etc/puppetlabs/puppet/puppet.conf config_file_name = puppet.conf config_version = "" configprint = all configtimeout = 120 csr_attributes = /etc/puppetlabs/puppet/csr_attributes.yaml csrdir = /etc/puppetlabs/puppet/ssl/ca/requests daemonize = true data_binding_terminus = hiera default_file_terminus = rest default_manifest = ./manifests default_schedules = true deviceconfig = /etc/puppetlabs/puppet/device.conf devicedir = /opt/puppetlabs/puppet/cache/devices diff = diff diff_args = -u digest_algorithm = md5 disable_per_environment_manifest = false disable_warnings = ["deprecations"] dns_alt_names = "" document_all = false environment = production environment_data_provider = none environment_timeout = 0 environmentpath = /etc/puppetlabs/code/environments evaltrace = false external_nodes = none factpath = /opt/puppetlabs/puppet/cache/lib/facter:/opt/puppetlabs/puppet/cache/facts facts_terminus = yaml fileserverconfig = /etc/puppetlabs/puppet/fileserver.conf filetimeout = 15 forge_authorization = freeze_main = false genconfig = false genmanifest = false graph = false graphdir = /opt/puppetlabs/puppet/cache/state/graphs group = pe-puppet hiera_config = /etc/puppetlabs/code/hiera.yaml hostcert = /etc/puppetlabs/puppet/ssl/certs/learning.puppetlabs.vm.pem hostcrl = /etc/puppetlabs/puppet/ssl/crl.pem hostcsr = /etc/puppetlabs/puppet/ssl/csr_learning.puppetlabs.vm.pem hostprivkey = /etc/puppetlabs/puppet/ssl/private_keys/learning.puppetlabs.vm.pem hostpubkey = /etc/puppetlabs/puppet/ssl/public_keys/learning.puppetlabs.vm.pem http_connect_timeout = 120 http_debug = false http_keepalive_timeout = 4 http_proxy_host = none http_proxy_password = none http_proxy_port = 3128 http_proxy_user = none http_read_timeout = ignorecache = false ignoremissingtypes = false ignoreschedules = false keylength = 4096 lastrunfile = /opt/puppetlabs/puppet/cache/state/last_run_summary.yaml lastrunreport = /opt/puppetlabs/puppet/cache/state/last_run_report.yaml ldapattrs = all ldapbase = "" ldapclassattrs = puppetclass ldapparentattr = parentnode ldappassword = "" ldapport = 389 ldapserver = ldap ldapssl = false ldapstackedattrs = puppetvar ldapstring = (&(objectclass=puppetClient)(cn=%s)) ldaptls = false ldapuser = "" libdir = /opt/puppetlabs/puppet/cache/lib localcacert = /etc/puppetlabs/puppet/ssl/certs/ca.pem log_level = notice logdir = /var/log/puppetlabs/puppet manage_internal_file_permissions = true manifest = /etc/puppetlabs/code/environments/production/manifests masterhttplog = /var/log/puppetlabs/puppet/masterhttp.log masterport = 8140 max_deprecations = 10 max_errors = 10 max_warnings = 10 maximum_uid = 4294967290 mkusers = false module_groups = base+pe_only module_repository = https://forgeapi.puppetlabs.com module_skeleton_dir = /opt/puppetlabs/puppet/cache/puppet-module/skeleton module_working_dir = /opt/puppetlabs/puppet/cache/puppet-module modulepath = /etc/puppetlabs/code/environments/production/modules:/etc/puppetlabs/code/modules:/opt/puppetlabs/puppet/modules name = master node_cache_terminus = write_only_yaml node_name = cert node_name_fact = "" node_name_value = learning.puppetlabs.vm node_terminus = classifier noop = false onetime = false ordering = manifest passfile = /etc/puppetlabs/puppet/ssl/private/password path = none pidfile = /var/run/puppetlabs/master.pid plugindest = /opt/puppetlabs/puppet/cache/lib pluginfactdest = /opt/puppetlabs/puppet/cache/facts.d pluginfactsource = puppet:///pluginfacts pluginsignore = .svn CVS .git pluginsource = puppet:///plugins pluginsync = true postrun_command = "" preferred_serialization_format = pson prerun_command = "" preview_outputdir = /opt/puppetlabs/puppet/cache/preview priority = privatedir = /etc/puppetlabs/puppet/ssl/private privatekeydir = /etc/puppetlabs/puppet/ssl/private_keys profile = false publickeydir = /etc/puppetlabs/puppet/ssl/public_keys puppetdlog = /var/log/puppetlabs/puppet/puppetd.log report = true report_port = 8140 report_server = learning.puppetlabs.vm reportdir = /opt/puppetlabs/puppet/cache/reports reports = puppetdb reporturl = http://localhost:3000/reports/upload req_bits = 4096 requestdir = /etc/puppetlabs/puppet/ssl/certificate_requests resourcefile = /opt/puppetlabs/puppet/cache/state/resources.txt rest_authconfig = /etc/puppetlabs/puppet/auth.conf route_file = /etc/puppetlabs/puppet/routes.yaml rundir = /var/run/puppetlabs runinterval = 1800 serial = /etc/puppetlabs/puppet/ssl/ca/serial server = learning.puppetlabs.vm server_datadir = /opt/puppetlabs/puppet/cache/server_data show_diff = false signeddir = /etc/puppetlabs/puppet/ssl/ca/signed skip_tags = "" splay = false splaylimit = 1800 srv_domain = puppetlabs.vm ssl_client_ca_auth = ssl_client_header = HTTP_X_CLIENT_DN ssl_client_verify_header = HTTP_X_CLIENT_VERIFY ssl_server_ca_auth = ssldir = /etc/puppetlabs/puppet/ssl statedir = /opt/puppetlabs/puppet/cache/state statefile = /opt/puppetlabs/puppet/cache/state/state.yaml static_catalogs = true storeconfigs = true storeconfigs_backend = puppetdb strict_environment_mode = false strict_hostname_checking = false strict_variables = false summarize = false supported_checksum_types = ["md5", "sha256"] syslogfacility = daemon tags = "" trace = false trusted_oid_mapping_file = /etc/puppetlabs/puppet/custom_trusted_oid_mapping.yaml trusted_server_facts = false use_cached_catalog = false use_srv_records = false usecacheonfailure = true user = pe-puppet vardir = /opt/puppetlabs/puppet/cache waitforcert = 120 yamldir = /opt/puppetlabs/puppet/cache/yaml
Details are here: https://kjhenner.gitbooks.io/puppet-quest-guide/content/quests/application_orchestrator.html
Orchestration allows to install dependent applications in the right order.
It works as following: