Puppet 的另一個神器 facter
,這是內建在 Puppet 裡的一項工具,也是 Puppet 必要的核心工具之一。
facter
是 Puppet 用來收集系統資訊使用,除了內建的一些變數以外,你還可以自己寫 facter 或使用外部 facter
facter command line
先講簡單的 cli 工具,只要你有裝 Puppet agent,那麼你已經有 facter
可以用,沒意外會在 /opt/puppetlabs/bin/facter
這邊找到 softlink 的 facter。
直接跑 facter 會出現內建的 variable
$ facter
aio_agent_version => 1.10.1
augeas => {
version => "1.4.0"
}
dmi => {
product => {
name => "MacBookPro13,2"
...
會看到一堆系統參數,但是要怎樣取得有用的參數 ?,以 IP 為例
$ facter networking.ip
10.0.0.101
或是目前的 OS 訊息。
$ facter os
{
architecture => "x86_64",
family => "Darwin",
hardware => "x86_64",
macosx => {
build => "17C88",
product => "Mac OS X",
version => {
full => "10.13.2",
major => "10.13",
minor => "2"
}
},
name => "Darwin",
release => {
full => "17.3.0",
major => "17",
minor => "3"
}
}
除了這些以外可以直接看 Core Facts 更多內建 facter
如果你有 custom facter
也可以 include dir 用 --custom-dir
指定位置,一般會在 /opt/puppetlabs/puppet/cache/lib/facter/*.rb
這邊。
或是直接利用 FACTERLIB
這個變數來 include custom-dir
$ export FACTERLIB=/opt/puppetlabs/puppet/cache/lib/facter
自己寫 facter 來收集資料
除了內建的 facter 以外,還可以自己寫 facter 來抓資料,你可以寫在 module plugin 內。
/etc/puppetlabs/code/modules/<module_name>/lib/facter/*.rb
範例
簡單用個範例來取 resolv.conf 裡的 name server。
#!/usr/bin/env ruby
# /etc/puppetlabs/code/modules/profile/lib/facter/name_server.rb
Facter.add(:nameserver) do
setcode do
# Find all the nameserver values in /etc/resolv.conf
nameserver_data = Facter::Core::Execution.exec('/bin/cat /etc/resolv.conf | grep nameserver | awk \'{print $2}\'')
nameserver = nameserver_data.split(" ")
end
end
利用 Facter.add
的方式加入新的 facter,這邊是直接用 exec 來跑 shell 取參數,很方便。更多範例
寫了 facter 然後呢 ?
當 facter 成功被 deploy 到 Node 之後,在每次的 deploy,Agent 都會回穿 facter 給 Puppet Server,這時如果你有建立 Puppetdb 就會存入 Puppetdb 裡面。
透過 Dashboard 你可以看到被拋回來的資料
或是直接透過 Puppet API 來取得。