- 激動人心的改進
- 速度,速度,還是速度
- 穩定性和魯棒性的提升
- 全新的Parser
- “不變"的agent
- 不相容的改動
- 包管理方式的變化
- 配置檔案/目錄的路徑變化
- 其他路徑變化
-
正式啟用Directory Environment
- 不再使用Ruby1.8.7
- 下一代Puppet語言的改動
-
等将被移除Puppet Kick
- HTTP API的變化
-
和puppet doc
被移除tagmail
- Resource Type/Providers的變化
- 内部API和實作的變化
- 被廢棄的特性
- 主要配置參數
- Agent端
- 基礎參數
- 運作相關
- 服務相關
- Server端
- 主要參數
- Server其他配置
- Agent端
- 參考文檔
注:本文同步更新到《深入了解Openstack自動化部署》最佳實踐章節: https://pom.nops.cloud/bestpractice/puppet4.html
Puppet4的第一個正式版本于2015年4月15日釋出,截止到2016年9月22日,Puppet已正式釋出了4.7.0版本。
Puppet4與3.x版本相比有兩點不同:很多的變化,很大的變化。毫不誇張地說Puppet4是一個全新的項目!
Puppet4使用函數式程式設計語言Clojure對Puppet Master進行了重寫,Puppetlabs公司并為此建立了一個項目:puppetserver。此外,PuppetDB也使用Clojure進行了重寫。
如此脫胎換骨的變化,最主要的目的是為了提升性能,官方給出的資料是:
相比Puppet3,Puppet4有2~3倍的性能提升。
這是一個非常吸引人的提升!要知道從Puppet2到Puppet3所帶來約50%的性能提升,就讓我們感動不已了!
在以往的實際生産中,我們遇到過多次來自于master端的性能瓶頸,在一個數千台規模有近百個Openstack叢集規模的環境中,我們使用了多台實體+虛拟伺服器來作為puppet master節點,管理着大量的服務,一旦遇到高并發的編排任務時,master端的CPU幾乎處于100%的狀态,逾時時間設定為120秒的情況下,仍然會出現不少由于編譯catalog逾時而導緻agent報錯的情況。即使我們通過改進代碼,水準擴充,元件拆分,參數調優,更換硬體等多種組合辦法,但是受Puppet本身的語言性能瓶頸,對于Puppetmaster的性能我們并不滿意。而Puppet4從根本上改進了性能問題。
PuppetDB也是主要瓶頸之一,像resource export,virtual resource等進階特性,以及facts,catalog的緩存都會使用到PuppetDB,雖然這些進階特性很炫酷而且也很實用,但是非常非常消耗資源。這使得我們在過去非常地謹慎甚至刻意去削減像Puppet進階特性的使用,這也是PuppetOpenstack社群禁止送出含有這些進階特性的代碼的原因之一(另一個原因是有些進階特性無法再單機模式下使用)。
此外,Puppet4一開始就擁有面向服務的架構:
- 由于Clojure語言的天生優勢,擁有良好的并發和互斥控制能力,而且可以使用豐富的Java Library,是作為後端服務開發的理想選擇。
- Puppetlabs公司開發了一個Clojure架構Trapperkeeper framework:為了支撐長期運作的應用和服務而生,進而保證Puppet服務的穩定性和魯棒性。
- 新的Parser支援lambdas和iteraion!再也不用使用tricky的creates_resources函數了:
$a = [1,2,3] each($a) |$value| { notice $value }
- 全新的parser還直接支援資料類型檢查,再也不用stdlib裡的validate_string等函數了:
class ntp (
Boolean $service_manage = true,
Boolean $autoupdate = false,
String $package_ensure = 'present',
# ...
) {
# ...
}
- 另外一個亮點是直接支援插值式函數調用:
notice "This is a random number: ${fqdn_rand(30)}
- 支援鍊式指派,代碼可以變得更簡潔了:
$a = $b = 10
除了以上幾點,還有其他諸多特性,不再一一舉例。
“不變”的agent
目前,puppet-agent仍然使用Ruby來維護。不過JVM可以支援Ruby的Java版本:JRuby。是以在未來,puppet-agent不排除可能會從JRuby過渡到Clojure。
Puppet4既然做了重寫,是以有大量與Puppet3不相容的變化。這些細節對于Puppet3使用者來說是最關心的地方。
過去,我們需要在伺服器上單獨安裝Puppet,Facter,Hiera,Mcollective等多個元件才能獲得相應的功能和特性。
在Puppet4中,安裝Puppet不再需要安裝多個軟體包,而是采用AIO(All-in-One)的方式來簡化軟體包的管理,例如
puppet-agent
中包含以下元件:
- Facter 3.4.x
- CFacter 0.4
- Hiera 1.3.x
- Mcollective 2.9.x
- Ruby 2.1.5
- OpenSSL 1.0.0r
Puppetlabs将這種AIO的包管理方式稱之為Puppet Collections(PC),每個PC其實對應着一個軟體倉庫(repo),為使用者提供了Facter/Ruby/Puppet等元件的比對矩陣。 下表給出了PC中主要軟體包中整合的元件。
軟體包名 | 包含元件 |
---|---|
| Puppet, Facter, Hiera, MCollective, pxp-agent, root certificates, Ruby, Augeas |
| Puppet Server,依賴 |
| PuppetDB |
| PuppetServer與PuppetDB互動的Plugin |
要在伺服器上啟用新版本的Puppet4,隻需要執行一行簡單的指令:
- 在基于RPM的系統下使用以下指令:
yum localinstall http://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
- 在基于Deb的系統下使用以下指令:
# curl -O http://apt.puppetlabs.com/puppetlabs-release-pc1-wheezy.deb ; dpkg -i puppetlabs-release-pc1-wheezy.deb
通過這種集中式的軟體倉庫管理方式,使用者可以移除過去puppetlabs-release中的production,dependencies,devel等多個倉庫。
注意
puppet-agent
不會自動更新老版本的
puppet
軟體包(建議使用deb或rpm來管理軟體包的更新)
- 軟體包的安裝目錄變更為
/opt/puppetlabs
- 可執行檔案已移動到
/opt/puppetlabs/bin
-
從confdir
變為/etc/puppet/
/etc/puppetlabs/puppet
-
ssldir
$vardir/ssl
$confdir/ssl
- puppetserver的配置檔案放置在
/etc/puppetlabs/puppetserver
- mcollective的配置檔案放置在
/etc/puppetlabs/mcollective
- 所有的module/manifest/data從
移到confdir
codedir
-
預設路徑是codedir
/etc/puppetlabs/code
- 包含
目錄environments
- 包含全局的
目錄(可選)modules
- 包含hiera.yaml配置檔案
-
hieradata
-
-
的puppet agent
已經移動到vardir
/opt/puppetlabs/puppet/cache
-
rundir
/var/run/puppetlabs
Directory Environment
Directory Environment
過去多年的Config File Environment将被正式移除。預設的environmentpath是
$codedir/environments
。
以建立一個
production
環境為例:
- 将modules放置到
$codedir/environments/production/modules
- 将main manifest放置到
$codedir/environments/production/manifests
你仍然可以使用
$codedir/modules
作為全局modules,并用
default_manifest
設定來配置一個全局的
main manifest
由于使用了AIO的包管理方式,Puppet不再使用系統自帶的Ruby解釋器,将直接使用Ruby 2.1.5版本。
重點來了,Puppet4最重要的變化是重寫了parser和evaluator,在Puppet 3.x中可以通過在puppet配置檔案中開啟
Future Parser
來使用,在Puppet4中該parser已經成為”present parser“,那麼過去的parser正式退出舞台。
新parser包含了疊代,變量類型檢查等諸多新特性。并且,新parser對于數值,空字元串和'udenf/nil'比較提供更好的檢查機制。
除了核心子產品的變動以外,還有一些炫酷的特性。
- 在PuppetMaster加載新的Puppet代碼不再需要重新開機server服務
- EPP(Embeded Puppet)将支援直接使用Puppet來編寫inline和基于檔案模,不再需要使用ERB,避免使用者在Puppet和Ruby之間來回切換。
- 支援使用Puppet來編寫functions。
Puppet Kick
Puppet Kick
所有的項目在曆史發展過程中,都會有很多的妥協和不良設計,Puppet項目從2到3很多舊有的特性隻是被标記為廢棄,并沒有從代碼庫中移除,借助Puppet4版本的重構,大約60000行"technical debt"類型的代碼被移除。 較為熟知的有以下:
-
指令puppet kick
-
服務inventory
-
facts terminuscouchDB
-
stored configActiveRecord
- puppet.conf中
sectionmaster
Puppet4中的另一個重要變化是master和agent通訊的URLs發生了變化。是以Puppet3的agent将無法和Puppet4的server端通信。例如:
- 在Puppet3中url是"http://localhost:8140/production/node/foo"
- 在Puppet4中url變成了"http://localhost:8140/puppet/v3/node/foo?environment=production"。
puppet doc
tagmail
puppet doc
tagmail
由于
puppet doc
指令依賴RDoc,而RDoc與最新版本的ruby不相容,是以在Puppet4代碼中被移除,如果要繼續使用,可以通過puppetlabs-strings子產品來提供類似的功能。
同理,
tagmail
被移除,可以通過puppetlabs-tagmail子產品來找到它。
這裡舉幾個重要的變化:
- 在Puppet3中,若使用者沒有設定allow_virtual屬性,會有廢棄的警告資訊,在Puppet4中該警告會被移除,allow_vritual預設會從false變為true。
這些變化隻會影響到Puppet内部ruby方法和庫的調用接口,對終端使用者的使用沒有任何影響。
Rack和WEBrick Web伺服器被廢棄
Rack和WEBrick Web伺服器過去常用于開發和簡單驗證,目前已在Puppet 4.1中标記為棄用,計劃在5.0中移除。
Puppet4有多達200個配置參數,不過使用者需要關心的參數大約為30個。這裡我們隻是簡單介紹
puppet.conf
中的主要參數。
-
: Puppet Master的位址,預設值是server
puppet
-
: Puppet CA的位址,僅在多master模式使用ca_server
-
: Puppet report server的位址,僅在多master模式使用report_server
-
-
:node的證書名稱,預設使用FQDNcertname
-
:agent向master端請求的environment。預設是environment
prodcution
-
: agent僅在模拟運作并輸出運作結果noop
-
: 指定agent運作的nice值,防止agent在應用catalog時占用過多的CPU資源nice
-
: 是否發生report,預設為true。report
-
: 限制Puppet隻運作含有指定tags的resources。tags
-
,trace
profile
,graph
:用于debug agent運作結果show_diff
-
: 在master端無法傳回一個正确的catalog時,是否回退執行上一個正确的catalog。預設是true,如果是開發環境,建議修改為false。usecacheonfailure
-
prerun_command
:在Puppet執行前後運作的指令,若傳回值非0,則Puppet執行失敗。postrun_command
-
: Puppet的運作間隔runinterval
-
: Puppet請求證書簽名的頻率。當agent端第一次啟動時,agent會送出一個CSR(certificate signing request)到ca server,該證書可能是自動簽名(autosign),或者需要人工準許,而這段時間無法預估,是以需要設定一個時間段,預設是2m。waitforcert
-
splay
:為每次Agent的定時執行添加一個随機數時間,用于避免驚群效應的發生。splaylimit
-
:是否以程序方式運作,配合cron使用時,應設定為false。daemonize
-
: 是否執行完成後退出,配合cron使用時,應設定為true。onetime
多數參數對于單機模式運作的Puppet同樣适用。在CS模式下,這些參數應該放置在[master]下;在單機模式下,這些參數應該放置在[main]下。
-
: Puppet Master可以使用的DNS主機名清單(alt表示a list)。agent用到的dns_alt_names
參數值必須和此參數或者server端的server
比對。certname
- 注:該參數僅适用于初始化生成Puppet master證書階段。
-
: master從environment加載資料的緩存時長。設定為0,禁用緩存,為了更好的性能,可以将其設定為environment_timeout
,直到下次重新開機master才會重新加載environment配置。unlimited
-
: environment的查找路徑,預設值:enviromentpath
$codedir/environments
-
: 所有環境的子產品路徑,會被所有的環境使用,預設值是:basemodulepath
$codedir/modules:/opt/puppetlabs/puppet/modules
-
: 選擇處理report的hander,預設值是reports
store
pupept server除了
puppet.conf
之外,還有擁有其他的配置檔案,其預設的配置檔案路徑是:
/etc/puppetlabs/puppetserver/conf.d
。這些配置檔案使用HOCON格式,可以在保留JSON語義格式的前提下,提高可讀性。在conf.d目錄下包含以下配置檔案:
- global.conf
- webserver.conf
- web-routes.conf
- puppetserver.conf
- auth.conf
- master.conf (deprecated)
- ca.conf (deprecated)
例如,常見的幾個參數配置有以下:
-
:授權可以通路admin接口的clientpuppet-admin
-
: 調優JRuby時提供更多細節資訊jruby-puppet
-
: 設定Puppet Server的記憶體配置設定。JAVA_ARGS
- https://docs.puppet.com/puppet/4.0/reference/whered_it_go.html
- https://docs.puppet.com/puppet/4.0/reference/release_notes.html
- https://puppet.com/blog/welcome-to-puppet-collections
- http://www.infoworld.com/article/2687553/devops/puppet-server-drops-ruby-for-clojure.html
- https://docs.puppet.com/puppet/latest/reference/puppet_collections.html
None