หุ่น - Facter & Facts

Puppet รองรับการเก็บค่าหลายค่าเป็นตัวแปรสภาพแวดล้อม คุณสมบัตินี้ได้รับการสนับสนุนใน Puppet โดยใช้facter. ใน Puppet facter เป็นเครื่องมือแบบสแตนด์อโลนที่เก็บตัวแปรระดับสภาพแวดล้อม In ถือได้ว่าคล้ายกับตัวแปร env ของ Bash หรือ Linux บางครั้งอาจมีการทับซ้อนกันระหว่างข้อมูลที่จัดเก็บในข้อเท็จจริงและตัวแปรสภาพแวดล้อมของเครื่อง ใน Puppet คู่คีย์ - ค่าเรียกว่า "fact" ทรัพยากรแต่ละอย่างมีข้อเท็จจริงของตัวเองและใน Puppet ผู้ใช้มีประโยชน์ในการสร้างข้อเท็จจริงที่กำหนดเอง

# facter

Facter commandสามารถใช้เพื่อแสดงรายการตัวแปรสภาพแวดล้อมต่างๆและค่าที่เกี่ยวข้อง การรวบรวมข้อเท็จจริงเหล่านี้มาพร้อมกับแฟคเตอร์นอกกรอบและเรียกว่าข้อเท็จจริงหลัก หนึ่งสามารถเพิ่มข้อเท็จจริงที่กำหนดเองลงในคอลเลกชัน

หากต้องการดูเพียงตัวแปรเดียว สามารถทำได้โดยใช้คำสั่งต่อไปนี้

# facter {Variable Name}  

Example 
[root@puppetmaster ~]# facter virtual 
virtualbox

เหตุผลที่ตัวประกอบมีความสำคัญสำหรับ 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 มีข้อเท็จจริงสามประเภทที่สามารถใช้และกำหนดได้ -

  • ข้อเท็จจริงหลัก
  • ข้อมูลที่กำหนดเอง
  • ข้อเท็จจริงภายนอก

ข้อมูลหลักถูกกำหนดไว้ที่ระดับบนสุดและทุกคนสามารถเข้าถึงได้ทุกจุดในโค้ด

ข้อเท็จจริงเกี่ยวกับหุ่น

ก่อนที่เอเจนต์จะร้องขอแค็ตตาล็อกจากมาสเตอร์ก่อนเอเจนต์จะรวบรวมรายการข้อมูลทั้งหมดที่มีอยู่ในตัวเองในรูปแบบของคู่คีย์ค่า ข้อมูลเกี่ยวกับเอเจนต์ถูกรวบรวมโดยเครื่องมือที่เรียกว่าแฟกเตอร์และแต่ละคู่คีย์ - ค่าจะเรียกว่าข้อเท็จจริง ต่อไปนี้เป็นผลลัพธ์ทั่วไปของข้อเท็จจริงเกี่ยวกับตัวแทน

[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 master สามารถใช้เพื่อรวบรวมแค็ตตาล็อก 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_ {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 โดยค่าเริ่มต้นตัวแปรสภาพแวดล้อมอาจไม่ถูกตั้งค่า

[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

ข้อเท็จจริงภายนอก

ข้อเท็จจริงภายนอกมีประโยชน์มากเมื่อผู้ใช้ต้องการใช้ข้อเท็จจริงใหม่บางอย่างที่สร้างขึ้นในเวลาจัดเตรียม ข้อเท็จจริงภายนอกเป็นหนึ่งในวิธีสำคัญในการนำข้อมูลเมตาไปใช้กับ VM ในขั้นตอนการจัดเตรียม (เช่นการใช้ 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