꼭두각시-사실 및 사실
Puppet은 여러 값을 환경 변수로 유지하는 것을 지원합니다. 이 기능은 다음을 사용하여 Puppet에서 지원됩니다.facter. Puppet에서 facter는 환경 수준 변수를 보유하는 독립형 도구입니다. In은 Bash 또는 Linux의 env 변수와 유사하다고 간주 할 수 있습니다. 때로는 사실에 저장된 정보와 기계의 환경 변수가 겹칠 수 있습니다. Puppet에서는 키-값 쌍을 "팩트"라고합니다. 각 리소스에는 자체 팩트가 있으며 Puppet에서는 사용자가 자신 만의 맞춤형 팩트를 구축 할 수 있습니다.
# facter
Facter command다른 모든 환경 변수 및 관련 값을 나열하는 데 사용할 수 있습니다. 이러한 팩트 모음은 팩터에서 기본적으로 제공되며 핵심 팩트라고합니다. 컬렉션에 커스텀 팩트를 추가 할 수 있습니다.
하나의 변수 만보고 싶은 경우. 다음 명령을 사용하여 수행 할 수 있습니다.
# facter {Variable Name}
Example
[root@puppetmaster ~]# facter virtual
virtualbox
Puppet에서 facter가 중요한 이유는 Puppet 코드 전체에서 다음과 같이 사실과 사실을 사용할 수 있기 때문입니다. “global variable”즉, 다른 참조없이 언제든지 코드에서 사용할 수 있습니다.
테스트 할 예
[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 데이터는 전역 변수로 처리됩니다.
그런 다음 팩트를 최상위 변수로 사용할 수 있으며 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
맞춤 정보
우리가 본 모든 사실은 기계의 핵심 사실입니다. 다음과 같은 방법으로이 사용자 지정 사실을 노드에 추가 할 수 있습니다.
- "export FACTER… 구문"사용
- $ LOAD_PATH 설정 사용
- FACTERLIB
- Pluginsync
"export FACTER"구문 사용
export FACTER_ {fact 's name} 구문을 사용하여 수동으로 사실을 추가 할 수 있습니다.
예
[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 파일을 찾고 메모리의 특정 구성에 대해 정의 된 모든 팩트를로드합니다.
FACTERLIB 사용
Puppet에서 FACTERLIB는 $ LOAD_PATH와 매우 유사하게 작동하지만 한 가지 중요한 차이점은 Ruby 특수 변수가 아닌 OS 수준 환경 매개 변수입니다. 기본적으로 환경 변수는 설정되지 않을 수 있습니다.
[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
export 문을 사용하십시오.
[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 등 사용)에서 VM에 메타 데이터를 적용하는 주요 방법 중 하나입니다.
생성 된 모든 메타 데이터 및 세부 정보는 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