Marioneta - Facter & Facts

Puppet admite mantener varios valores como variable de entorno. Esta función es compatible con Puppet mediante el uso defacter. En Puppet, facter es una herramienta independiente que contiene la variable de nivel de entorno. In se puede considerar similar a la variable env de Bash o Linux. A veces puede haber una superposición entre la información almacenada en hechos y la variable de entorno de la máquina. En Puppet, el par clave-valor se conoce como "hecho". Cada recurso tiene sus propios hechos y en Puppet el usuario tiene la influencia para construir sus propios hechos personalizados.

# facter

Facter commandse puede utilizar para enumerar todas las diferentes variables de entorno y sus valores asociados. Esta colección de hechos viene con facter listo para usar y se conoce como hechos centrales. Se pueden agregar hechos personalizados a la colección.

Si uno quiere ver solo una variable. Se puede hacer usando el siguiente comando.

# facter {Variable Name}  

Example 
[[email protected] ~]# facter virtual 
virtualbox

La razón por la que facter es importante para Puppet es que facter y hechos están disponibles en todo el código de Puppet como “global variable”, lo que significa que se puede utilizar en el código en cualquier momento sin ninguna otra referencia.

Ejemplo para probar

[[email protected] modules]# tree brcle_account 
brcle_account 
└── manifests  └── init.pp [[email protected] 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", 
   } 
}

Probándolo

[[email protected] 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  
[[email protected] modules]# cat /tmp/testfile.txt  
the value for the 'OperatingSystem' fact is: Linux   

[[email protected] modules]# facter OperatingSystem 
Linux

Como podemos observar en el fragmento de código anterior, no hemos definido el OperatingSystem. Acabamos de reemplazar el valor con un valor codificado suave$OperatingSystem como variable normal.

En Puppet, hay tres tipos de hechos que se pueden usar y definir:

  • Hechos fundamentales
  • Hechos personalizados
  • Hechos externos

Los hechos centrales se definen en el nivel superior y son accesibles para todos en cualquier punto del código.

Hechos de títeres

Justo antes de que un agente solicite un catálogo al maestro, el agente primero compila una lista completa de información disponible en sí mismo en forma de un par clave-valor. La información sobre el agente es recopilada por una herramienta llamada facter y cada par clave-valor se conoce como un hecho. A continuación se muestra una salida común de hechos sobre un agente.

[[email protected] ~]# 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

En el código anterior, podemos ver que algunos de los datos se superponen con poca información disponible en la variable bash "env". Puppet directamente no usa los datos, sino que usa datos facter, los datos Facter se tratan como una variable global.

Los hechos están disponibles como variable de nivel superior y el Puppet master puede utilizarlos para compilar el catálogo de Puppet para el agente solicitante. Los factores se llaman en el manifiesto como una variable normal con el prefijo $.

Ejemplo

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" 
}

El archivo de manifiesto anterior solo se preocupa por un solo archivo llamado machineOperatingSystem.txt, donde el contenido de este archivo se deduce por el hecho llamado OperatingSystem.

[[email protected] /]# facter OperatingSystem 
Linux  

[[email protected] /]# 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  

[[email protected] /]# cat /tmp/machinetype.txt 
This machine OS is of the type Linux

Hechos personalizados

Todos los hechos anteriores que hemos visto son los hechos centrales de la máquina. Se pueden agregar estos hechos personalizados al nodo de las siguientes maneras:

  • Uso de la "sintaxis export FACTER ..."
  • Usando la configuración de $ LOAD_PATH
  • FACTERLIB
  • Pluginsync

Usando la sintaxis "export FACTER"

Uno puede agregar manualmente los hechos usando la sintaxis export FACTER_ {nombre del hecho}.

Ejemplo

[[email protected] facter]# export FACTER_tallest_mountain="Everest" 
[[email protected] facter]# facter tallest_mountain Everest

Uso de la configuración de $ LOAD_PATH

