Con rối - Yếu tố & Sự kiện
Con rối hỗ trợ giữ nhiều giá trị như một biến môi trường. Tính năng này được hỗ trợ trong Puppet bằng cách sử dụngfacter. Trong Puppet, facter là một công cụ độc lập chứa biến mức môi trường. Có thể coi In tương tự như biến env của Bash hoặc Linux. Đôi khi có thể có sự trùng lặp giữa thông tin được lưu trữ trong dữ kiện và biến môi trường của máy. Trong Con rối, cặp khóa-giá trị được gọi là "sự thật". Mỗi tài nguyên có dữ kiện riêng và trong Puppet, người dùng có đòn bẩy để xây dựng dữ kiện tùy chỉnh của riêng họ.
# facter
Facter commandcó thể được sử dụng để liệt kê tất cả các biến môi trường khác nhau và các giá trị liên quan của nó. Bộ sưu tập các dữ kiện này đi kèm với các dữ kiện bên ngoài và được gọi là dữ kiện cốt lõi. Người ta có thể thêm các dữ kiện tùy chỉnh vào bộ sưu tập.
Nếu một người chỉ muốn xem một biến. Nó có thể được thực hiện bằng cách sử dụng lệnh sau.
# facter {Variable Name}
Example
[root@puppetmaster ~]# facter virtual
virtualbox
Lý do tại sao facter lại quan trọng đối với Puppet là vì facter và các dữ kiện có sẵn trong mã Puppet như “global variable”, có nghĩa là nó có thể được sử dụng trong mã tại bất kỳ thời điểm nào mà không cần tham chiếu nào khác.
Ví dụ để kiểm tra
[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",
}
}
Kiểm tra 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
Như chúng ta có thể nhận thấy trong đoạn mã trên, chúng tôi chưa xác định OperatingSystem. Chúng tôi vừa thay thế giá trị bằng giá trị được mã hóa mềm$OperatingSystem như biến bình thường.
Trong Puppet, có ba loại dữ kiện có thể được sử dụng và xác định -
- Sự kiện cốt lõi
- Sự kiện tùy chỉnh
- Sự kiện bên ngoài
Sự kiện cốt lõi được xác định ở cấp cao nhất và tất cả mọi người đều có thể truy cập vào bất kỳ điểm nào trong mã.
Sự kiện về con rối
Ngay trước khi tác nhân yêu cầu một danh mục từ chủ, trước tiên tác nhân phải biên soạn một danh sách đầy đủ thông tin có sẵn trong chính nó dưới dạng một cặp giá trị khóa. Thông tin về tác nhân được thu thập bằng một công cụ có tên là facter và mỗi cặp khóa-giá trị được gọi là một dữ kiện. Sau đây là kết quả chung của các dữ kiện về một đại lý.
[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
Trong đoạn mã trên, chúng ta có thể thấy một số dữ liệu trùng lặp với một số thông tin có sẵn trong biến bash “env”. Puppet trực tiếp không sử dụng dữ liệu, thay vào đó nó sử dụng dữ liệu facter, dữ liệu Facter được coi là biến toàn cục.
Các dữ kiện sau đó có sẵn dưới dạng biến cấp cao nhất và người điều khiển Con rối có thể sử dụng chúng để biên dịch danh mục Con rối cho tác nhân yêu cầu. Các yếu tố được gọi trong tệp kê khai dưới dạng biến bình thường với tiền tố $.
Thí dụ
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"
}
Tệp kê khai ở trên chỉ làm phiền về một tệp duy nhất được gọi là machineOperatingSystem.txt, trong đó nội dung của tệp này được khấu trừ bởi thực tế được gọi là 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
Sự kiện tùy chỉnh
Tất cả những sự thật mà chúng ta đã thấy ở trên đều là những sự thật cốt lõi của máy. Người ta có thể thêm dữ kiện tùy chỉnh này vào nút theo những cách sau:
- Sử dụng cú pháp “export FACTER…”
- Sử dụng cài đặt $ LOAD_PATH
- FACTERLIB
- Pluginsync
Sử dụng cú pháp "export FACTER"
Người ta có thể thêm dữ kiện theo cách thủ công bằng cú pháp export FACTER_ {fact's name}.
Thí dụ
[root@puppetagent1 facter]# export FACTER_tallest_mountain="Everest"
[root@puppetagent1 facter]# facter tallest_mountain Everest
Sử dụng Cài đặt $ LOAD_PATH
Trong Ruby, $ LOAD_PATH tương đương với tham số đặc biệt Bash. Mặc dù nó tương tự như biến bash $ PATH, nhưng trong thực tế, $ LOAD_PATH không phải là một biến môi trường, thay vào đó nó là một biến được xác định trước.
$ LOAD_PATH có từ đồng nghĩa “$:”. Biến này là một mảng để tìm kiếm và tải các giá trị.
[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
Hãy lấy một ví dụ về việc tạo một thừa số thư mục và thêm một .pp tệp và nối một nội dung vào đó.
[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
Thêm nội dung sau vào tệp custom_facts.rb.
[root@puppetagent1 facter]# cat newadded_facts.rb
Facter.add('tallest_mountain') do
setcode "echo Everest"
end
Facter hoạt động theo phương pháp quét qua tất cả các thư mục được liệt kê trong $ LOAD_PATH và tìm kiếm một giám đốc có tên là facter. Khi nó tìm thấy thư mục cụ thể đó, nó sẽ tải chúng ở bất kỳ đâu trong cấu trúc thư mục. Nếu nó tìm thấy thư mục này thì nó sẽ tìm kiếm bất kỳ tệp Ruby nào trong thư mục facter đó và tải tất cả các dữ kiện đã xác định về bất kỳ cấu hình cụ thể nào trong bộ nhớ.
Sử dụng FACTERLIB
Trong Puppet, FACTERLIB hoạt động rất giống với $ LOAD_PATH nhưng chỉ có một điểm khác biệt chính, đó là một tham số môi trường cấp hệ điều hành chứ không phải là một biến đặc biệt của Ruby. Theo mặc định, biến môi trường có thể không được đặt.
[root@puppetagent1 facter]# env | grep "FACTERLIB"
[root@puppetagent1 facter]#
Để kiểm tra FACTERLIB, chúng ta cần thực hiện các bước sau.
Tạo một thư mục có tên test_facts trong cấu trúc sau.
[root@puppetagent1 tmp]# tree /tmp/test_facts/
/tmp/some_facts/
├── vipin
│ └── longest_river.rb
└── testing
└── longest_wall.rb
Thêm nội dung sau vào tệp .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
Sử dụng câu lệnh xuất.
[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
Kiểm tra nhân tố mới.
[root@puppetagent1 /]# facter longest_river
Nile
[root@puppetagent1 /]# facter longest_wall
China Wall
Sự kiện bên ngoài
Dữ kiện bên ngoài rất hữu ích khi người dùng muốn áp dụng một số dữ kiện mới được tạo tại thời điểm cung cấp. Dữ liệu bên ngoài là một trong những cách chính để áp dụng siêu dữ liệu cho máy ảo ở giai đoạn cung cấp (ví dụ: sử dụng vSphere, OpenStack, AWS, v.v.)
Tất cả siêu dữ liệu và các chi tiết của nó được tạo ra có thể được Puppet sử dụng để xác định những chi tiết nào nên có trong danh mục, sẽ được áp dụng.
Tạo sự thật bên ngoài
Trên máy đại lý, chúng ta cần tạo một thư mục như đề cập bên dưới.
$ mkdir -p /etc/facter/facts.d
Tạo một tập lệnh Shell trong thư mục với nội dung sau.
$ 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"
Thay đổi quyền của tệp script.
$ chmod u+x /etc/facter/facts.d/external-facts.sh
Sau khi hoàn tất, bây giờ chúng ta có thể thấy biến hiện diện với cặp khóa / giá trị.
$ facter hostgroup
dev
$ facter environment
development
Người ta có thể viết dữ kiện tùy chỉnh trong Puppet. Để tham khảo, hãy sử dụng liên kết sau từ trang Con rối.
https://docs.puppet.com/facter/latest/fact_overview.html#writing-structured-facts