iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 17
0
DevOps

Ops 的轉職之路 - Puppet 從入門就放棄系列 第 17

Day 17 - 什麼軟體盤點?就用 facter 就好啦!

本系列文資料可參考以下:


今天要講的是 Puppet 的另一個神器 facter,這是內建在 Puppet 裡的一項工具,也是 Puppet 必要的核心工具之一,再談 facter 之前先談談敝公司前陣子才在做 軟體清單盤點 這件事 ...

其實我沒有很驚訝或是覺得很可怕,身為一個 21 年的企業每年都要做的盤點事情應該早就有招了吧 !! 然後細問後才發現每一年都是人工去盤出來的 (靠 ...),很不幸的是我們公司大概有 2000 多台 (應該吧,或不只 ...) ...

這時想到 Puppet 的 facter 其實可以做到這件事情,facter 是 Puppet 用來收集系統資訊使用,除了內建的一些變數以外,你還可以自己寫 facter 或使用外部 facter 來取得你想要的參數,以上面的例子來說就是所有 software version 或是 ... haha !!

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 都會回傳 report 給 Puppet Server,這時如果你有建立 Puppetdb 就會存入 Puppetdb 裡面。

透過 Dashboard 你可以看到被拋回來的資料

puppet-facter-dashboard

或是直接透過 Puppet API 來取得。

結語

但是當時導入 Puppet 大約只有 300 台左右,所以只好認命用 script 掃了好幾天 ... (悲劇)


上一篇
Day 16 - 手把手系列 - 用 templates 來處理檔案內容
下一篇
Day 18 - 手把手系列 - Linux 實戰
系列文
Ops 的轉職之路 - Puppet 從入門就放棄30

尚未有邦友留言

立即登入留言