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