Kun käytetään r10k:ta ja Foremania yhdessä on uusien luokkien tuonti kaksivaiheinen prosessi. Oletetaan vaikka, että "production" environmentiin on luotu uusi luokka, esim. "role::ipa_server". Ilman Foremania riittäisi tuoda muutos puppetmasterille r10k:lla:

$ r10k deploy environment production -vp

Foreman ei kuitenkaan vielä tiedä uudesta luokasta mitään:

$ hammer puppet-class list --environment production|grep ipa_server

Foremanin komponentti, joka hakee Puppetmasterilta uudet luokat on nimeltään "Smart proxy", joka tunnetaan myös nimellä "foreman-proxy". Uusimpien Puppetin versioiden kanssa se hakee luokat Puppetserverin API:a käyttäen. Luokat saa päivitettyä komentoriviltä melko triviaalisti:

$ hammer proxy import-classes --id 1
Result:
Successfully updated environment and puppetclasses from the on-disk puppet installation
Changed environments:
1) production
New classes:
role::ipa_server

Yllä "id" viittaa smart proxyyn, jolta puppet-luokat päivitetään (ks. "hammer proxy list").

Edellä mainittu komento ei kuitenkaan tee mitään jos Puppetserverin environment class cache on päällä, koska smart proxy saa API-kyselyn tehdessään vanhentuneen listan Puppet-luokista. Ongelman voi korjata poistamalla ko. ominaisuuden käytöstä tiedostosta /etc/puppetlabs/puppetserver/conf.d/puppetserver.conf:

# (optional) enable or disable environment class cache
environment-class-cache-enabled: false

Tämän jälkeen smart proxyn logeihin ilmestyykin varoitus:

2019-08-08T12:12:21 ed5f29fe [W] Puppet server classes cache is disabled, classes retrieval can be slow.

Tämä ei kuitenkaan ole mikään ongelma ainakaan pienehköissä ympäristöissä ja vähentää huomattavasti harmaiden hiuksien määrää tehtäessä nopeaa Puppet-koodin kehitystä.

Jotkin Puppet ENC:t (External Node Classifier), hyvänä esimerkkinä Foreman, eivät tue määriteltyjen resurssien (Defined Resource Types) käyttöä suoraan, vaan kaikki konfiguraatiot pitää sisällyttää Puppet-luokkiin.

Myös Hieran kanssa määritellyt resurssit ovat hieman ongelmallisia, koska ne pitää erikseen luoda create_resources funktiolla. Eräs ratkaisu on määrittää kaikki create_resources -funktiot site.pp-tiedostossa (sovellettu täältä):

create_resources('mysqldump::backup',hiera('mysqldump_backups', {}))

Tämän lähestymistavan ongelma on se, että uudet määritellyt resurssit pitää muistaa lisätä site.pp-tiedostoon.

Yksinkertaisempi ja myös Foremanin kanssa toimiva ratkaisu on luoda määritellyt resurssit suoraan Puppet-moduulin pääluokasta (sovellettu täältä):

class mysqldump
 (
 $backups = {}
 )
 {
 create_resources('mysqldump::backup', $backups)
 }

Yllä mysqldump-luokalla on hash-tyyppinen parameteri $backups, jossa määritetyt mysqldump::backup -resurssit luodaan create_resources -funktiolla. Aaltosulkeet parametrin oletusarvona mahdollistavat parametrin $backups määrittelemättä jättämisen ja kertovat Puppetille, että kyseessä on nimenomaan hash-tyyppinen parametri. Noodin yaml-tiedostossa $backups -parametri määriteltäisiin tähän tapaan:

---
 classes:
 - mysqldump
 
 mysqldump::backups:
 eka:
 databases:
 - 'eka'
 toka:
 databases:
 - 'toka'

Tämä ratkaisu toimii tietenkin toimii vain, jos noodille on lisätty hash-parametrin sisältävä luokka (yllä mysqldump). Luokkien lisääminen Hierasta onnistuu vain, jos site.pp -tiedostossa on seuraava rivi:

hiera_include('classes')
menucross-circle