Puppet - Facter & Facts
Puppet supporta la conservazione di più valori come variabile di ambiente. Questa funzione è supportata in Puppet utilizzandofacter. In Puppet, facter è uno strumento autonomo che contiene la variabile a livello di ambiente. In può essere considerato simile alla variabile env di Bash o Linux. A volte può esserci una sovrapposizione tra le informazioni memorizzate nei fatti e la variabile d'ambiente della macchina. In Puppet, la coppia chiave-valore è nota come "fatto". Ogni risorsa ha i suoi fatti e in Puppet l'utente ha la leva per costruire i propri fatti personalizzati.
# facter
Facter commandpuò essere utilizzato per elencare tutte le diverse variabili di ambiente e i valori associati. Questa raccolta di fatti viene fornita con facter out-of-the-box e sono indicati come fatti fondamentali. Si possono aggiungere fatti personalizzati alla raccolta.
Se si desidera visualizzare solo una variabile. Può essere fatto usando il seguente comando.
# facter {Variable Name}
Example
[root@puppetmaster ~]# facter virtual
virtualbox
Il motivo per cui facter è importante per Puppet è che facter e fatti sono disponibili in tutto il codice Puppet come “global variable”, il che significa che può essere utilizzato nel codice in qualsiasi momento senza altri riferimenti.
Esempio da testare
[root@puppetmaster modules]# tree brcle_account
brcle_account
└── manifests └── init.pp [root@puppetmaster modules]# cat brcle_account/manifests/init.pp
class brcle_account {
user { 'G01063908':
ensure => 'present',
uid => '121',
shell => '/bin/bash',
home => '/home/G01063908',
}
file {'/tmp/userfile.txt':
ensure => file,
content => "the value for the 'OperatingSystem' fact is: $OperatingSystem \n",
}
}
Testarlo
[root@puppetmaster modules]# puppet agent --test
Notice: /Stage[main]/Activemq::Service/Service[activemq]/ensure:
ensure changed 'stopped' to 'running'
Info: /Stage[main]/Activemq::Service/Service[activemq]:
Unscheduling refresh on Service[activemq]
Notice: Finished catalog run in 4.09 seconds
[root@puppetmaster modules]# cat /tmp/testfile.txt
the value for the 'OperatingSystem' fact is: Linux
[root@puppetmaster modules]# facter OperatingSystem
Linux
Come possiamo notare nello snippet di codice sopra, non abbiamo definito il file OperatingSystem. Abbiamo appena sostituito il valore con un valore soft coded$OperatingSystem come variabile normale.
In Puppet, ci sono tre tipi di fatti che possono essere usati e definiti:
- Fatti fondamentali
- Fatti personalizzati
- Fatti esterni
I fatti principali sono definiti al livello più alto e accessibili a tutti in qualsiasi punto del codice.
Fatti delle marionette
Appena prima che un agente richieda un catalogo al master, l'agente compila un elenco completo di informazioni disponibili in sé sotto forma di una coppia chiave-valore. Le informazioni sull'agente vengono raccolte da uno strumento chiamato facter e ogni coppia chiave-valore viene definita un fatto. Di seguito è riportato un output comune di fatti su un agente.
[root@puppetagent1 ~]# facter
architecture => x86_64
augeasversion => 1.0.0
bios_release_date => 13/09/2012
bios_vendor => innotek GmbH
bios_version => VirtualBox
blockdevice_sda_model => VBOX HARDDISK
blockdevice_sda_size => 22020587520
blockdevice_sda_vendor => ATA
blockdevice_sr0_model => CD-ROM
blockdevice_sr0_size => 1073741312
blockdevice_sr0_vendor => VBOX
blockdevices => sda,sr0
boardmanufacturer => Oracle Corporation
boardproductname => VirtualBox
boardserialnumber => 0
domain => codingbee.dyndns.org
facterversion => 2.1.0
filesystems => ext4,iso9660
fqdn => puppetagent1.codingbee.dyndns.org
hardwareisa => x86_64
hardwaremodel => x86_64
hostname => puppetagent1
id => root
interfaces => eth0,lo
ipaddress => 172.228.24.01
ipaddress_eth0 => 172.228.24.01
ipaddress_lo => 127.0.0.1
is_virtual => true
kernel => Linux
kernelmajversion => 2.6
kernelrelease => 2.6.32-431.23.3.el6.x86_64
kernelversion => 2.6.32
lsbdistcodename => Final
lsbdistdescription => CentOS release 6.5 (Final)
lsbdistid => CentOS
lsbdistrelease => 6.5
lsbmajdistrelease => 6
lsbrelease => :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0noarch:graphics-4.0-amd64:
graphics-4.0-noarch:printing-4.0-amd64:printing-4.0noarch
macaddress => 05:00:22:47:H9:77
macaddress_eth0 => 05:00:22:47:H9:77
manufacturer => innotek GmbH
memoryfree => 125.86 GB
memoryfree_mb => 805.86
memorysize => 500 GB
memorysize_mb => 996.14
mtu_eth0 => 1500
mtu_lo => 16436
netmask => 255.255.255.0
netmask_eth0 => 255.255.255.0
network_lo => 127.0.0.0
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.5
osfamily => RedHat
partitions => {"sda1"=>{
"uuid"=>"d74a4fa8-0883-4873-8db0-b09d91e2ee8d", "size" =>"1024000",
"mount" => "/boot", "filesystem" => "ext4"}, "sda2"=>{"size" => "41981952",
"filesystem" => "LVM2_member"}
}
path => /usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
physicalprocessorcount => 1
processor0 => Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
processor1 => Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
processor2 => Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
processorcount => 3
productname => VirtualBox
ps => ps -ef
puppetversion => 3.6.2
rubysitedir => /usr/lib/ruby/site_ruby/1.8
rubyversion => 1.8.7
selinux => true
selinux_config_mode => enforcing
selinux_config_policy => targeted
selinux_current_mode => enforcing
selinux_enforced => true
selinux_policyversion => 24
serialnumber => 0
sshdsakey => AAAAB3NzaC1kc3MAAACBAK5fYwRM3UtOs8zBCtRTjuHLw56p94X/E0UZBZwFR3q7
WH0x5+MNsjfmdCxKvpY/WlIIUcFJzvlfjXm4qDaTYalbzSZJMT266njNbw5WwLJcJ74KdW92ds76pjgm
CsjAh+R9YnyKCEE35GsYjGH7whw0gl/rZVrjvWYKQDOmJA2dAAAAFQCoYABgjpv3EkTWgjLIMnxA0Gfud
QAAAIBM4U6/nerfn6Qvt43FC2iybvwVo8ufixJl5YSEhs92uzsW6jiw68aaZ32q095/gEqYzeF7a2knr
OpASgO9xXqStYKg8ExWQVaVGFTR1NwqhZvz0oRSbrN3h3tHgknoKETRAg/imZQ2P6tppAoQZ8wpuLrXU
CyhgJGZ04Phv8hinAAAAIBN4xaycuK0mdH/YdcgcLiSn8cjgtiETVzDYa+jF
swapfree => 3.55 GB
swapfree_mb => 2015.99
swapsize => 3.55 GB
swapsize_mb => 2015.99
timezone => GMT
type => Other
uniqueid => a8c0af01
uptime => 45:012 hours
uptime_days => 0
uptime_hours => 6
uptime_seconds => 21865
uuid => BD8B9D85-1BFD-4015-A633-BF71D9A6A741
virtual => virtualbox
Nel codice sopra, possiamo vedere alcuni dei dati sovrapporsi con poche delle informazioni disponibili nella variabile bash "env". Puppet non utilizza direttamente i dati, invece fa uso di dati facter, i dati Facter vengono trattati come variabili globali.
I fatti sono quindi disponibili come variabili di primo livello e il Puppet master può utilizzarli per compilare il catalogo Puppet per l'agente richiedente. I facter sono chiamati nel manifest come una normale variabile con $ prefisso.
Esempio
if ($OperatingSystem == "Linux") {
$message = "This machine OS is of the type $OperatingSystem \n"
} else {
$message = "This machine is unknown \n"
}
file { "/tmp/machineOperatingSystem.txt":
ensure => file,
content => "$message"
}
Il file manifest sopra si preoccupa solo di un singolo file chiamato machineOperatingSystem.txt, dove il contenuto di questo file viene dedotto dal fatto chiamato OperatingSystem.
[root@puppetagent1 /]# facter OperatingSystem
Linux
[root@puppetagent1 /]# puppet apply /tmp/ostype.pp
Notice: Compiled catalog for puppetagent1.codingbee.dyndns.org
in environment production in 0.07 seconds
Notice: /Stage[main]/Main/File[/tmp/machineOperatingSystem.txt]/ensure:
defined content as '{md5}f59dc5797d5402b1122c28c6da54d073'
Notice: Finished catalog run in 0.04 seconds
[root@puppetagent1 /]# cat /tmp/machinetype.txt
This machine OS is of the type Linux
Fatti personalizzati
Tutti i fatti di cui sopra che abbiamo visto sono i fatti centrali della macchina. È possibile aggiungere questi fatti personalizzati al nodo nei seguenti modi:
- Utilizzo di "export FACTER ... Syntax"
- Utilizzando le impostazioni $ LOAD_PATH
- FACTERLIB
- Pluginsync
Utilizzando la sintassi "export FACTER"
È possibile aggiungere manualmente i fatti utilizzando la sintassi di esportazione FACTER_ {nome del fatto}.
Esempio
[root@puppetagent1 facter]# export FACTER_tallest_mountain="Everest"
[root@puppetagent1 facter]# facter tallest_mountain Everest
Utilizzando le impostazioni $ LOAD_PATH
In Ruby, $ LOAD_PATH è equivalente al parametro speciale Bash. Sebbene sia simile alla variabile $ PATH di bash, in realtà $ LOAD_PATH non è una variabile d'ambiente, ma è una variabile predefinita.
$ LOAD_PATH ha un sinonimo "$:". Questa variabile è un array per cercare e caricare i valori.
[root@puppetagent1 ~]# ruby -e 'puts $LOAD_PATH'
# note you have to use single quotes.
/usr/lib/ruby/site_ruby/1.6
/usr/lib64/ruby/site_ruby/1.6
/usr/lib64/ruby/site_ruby/1.6/x86_64-linux
/usr/lib/ruby/site_ruby
/usr/lib64/ruby/site_ruby
/usr/lib64/site_ruby/1.6
/usr/lib64/site_ruby/1.6/x86_64-linux
/usr/lib64/site_ruby
/usr/lib/ruby/1.6
/usr/lib64/ruby/1.6
/usr/lib64/ruby/1.6/x86_64-linux
Facciamo un esempio della creazione di un facter di directory e dell'aggiunta di un file .pp file e aggiungervi un contenuto.
[root@puppetagent1 ~]# cd /usr/lib/ruby/site_ruby/
[root@puppetagent1 site_ruby]# mkdir facter
[root@puppetagent1 site_ruby]# cd facter/
[root@puppetagent1 facter]# ls
[root@puppetagent1 facter]# touch newadded_facts.rb
Aggiungi il seguente contenuto al file custom_facts.rb.
[root@puppetagent1 facter]# cat newadded_facts.rb
Facter.add('tallest_mountain') do
setcode "echo Everest"
end
Facter funziona nel metodo di scansione di tutte le cartelle elencate in $ LOAD_PATH e cerca un regista chiamato facter. Una volta trovata quella particolare cartella, le caricherà ovunque nella struttura delle cartelle. Se trova questa cartella, cerca qualsiasi file Ruby in quella cartella facter e carica tutti i fatti definiti su una particolare configurazione nella memoria.
Utilizzando FACTERLIB
In Puppet, FACTERLIB funziona in modo molto simile a $ LOAD_PATH ma con una sola differenza fondamentale che è un parametro di ambiente a livello di sistema operativo piuttosto che una variabile speciale Ruby. Per impostazione predefinita, la variabile di ambiente potrebbe non essere impostata.
[root@puppetagent1 facter]# env | grep "FACTERLIB"
[root@puppetagent1 facter]#
Per testare FACTERLIB, è necessario eseguire i seguenti passaggi.
Crea una cartella chiamata test_facts nella seguente struttura.
[root@puppetagent1 tmp]# tree /tmp/test_facts/
/tmp/some_facts/
├── vipin
│ └── longest_river.rb
└── testing
└── longest_wall.rb
Aggiungere i seguenti contenuti ai file .rb.
[root@puppetagent1 vipin]# cat longest_river.rb
Facter.add('longest_river') do
setcode "echo Nile"
end
[root@puppetagent1 testing]# cat longest_wall.rb
Facter.add('longest_wall') do
setcode "echo 'China Wall'"
end
Usa l'istruzione export.
[root@puppetagent1 /]# export
FACTERLIB = "/tmp/some_facts/river:/tmp/some_facts/wall"
[root@puppetagent1 /]# env | grep "FACTERLIB"
FACTERLIB = /tmp/some_facts/river:/tmp/some_facts/wall
Prova il nuovo facter.
[root@puppetagent1 /]# facter longest_river
Nile
[root@puppetagent1 /]# facter longest_wall
China Wall
Fatti esterni
I fatti esterni sono molto utili quando l'utente desidera applicare alcuni nuovi fatti creati al momento del provisioning. I fatti esterni sono uno dei modi chiave per applicare i metadati a una VM nella sua fase di provisioning (ad esempio utilizzando vSphere, OpenStack, AWS, ecc.)
Tutti i metadati ei relativi dettagli creati possono essere utilizzati da Puppet per determinare quali dettagli dovrebbero essere presenti nel catalogo, che verrà applicato.
Creare un fatto esterno
Sulla macchina dell'agente, dobbiamo creare una directory come indicato di seguito.
$ mkdir -p /etc/facter/facts.d
Crea uno script Shell nella directory con il seguente contenuto.
$ ls -l /etc/facter/facts.d
total 4
-rwxrwxrwx. 1 root root 65 Sep 18 13:11 external-factstest.sh
$ cat /etc/facter/facts.d/external-factstest.sh
#!/bin/bash
echo "hostgroup = dev"
echo "environment = development"
Modificare l'autorizzazione del file di script.
$ chmod u+x /etc/facter/facts.d/external-facts.sh
Una volta fatto, ora possiamo vedere la variabile presente con la coppia chiave / valore.
$ facter hostgroup
dev
$ facter environment
development
Si possono scrivere fatti personalizzati in Puppet. Come riferimento, usa il seguente collegamento dal sito Puppet.
https://docs.puppet.com/facter/latest/fact_overview.html#writing-structured-facts