En Ruby, $ LOAD_PATH es equivalente al parámetro especial Bash. Aunque es similar a la variable bash $ PATH, en los hechos reales $ LOAD_PATH no es una variable de entorno, sino una variable predefinida.

$ LOAD_PATH tiene un sinónimo "$:". Esta variable es una matriz para buscar y cargar los valores.

[[email protected] ~]# 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

Tomemos un ejemplo de cómo crear un factor de directorio y agregar un .pp archivo y agregarle un contenido.

[[email protected] ~]# cd /usr/lib/ruby/site_ruby/ 
[[email protected] site_ruby]# mkdir facter 
[[email protected] site_ruby]# cd facter/ 
[[email protected] facter]# ls 
[[email protected] facter]# touch newadded_facts.rb

Agregue el siguiente contenido al archivo custom_facts.rb.

[[email protected] facter]# cat newadded_facts.rb 
Facter.add('tallest_mountain') do 
   setcode "echo Everest" 
end

Facter trabaja en el método de escanear todas las carpetas enumeradas en $ LOAD_PATH, y busca un director llamado facter. Una vez que encuentre esa carpeta en particular, la cargará en cualquier lugar de la estructura de la carpeta. Si encuentra esta carpeta, busca cualquier archivo Ruby en esa carpeta facter y carga todos los datos definidos sobre cualquier configuración en particular en la memoria.

Usando FACTERLIB

En Puppet, FACTERLIB funciona de manera muy similar a $ LOAD_PATH pero con una sola diferencia clave: es un parámetro de entorno de nivel de sistema operativo en lugar de una variable especial de Ruby. De forma predeterminada, es posible que la variable de entorno no esté configurada.

[[email protected] facter]# env | grep "FACTERLIB" 
[[email protected] facter]#

Para probar FACTERLIB, debemos realizar los siguientes pasos.

Cree una carpeta llamada test_facts en la siguiente estructura.

[[email protected] tmp]# tree /tmp/test_facts/ 
/tmp/some_facts/ 
├── vipin 
│   └── longest_river.rb 
└── testing 
   └── longest_wall.rb

Agregue el siguiente contenido a los archivos .rb.

[[email protected] vipin]# cat longest_river.rb 
Facter.add('longest_river') do 
   setcode "echo Nile" 
end 

[[email protected] testing]# cat longest_wall.rb 
Facter.add('longest_wall') do 
   setcode "echo 'China Wall'" 
end

Utilice la declaración de exportación.

[[email protected] /]# export 
FACTERLIB = "/tmp/some_facts/river:/tmp/some_facts/wall" 
[[email protected] /]# env | grep "FACTERLIB" 
FACTERLIB = /tmp/some_facts/river:/tmp/some_facts/wall

Prueba el nuevo factor.

[[email protected] /]# facter longest_river 
Nile 
[[email protected] /]# facter longest_wall 
China Wall

Hechos externos

Los hechos externos son muy útiles cuando el usuario desea aplicar algunos hechos nuevos creados en el momento del aprovisionamiento. Los hechos externos son una de las formas clave de aplicar metadatos a una máquina virtual en su etapa de aprovisionamiento (por ejemplo, usando vSphere, OpenStack, AWS, etc.)

Puppet puede utilizar todos los metadatos y sus detalles creados para determinar qué detalles deben estar presentes en el catálogo que se va a aplicar.

Creando un hecho externo

En la máquina del agente, necesitamos crear un directorio como se menciona a continuación.

$ mkdir -p /etc/facter/facts.d

Cree un script de Shell en el directorio con el siguiente contenido.

$ 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"

Cambie el permiso del archivo de secuencia de comandos.

$ chmod u+x /etc/facter/facts.d/external-facts.sh

Una vez hecho esto, ahora podemos ver la variable presente con el par clave / valor.

$ facter hostgroup 
dev 
$ facter environment 
development

Se pueden escribir hechos personalizados en Puppet. Como referencia, utilice el siguiente enlace del sitio Puppet.

https://docs.puppet.com/facter/latest/fact_overview.html#writing-structured-facts