Fantoche - Fatos e fatos

O Puppet suporta a retenção de vários valores como uma variável de ambiente. Este recurso é compatível com o Puppet usandofacter. No Puppet, o facter é uma ferramenta autônoma que mantém a variável de nível de ambiente. In pode ser considerado semelhante à variável env do Bash ou Linux. Às vezes, pode haver uma sobreposição entre as informações armazenadas nos fatos e as variáveis ​​de ambiente da máquina. No Puppet, o par de valores-chave é conhecido como “fato”. Cada recurso tem seus próprios fatos e no Puppet o usuário tem a vantagem de construir seus próprios fatos personalizados.

# facter

Facter commandpode ser usado para listar todas as diferentes variáveis ​​de ambiente e seus valores associados. Essa coleção de fatos vem com um aspecto fora da caixa e são chamadas de fatos essenciais. Pode-se adicionar fatos personalizados à coleção.

Se quisermos ver apenas uma variável. Isso pode ser feito usando o seguinte comando.

# facter {Variable Name}  

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

A razão pela qual o fator é importante para o Puppet é que ele e os fatos estão disponíveis em todo o código do Puppet como “global variable”, o que significa que pode ser usado no código a qualquer momento, sem qualquer outra referência.

Exemplo para testar

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

Testando

[[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 notar no snippet de código acima, não definimos o OperatingSystem. Acabamos de substituir o valor por um valor codificado por software$OperatingSystem como variável normal.

No Puppet, existem três tipos de fatos que podem ser usados ​​e definidos -

  • Principais fatos
  • Fatos personalizados
  • Fatos Externos

Os fatos essenciais são definidos no nível superior e acessíveis a todos em qualquer ponto do código.

Fatos sobre fantoches

Pouco antes de um agente solicitar um catálogo do mestre, o agente primeiro compila uma lista completa de informações disponíveis por si mesmo na forma de um par de valores-chave. As informações sobre o agente são coletadas por uma ferramenta chamada facter e cada par de valor-chave é referido como um fato. A seguir está uma saída comum de fatos sobre um 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

No código acima, podemos ver que alguns dados se sobrepõem a poucas informações disponíveis na variável bash “env”. O Puppet não usa os dados diretamente, em vez disso, faz uso dos dados do Facter, os dados do Facter são tratados como uma variável global.

Os fatos estão então disponíveis como variáveis ​​de nível superior e o mestre do Puppet pode usá-los para compilar o catálogo do Puppet para o agente solicitante. Os fatores são chamados no manifesto como uma variável normal com o prefixo $.

Exemplo

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

O arquivo de manifesto acima só se preocupa com um único arquivo chamado machineOperatingSystem.txt, onde o conteúdo deste arquivo é deduzido pelo fato denominado 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

Fatos personalizados

Todos os fatos acima que vimos são os fatos centrais da máquina. Pode-se adicionar esses fatos personalizados ao nó das seguintes maneiras -

  • Usando a "exportar FACTER ... Sintaxe"
  • Usando as configurações de $ LOAD_PATH
  • FACTERLIB
  • Pluginsync

Usando a sintaxe “export FACTER”

Pode-se adicionar manualmente os fatos usando a sintaxe export FACTER_ {nome do fato}.

Exemplo

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

Usando as configurações $ LOAD_PATH

Em Ruby, $ LOAD_PATH é equivalente ao parâmetro especial Bash. Embora seja semelhante à variável bash $ PATH, na verdade, $ LOAD_PATH não é uma variável de ambiente, ao invés disso, é uma variável predefinida.

$ LOAD_PATH tem um sinônimo “$:”. Esta variável é um array para pesquisar e carregar os 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

Vamos dar um exemplo de criação de um fator de diretório e adicionar um .pp arquivo e anexar um conteúdo a ele.

[[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

Adicione o seguinte conteúdo ao arquivo custom_facts.rb.

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

O Facter trabalha no método de escanear todas as pastas listadas em $ LOAD_PATH e procura por um diretor chamado facter. Depois de encontrar essa pasta específica, ele os carregará em qualquer lugar na estrutura de pastas. Se encontrar essa pasta, ele procura por qualquer arquivo Ruby nessa pasta facter e carrega todos os fatos definidos sobre qualquer configuração particular na memória.

Usando FACTERLIB

No Puppet, FACTERLIB funciona de maneira muito semelhante a $ LOAD_PATH, mas com apenas uma diferença fundamental: é um parâmetro de ambiente no nível do sistema operacional em vez de uma variável especial Ruby. Por padrão, a variável de ambiente não pode ser definida.

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

Para testar o FACTERLIB, precisamos realizar as seguintes etapas.

Crie uma pasta chamada test_facts na seguinte estrutura.

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

Adicione o seguinte conteúdo aos arquivos .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

Use a declaração de exportação.

[[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

Teste o novo facter.

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

Fatos Externos

Fatos externos são muito úteis quando o usuário deseja aplicar alguns fatos novos criados no momento do provisionamento. Fatos externos são uma das principais maneiras de aplicar metadados a uma VM em seu estágio de provisionamento (por exemplo, usando vSphere, OpenStack, AWS, etc.)

Todos os metadados e seus detalhes criados podem ser usados ​​pelo Puppet para determinar quais detalhes devem estar presentes no catálogo a ser aplicado.

Criando um fato externo

Na máquina do agente, precisamos criar um diretório conforme mencionado abaixo.

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

Crie um script Shell no diretório com o seguinte conteúdo.

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

Altere a permissão do arquivo de script.

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

Uma vez feito isso, podemos agora ver a variável presente com o par chave / valor.

$ facter hostgroup 
dev 
$ facter environment 
development

Pode-se escrever fatos personalizados no Puppet. Como referência, use o seguinte link do site da Puppet.

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