於2017.04.21 從新浪博客搬遷過來
----------------------------------------------------------------
其實我們已經連接了一個client就是在啓動客戶端的時候),在第一次連接的時候會agent會發起一個證 驗證的請求並使用一個私鑰來加密連接,puppet使用SSL證書來驗證master和client之間的連接,client向master發起證書請求,然後等待master簽名並返回證書
爲了完成連接,master需要對證書進行簽名:
puppet cert --list 顯示等待簽名的證書
puppet cert --sign client34.puppet.com 對client34發起的證書進行簽名
puppet cert --sign --all 對所有等待簽名的證書進行簽名
可能遇到的問題:
err: Could not retrieve catalog: Could not find default node or by name whit……..
雖然agent現在已經連接到了master,並且已經簽名也驗證了這個會話,但是對於agent來說master上並沒有可用的配置,因此收到這條錯誤提示,爲節點添加上可用配置就可以了;
1. 創建第一個配置
Puppet將包含配置數據的文件稱爲清單,puppet清單由許多組件組成:
資源:獨立的配置項
文件:能發送到agent的真實文件
模版:能夠填充文件的模版文件
節點:用於指定每一個agent的配置
類:資源的容器
定義:資源的組合容器
這些組件由一個包含變量、條件、數組和其他特性的配置語言保證起來的;
擴展site.pp文件
創建第一個agent配置的第一步是定義和擴展stie.pp文件
vim /etc/puppet/manifests/site.pp
import 'nodes.pp'
$puppetserver = 'master.puppet.com'
#import指令告訴puppet載入一個nodes.pp的文件,也可以載入多個文件,import 'nodes/*' 這樣將會載入nodes目錄下所有以.pp擴展名的文件
#$puppetserve 定義一個變量,在這裏puppetserve被賦值指定puppet master,並且能夠在puppet配置中使用;
Agent的配置
首先需要添加一個節點定義
vim /etc/puppet/manifests/nodes.pp
node 'client34.puppet.com' {
include sudo
package { 'vim': ensure => present } #也可以爲一個節點指定單獨的資源
}
include 指令用於指定需要被應用到主機的配置集合,一個節點包含兩種配置集合:
類:資源的容器 模塊:一個高級,可移植的資源容易,包含類、定義及其他一些puppet配置
可以使用多個include指令或者用逗號隔開
include sudo
include sshd
include vim, syslog-ng
創建第一個模塊
每一個模塊都需要一個特定的目錄結構和一個叫做init.pp的文件,這個目錄結構能夠幫助puppet自動載入模塊,模塊路徑可以有puppet.conf中[main]段modulepath配置項設置,默認路徑/etc/puppet/modules/和/var/lib/puppet/modules/
這裏我們創建一個sudo的模塊
創建模塊結構
mkdir -p /etc/puppet/modules/sudo/{ files,manifests, templates}
touch /etc/puppet/modules/sudo/manifests/init.pp
manifests用於存放init.pp文件和其他配置,init.pp文件是模塊的核心,每個模塊必須存在;files目錄存放屬於模塊的一部分文件; templates包含模塊可能會用到的任何模版;
創建sudo模塊的init.pp文件
vim/etc/puppet/modules/sudo/manifests/init.pp
class sudo {
package { sudo:
ensure => present,
}
if $operatingsystem == "Ubuntu" {
package { "sudo-ldap":
ensurce => present,
require => Package["sudo"]
}
}
file { "/etc/sudoers":
owner => "root",
group => "root",
mode => 0440,
source => "puppet://$puppetserver/modules/sudo/etc/sudoers",
require => Package["sudo"],
}
}
Sudo模塊的init.pp文件包含了一個單獨的類,也叫做sudo;類中包含了3個資源:兩個軟件包和一個文件資源;
第一個軟件包資源使用ensure => present 來確保sudo包已經安裝,第二個軟件包資源使用if/else語法作爲安裝sudo-ldap包的條件判斷;還有另外兩種條件判斷語句:case和選擇器語法>
Puppet會檢查每一個連接客戶端的operatingsystem的值,如果$operatingsystem的fact值是Ubuntu,puppet就會安裝sudo-ldap包。
Sudo類中最後一個資源是一個文件資源 File["/etc/sudoers"]用來管理/etc/sudoers文件,前3個屬性指定這個文件的用戶和組、權限;下一個屬性source允許puppet從puppet文件服務器上獲取一個文件並將其發生到客戶端,這個屬性的值就是puppet文件服務器和所需文件的路徑;
Source的下一部分告訴puppet去那裏尋找這個文件,等同於一個網絡共享文件,這文件第一部分是modules,表明文件是存放在一個模塊下的,接下來指定模塊,這裏是sudo,最後指定模塊內的路徑。
Require是一個元參數,元參數require在資源Package["sudo-ldap"]和Package["sudo"]之間創建了一個依賴關係,在這個例子中,給資源加上require元參數就是高速puppet Package["sudo-ldap"]依賴於Package["sudo"],因此Package["sudo"]資源一定會首先被執行。
所有存放在模塊中的文件都位於files目錄下,這可以認爲是模塊文件的共享根,在這個例子中我們將要在files中創建etc目錄和sudoers文件
mkdir -p /etc/puppet/modules/sudo/files/etc/
cp /etc/sudoers /etc/puppet/modules/sudo/files/etc/sudoers
注意在這裏好像得給/etc/puppet/modules/sudo/files/etc/sudoers所有人可讀權限
應用第一個配置
我們再次允許puppet agent來觀察這一點
因爲我這虛擬機中已經存在/etc/sudoers 這個文件,先將其刪除
Rm –rf /etc/soduers
puppet agent --server=master.puppet.com --no-daemonize --verbose –onetime
可以看到在/etc/又有了sudoers這個文件,這就說明我們agent從master應用成功了。
或者可以這樣來測試應用,讓在/tmp下創建一個文件
vim /etc/puppet/manifests/nodes.pp
node 'client34.puppet.com' {
file { "/tmp/agent_test.txt": #這是文件路徑
content => "The Is Puppet Test!!", #這是文件內容
}
}
在客戶端查看效果
至此Puppet 就初步的安裝和測試連接完成了,我也是第一次接觸puppet,目前就安裝和測試成功了,其他功能還待探索,如果有什麼不正確或者更好的方法請指點!