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