什麼是傀儡,我為什麼要關心
Puppet 是一種配置管理解決方案。使用者描述伺服器或軟體的所需狀態,配置管理實現此狀態。這帶來以下優勢:
- 每次都可以根據需要多次重複配置
- 所有軟體和伺服器的配置都儲存在一箇中央位置。這使得配置的備份和版本控制變得容易實現
- 對所有伺服器的更改將在幾分鐘內傳播到整個基礎架構,而無需直接登入任何計算機
- 一切都用同一種語言描述,使配置新軟體變得容易
- 模組類似於庫,允許合併配置。所有主要軟體包的模組已經存在,使得安裝非常容易
- 伺服器可以在彼此之間共享資訊,從而影響其他伺服器的配置。例如,新伺服器可以自動向負載均衡器和監控解決方案註冊自己
Puppet 使用 Ruby 來描述伺服器的所需狀態,稱為節點。它通過使用稱為資源型別的原語來實現。預設情況下,每隔 30 分鐘,木偶代理就會對木偶伺服器進行身份驗證。然後它傳送一個稱為事實的屬性列表。伺服器檢視事實和名為 manifests 的配置檔案,並編譯節點的所需狀態。然後,它將該配置傳送回節點,代理在該節點上應用它。
為了說明這有多強大,這裡有幾個增加複雜性的例子,展示了木偶可以為你做什麼。
示例:使用者
此示例在節點 myserver 上建立使用者使用者名,並將其新增到組輪。 ** **
node 'myserver' {
user { 'username':
ensure => 'present',
groups => ['wheel'],
}
}
將儲存在 puppet 伺服器上的該檔案是清單。此示例中的資源型別是 user 。每種資源型別都具有可選和必需的屬性。在此示例中,確保是必需的,組是可選的。此特定配置僅適用於 myserver 。你可以通過將配置放在節點定義之外來將配置應用於所有節點。
可以採用幾個資源定義並將它們儲存為模組。模組類似於庫。這些模組可以線上共享,通常每個主要軟體包都可以找到一個。共享模組的官方方式是通過 puppet forge: https : //forge.puppet.com/
示例:Postgres
此示例在節點 myserver 上安裝 postgres 伺服器,並建立一個由 username 標識的資料庫 db ,由 password 標識。它使用 postgresql 模組。 ** **
node 'myserver' {
class { 'postgresql::server': }
postgresql::server::db { 'db':
user => 'username',
password => 'password',
}
}
在這種情況下, postgresql 是一個模組。模組本身負責識別作業系統,下載和安裝程式,然後根據清單進行配置。這是一個基本示例,但該模組允許大量自定義。
請注意,沒有必要知道 SQL 或如何實際安裝 postgres 伺服器來執行此操作。官方模組維護良好,提供健全且安全的基礎配置。
也可以在清單中使用事實。事實就像變數一樣。
示例:使用事實的條件
此示例使用 rsyslog 模組在所有非 Windows 計算機上配置 rsyslog。
if $osfamily != 'windows' {
class { 'rsyslog::client': }
}
$ osfamily 是一個事實。每次木偶代理人執行時都會收集這些事實。請注意,由於此定義位於節點定義之外,因此它將應用於所有節點。但是, rsyslog::client 只會在不執行 Windows 的節點上執行。
由於 puppet 使用 ruby,因此可以在清單中使用控制流和變數等程式設計元素。
通過新增 **PuppetDB,**你可以在多個節點之間共享資訊。這允許一個節點影響不同節點上的配置。經典示例包括負載平衡器或監控解決方案。
示例:使用匯出的資源註冊具有監視功能的主機
此示例在節點上建立匯出的資源,然後在監視伺服器上匯入該資源,將主機新增到監視。它使用的是 Icinga2 木偶模組。
@@icinga2::object::host { $::fqdn:
display_name => $::fqdn,
ipv4_address => $::ipaddress_eth0,
}
node 'icinga2' {
Icinga2::Object::Host <<| |>> { }
}
@@ icinga2 :: object::host 建立一個主機定義物件。這是由執行此程式碼的每個節點建立的。該 @@ 標誌著它作為一個出口資源。通常,節點不會在 puppet 中共享資訊。匯出的資源允許這樣做。
請注意,主機定義中的所有屬性值都是事實。這意味著它們對於執行它的每個節點都是不同的。
最後,匯出的資源由 icinga2 節點匯入。Icinga2 模組負責確保建立和重新載入正確的配置檔案。 **