怎麼使用 Hiera data

什麼是 Hiera

Hiera 是 Puppet 內建的數據查詢系統,如果要管理好 Puppet,Hiera 絕對是不可或缺的項目,Hiera 支援 YAML 和 JSON 的格式編輯。

為什麼使用 Hiera

Hiera 擁有多層架構的特性,你可以為尚未定義的 data 設定一個 default hiera data,後續再給另一個 hiera data。

舉例:

hiera.yaml 是 hiera 預設讀取的檔案。

# hiera.yaml
---
version: 5

defaults:
  datadir: data
  data_hash: yaml_data

hierarchy:
  - name: "Per-node data"
    path: "nodes/%{::trusted.certname}.yaml"

  - name: "Common data"
    path: "common.yaml"

定義 command.yaml 的 ntp_server

# data/command.yaml
profile::base::ntp_server: 'time.stdtime.gov.tw'

但 web.puppet.com 必須修改 ntp_server 的值。

# data/nodes/web.puppet.com.yaml
profile::base::ntp_server: 'time.google.com'

按照上面的範例,common.yaml 和 web.puppet.com.yaml 都擁有 ntp_server,但是依照 hiera 的讀取順序,在 web.puppet.com.yaml 就取到了,所以 common.yaml 的 ntp_server 就被丟掉了。

這是因為在 Hiera 是按照 facts 讀到的 第一個 數據,讀取的順序:

  • data/nodes/web.puppet.com.yaml
  • data/location/portland/ops.yaml
  • data/groups/ops.yaml
  • data/os/RedHat.yaml
  • data/common.yaml

除了 facts 的讀取順序以外,在 Hiera 5 之後還支援了 three layers 的架構:

  • Global ($confdir/hiera.yaml)
  • Environment ($ENVIRONMENT/hiera.yaml)
  • Module ($MODULE/hiera.yaml)

透過這麼多層的 data 設計,就能讓你的 hiera 符合各種環境。

在 Hiera 中處理變數

當你常用 Hiera 在比較複雜的環境,你可能會遇到在不同的變數需要相同的值,或是比較奇怪的符號,Hiera 就支援以下這幾項讓你用來處理這些情境。

用 lookup 來取得其他的 hiera data

lookup 適合讓你用來取得別的 data 後塞入另一個 data 的內容中,例如:

---
php_version: '7.0'
php_package: "php%{lookup('php_version')}"

php_package 的值等於 'php7.0'。

用 alias 直接對應相同的 hiera data

或是直接把變數 alias 到另一個 data

---
original:
  - 'one'
  - 'two'
aliased: "%{alias('original')}"

aliased 的值等於 original

literal 用來處理有 ‘%’ 的 hiera data

由於 hiera 的變數是 '%',但如果你想儲存有 '%' 的值的話預設會被當成變數處理,要跳脫 '%' 就會用上 literal

---
server_name: "%{literal('%')}{SERVER_NAME}"

server_name 的值等於 ${SERVER_NAME}。

用來解釋 facts 的 scope

個人覺得 scope 沒什麼用途,主要是用來解釋 facts 的變數,實際上對 data 沒有特別改變

smtpserver: "mail.%{facts.domain}"
smtpserver: "mail.%{scope('facts.domain')}"

以上兩者的值相同。

results matching ""

    No results matching ""