2017-02-19 30 views
1

我曾經使用Puppet很多,從0.x到1.0的版本,然後改變了工作,但現在我又回到了它。木偶中的Hiera對我來說是新手(以及其他一些東西)。根據主機名通過Hiera爲節點分配一個類

我正確的理解,根據與Hiera匹配的主機名(或證書名稱)模式將類分配給節點組基本上是不可能的?

例如,如果主機是類似於「ntp1.foo.com」的,我就習慣於分配ntp服務器類。在site.pp中定義直接node的定義非常簡單,我試圖將此概念轉化爲基於Hiera的世界。我有Hiera分配其他類,並希望將所有這些任務合併到一個地方。

我發現這樣做的唯一方法是通過一些非Hiera手段設置參數並在Hiera中使用它的值來匹配路徑。舉例來說,在我的enc腳本我出口的參數是這樣的:

echo "parameters:" 
if [ ... ]; do echo " ntpRole: server; else echo " ntpRole: client"; fi 

和Hiera我會做這樣的事情:

- "roles/ntp-%{ntpRole}" 

我想人們也可以通過自定義其實做到這一點。

這工作,但似乎像一個kludge。有更好的/推薦的選擇嗎?與此

的一個問題是,每一個節點必須有一個值(一切都被分配了一個ntp- 東西類)。這適用於NTP,因爲所有的機器都是NTP客戶端或服務器,但對於存在的東西它不。

例如:一個web服務器角色。有些機器不會是Web服務器,所以我不想包含那個類,但是對於其他類,我並不想在每個節點文件中維護它,並且不想真正想要在任何地方都有空的*-none角色類別(例如web-noneweb-server)。我想要所有名爲www*的機器或基於其他標準來加載roles/web類。這可以與Hiera完成嗎?

+0

我們對此使用外部自定義事實,因此事實將具有該節點屬於哪個角色的邏輯,並且在您的hiera中,可以使用該事實來包含角色類。 – Walid

回答

0

如果您的角色與服務器事實有關係,那麼您可以使用自定義事實來分配角色。既然你說過你以前是根據服務器名進行節點分類的,我會認爲這是你想要的路線。

# custom role fact 
require 'facter' 

Facter.add(:role) do 
    case Facter.value(:hostname) 
    when /ntp/ then 'ntp-server' 
    when /www/ then 'web-server' 
    else abort 'Hostname does not provide a role.' 
    end 
end  

然後,您可以建立一個hiera配置是這樣的:

:hierarchy: 
    - "nodes/%{::trusted.certname}" 
    - role/%{role} 
    - "common" 

內,您的角色數據文件,你可以提供類名的數組:

# role/web-server.yaml 
classes: 
    - web-server 

內,您的主要清單(通常爲$environment/manifest/site.pp

# if no classes array, traverse the else block 
if hiera('classes', false) { 
    hiera_include('classes') 
} 
else { 
    # logic for your 'none' situations since the classes array was not present 
} 

檢查此爲hiera_include信息:https://docs.puppet.com/hiera/3.2/puppet.html#assigning-classes-to-nodes-with-hiera-hierainclude。請注意,它也會合併到您的特定fqdn.yaml數據文件的類中。

這會爲您提供您請求的功能,並使用Hiera按節點分組/主機名包含類。

+0

因此,如果'role'是空的,當它通過層次結構查找類時,Hiera會跳過'role /%{role}'行嗎? – Josh

+0

@Josh從某種意義上說,是的。更準確地說,Hiera會在自定義事實中尋找一個符合你的'else'情況的數據文件,它不會存在,所以層次結構的層次將不提供數據。 –

相關問題