Puppet поддерживает хранение нескольких значений в качестве переменной среды. Эта функция поддерживается в Puppet с помощью Facter . В Puppet facter — это автономный инструмент, который содержит переменную уровня среды. In можно рассматривать как переменную env в Bash или Linux. Иногда может происходить дублирование информации, хранящейся в фактах, и переменной среды машины. В Puppet пара ключ-значение называется «факт». Каждый ресурс имеет свои собственные факты, и в Puppet у пользователя есть возможности для создания своих собственных пользовательских фактов.
# facter
Команда Facter может использоваться для вывода списка всех переменных среды и связанных с ними значений. Эта коллекция фактов поставляется с готовой информацией и упоминается как основные факты. Можно добавить пользовательские факты в коллекцию.
Если кто-то хочет просмотреть только одну переменную. Это можно сделать с помощью следующей команды.
# facter {Variable Name} Example [root@puppetmaster ~]# facter virtual virtualbox
Причина, по которой facter важен для Puppet, заключается в том, что facter и факты доступны во всем коде Puppet как «глобальная переменная» , что означает, что он может использоваться в коде в любой момент времени без каких-либо других ссылок.
Пример для тестирования
[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", } }
Тестирование Это
[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
Как мы можем заметить в приведенном выше фрагменте кода, мы не определили OperatingSystem . Мы только что заменили значение мягким кодированным значением $ OperatingSystem в качестве обычной переменной.
В Puppet есть три типа фактов, которые можно использовать и определить:
- Основные факты
- Пользовательские факты
- Внешние факты
Основные факты определены на верхнем уровне и доступны всем в любой точке кода.
Кукольные Факты
Непосредственно перед тем, как агент запрашивает каталог у мастера, он сначала составляет полный список информации, доступной сам по себе, в форме пары ключ-значение. Информация об агенте собирается инструментом под названием facter, и каждая пара ключ-значение называется фактом. Ниже приводится общий вывод фактов об агенте.
[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
В приведенном выше коде мы видим, что некоторые данные перекрываются с небольшим количеством информации, доступной в переменной bash «env». Puppet напрямую не использует данные, вместо этого он использует данные Facter, данные Facter обрабатываются как глобальная переменная.
Затем факты доступны как переменные верхнего уровня, и мастер Puppet может использовать их для составления каталога Puppet для запрашивающего агента. Фасеты вызываются в манифесте как обычная переменная с префиксом $.
пример
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" }
Приведенный выше файл манифеста беспокоит только об одном файле с именем machineOperatingSystem.txt , где содержимое этого файла вычитается фактом, называемым 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
Пользовательские факты
Все вышеперечисленные факты, которые мы видели, являются основными фактами машины. Можно добавить эти пользовательские факты в узел следующими способами —
- Использование «экспорта FACTER… Синтаксис»
- Использование настроек $ LOAD_PATH
- FACTERLIB
- Pluginsync
Использование синтаксиса «export FACTER»
Можно вручную добавить факты, используя синтаксис экспорта FACTER_ {имя факта}.
пример
[root@puppetagent1 facter]# export FACTER_tallest_mountain="Everest" [root@puppetagent1 facter]# facter tallest_mountain Everest
Использование настроек $ LOAD_PATH
В Ruby $ LOAD_PATH эквивалентно специальному параметру Bash. Хотя она похожа на переменную bash $ PATH, в действительности $ LOAD_PATH не является переменной окружения, а предопределенной переменной.
$ LOAD_PATH имеет синоним «$:». Эта переменная является массивом для поиска и загрузки значений.
[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
Давайте рассмотрим пример создания директории каталогов, добавления файла .pp и добавления к нему содержимого.
[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
Добавьте следующее содержимое в файл custom_facts.rb.
[root@puppetagent1 facter]# cat newadded_facts.rb Facter.add('tallest_mountain') do setcode "echo Everest" end
Facter работает методом сканирования всех папок, перечисленных в $ LOAD_PATH, и ищет директора с именем facter. Как только он найдет эту конкретную папку, он загрузит их в любом месте структуры папки. Если он находит эту папку, он ищет любой Ruby-файл в этой папке Facter и загружает все определенные факты о любой конкретной конфигурации в память.
Использование FACTERLIB
В Puppet FACTERLIB работает очень похоже на $ LOAD_PATH, но с одним ключевым отличием — это параметр среды уровня ОС, а не специальная переменная Ruby. По умолчанию переменная среды может быть не установлена.
[root@puppetagent1 facter]# env | grep "FACTERLIB" [root@puppetagent1 facter]#
Чтобы протестировать FACTERLIB, нам нужно выполнить следующие шаги.
Создайте папку с именем test_facts в следующей структуре.
[root@puppetagent1 tmp]# tree /tmp/test_facts/ /tmp/some_facts/ ├── vipin │ └── longest_river.rb └── testing └── longest_wall.rb
Добавьте следующее содержимое в файлы .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
Используйте оператор экспорта.
[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
Протестируйте новый фактер.
[root@puppetagent1 /]# facter longest_river Nile [root@puppetagent1 /]# facter longest_wall China Wall
Внешние факты
Внешние факты очень полезны, когда пользователь желает применить некоторые новые факты, созданные во время предоставления. Внешние факты являются одним из ключевых способов применения метаданных к ВМ на этапе ее подготовки (например, с использованием vSphere, OpenStack, AWS и т. Д.)
Все метаданные и созданные ими детали могут использоваться Puppet для определения того, какие детали должны присутствовать в каталоге, который будет применяться.
Создание внешнего факта
На агентском компьютере нам нужно создать каталог, как указано ниже.
$ mkdir -p /etc/facter/facts.d
Создайте сценарий оболочки в каталоге со следующим содержимым.
$ 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"
Измените разрешение файла сценария.
$ chmod u+x /etc/facter/facts.d/external-facts.sh
После этого мы можем видеть переменную, присутствующую в паре ключ / значение.
$ facter hostgroup dev $ facter environment development
Можно написать пользовательские факты в Puppet. В качестве ссылки используйте следующую ссылку с сайта Puppet.
https://docs.puppet.com/facter/latest/fact_overview.html#writing-structured-facts