master端收到之後首先(classify)分類識別來請求的是哪個客戶端和這個客戶端要哪些東西,因而master端就在本地根據定義的站點清單給這個agent端聲明哪些類。前端
Ps:每個agent端必須向master端明確的發送本身的nodename。node
https通信的構建過程:客戶端發請求服務端把證書扔給客戶端,客戶端驗證這個這個證書。而在puppet中 是雙向認證的,master要驗證agent端的證書,agent還要驗證master端的證書。也就意味着agent端發請求會把本身的證書扔給master端的,master要根據agent本身聲明的名字和agent本身發過來的證書來驗證兩者之間是否一致的,若是能保持一致,那麼咱們就認爲這是經過的,更重要的是master端還保存着ca證書,所以它還要使用ca去驗證此證書各個方面的有效性,這一切都經過了,雙方纔能夠創建基於ssl通訊會話的。這裏面的通訊過程agent要發送本身的節點名,而agent向master請求時儘可能使用master的節點名稱而不要使用ip地址。所以在咱們的puppet工做環境中,DNS服務相當重要。每個節點都必需要有一個儘量惟一的名字。經過dns服務可以解析,並且能彼此之間經過解析後可以互相通訊才能夠.mysql
ssl xmlrpc, https
8140/tcp
master : puppet , puppet-server, facter
agent : puppet facter
服務端啓動puppet-server ,監聽端口8140
agent端啓動puppet, 不監聽端口,每隔固定時間向master端請求本身相關的catelognginx
master端安裝:web
sudo yum install puppet-server puppet facter
安裝master必備的兩個包,puppet 和puppet-server,若是本機也須要請求catelog那就須要安裝facter,這裏咱們想讓master同時也作agent端,因此上面yum安裝了 這三個包。正則表達式
查看puppet-server安裝包sql
$ rpm -ql puppet-server-3.6.2-3.el7.noarch /etc/puppet/fileserver.conf /etc/puppet/manifests /usr/lib/systemd/system/puppetmaster.service /usr/share/man/man8/puppet-kick.8.gz /usr/share/man/man8/puppet-master.8.gz /usr/share/man/man8/puppet-queue.8.gz
從安裝路能夠看出:puppet-server並無什麼可執行文件,只有幾個目錄、文件以及使用手冊。這就說明master的執行程序也是puppet提供的子命令。
這裏簡單說明下:centos
fileserver.conf是提供fileserver功能的配置文件 /etc/puppet/manifests 目錄是存放站點清單的目錄
安裝puppet-server以後,就可使用puppet-server的功能了。服務器
puppet的配置文件
查看配置文件目錄:restful
$ ls /etc/puppet/ auth.conf fileserver.conf manifests modules puppet.conf
主配置文件 puppet.conf ,是init的配置文件類型,像mysql服務的配置文件,一個配置文件同時有mysqlclient和mysqld的配置項,咱們來看看默認配置文件內容:
$ cat /etc/puppet/puppet.conf [main] # The Puppet log directory. # The default value is '$vardir/log'. logdir = /var/log/puppet # Where Puppet PID files are kept. # The default value is '$vardir/run'. rundir = /var/run/puppet # Where SSL certificates are kept. # The default value is '$confdir/ssl'. ssldir = $vardir/ssl [agent] # The file in which puppetd stores a list of the classes # associated with the retrieved configuratiion. Can be loaded in # the separate ``puppet`` executable using the ``--loadclasses`` # option. # The default value is '$confdir/classes.txt'. classfile = $vardir/classes.txt # Where puppetd caches the local configuration. An # extension indicating the cache format is added automatically. # The default value is '$confdir/localconfig'. localconfig = $vardir/localconfig
咱們看配置文件中並無puppet-server的配置內容,能夠用puppet config命令對配置文件進行操做
[main] 表示agent和master均可以使用的配置
[agent] agent進程的配置
puppet config 命令使用
查看命令幫助
$ puppet help config ... ACTIONS: print Examine Puppet's current settings. set Set Puppet's settings. See 'puppet man config' or 'man puppet-config' for full help.
可使用print查看當前puppet的配置(包括master, agent, main)
$ puppet config print confdir = /home/ops-manager/.puppet vardir = /home/ops-manager/.puppet/var name = config logdir = /home/ops-manager/.puppet/var/log log_level = notice disable_warnings = [] priority = trace = false profile = false autoflush = true ... 下面有不少配置項,就不貼出來了
可使用set 來單獨設置某一個配置項
經過 puppet print列出的配置項都是默認的配置項。但展現出來的並無說明某一個配置項的含義。並且也不知道哪些配置是master端的,哪些是agent端的。這個print也只能用於管理員確認某一個配置項時使用。那麼咱們想看配置文件說明怎麼辦? -- 用puppet doc 子命令,doc自命令分段、分類介紹。可使用puppet doc --list查看分爲哪幾個段,如:
$ puppet doc --list configuration - A reference for all settings function - All functions available in the parser indirection - Indirection types and their terminus classes metaparameter - All Puppet metaparameters and all their details providers - Which providers are valid for this machine report - All available transaction reports type - All Puppet resource types and all their details
使用puppet doc --reference configuration 能夠查看配置文件相關的文檔
# Configuration Reference **This page is autogenerated; any changes will get overwritten** *(last generated on 2018-03-27 05:38:24 +0000)* ## Configuration Settings * Each of these settings can be specified in `puppet.conf` or on the command line. * When using boolean settings on the command line, use `--setting` and `--no-setting` instead of `--setting (true|false)`. * Settings can be interpolated as `$variables` in other settings; `$environment` is special, in that puppet master will interpolate each agent node's environment instead of its own. * Multiple values should be specified as comma-separated lists; multiple directories should be separated with the system path separator (usually a colon). ... 一樣是一堆內容,能夠做爲往後查找手冊
puppet config print命令 和puppet doc --reference configuration命令內容都不太適合剛入手查看。
有更適合新手的查看方法:
puppet master --genconfig 顯示master的相關配置 puppet agent --genconfig 顯示agent的相關配置
使用上面兩個命令能夠幫助咱們瞭解master、agent端的默認配置項。若是我想改這些默認配置項,能夠把內容放到puppet.conf文件中,但要注意的是,puppet master --genconfig 和 puppet agent --genconfig命令都是經過調用puppet.conf文件進行顯示的,因此你千萬不能直接就把puppet.conf文件給覆蓋了,這樣會有很大問題的。正確的作法都是先將顯示的內容輸出到一個新建的文件中,而後在不puppet.conf 重命名爲puppet.conf_default,在把那個新文件命名爲puppet.conf。
puppet master --genconfig > puppet_new.conf puppet agent --genconfig >> puppet_new.conf注意: (1) 生產新的配置以前不能刪除或移動原有的puppet.conf; (2) 生成的配置中,有的參數已經被廢棄,與現有puppet版本不兼容,所以還需進行手動排查。
(3) 有的參數的默認值與如今的版本所支持值可能不相兼容。
所以若是咱們本身不想麻煩的話,最好不要本身手動生成配置文件,只要修改部分想修改的相關項便可。
puppet配置文件的組成部分:
[main] [master] [agent]
運行puppet master puppet agent
puppet master/agent各節點是強依賴主機名的,因此在啓動meter/agent工做模式時,要確保各節點之間能夠經過FQDN徹底限定名可以互相解析。
以服務方式啓動命令 : puppet master
建議第一次啓動,使用參數讓master在前端運行:
puppet master --no-daemonize -v -v 表示工做在詳細模式 --no-daemonize 不工做在守護模式下 -d 調試信息模式,可能會有一些干擾信息,咱們這裏就不使用它。
如下是運行結果
若是咱們看到上面的信息,沒有什麼錯誤信息的話,其實咱們就能夠直接把puppet master服務啓動了,不用進行更改配置了。即便用它的默認配置就能夠工做起來。同時咱們能夠看到默認證書存放的位置/var/lib/puppet/ssl。
若是此次生成的內容不想要了,如何作的呢?
只要刪除剛剛生成的證書目錄便可:
rm -rf /var/lib/puppet/ssl/*
而後再次運行puppet master --no-daemonize -v 重新生成一遍。若是沒有問題就能夠啓動在後臺。在centos7上有專門的unit file,如:
# ls /usr/lib/systemd/system/puppet puppetagent.service puppetmaster.service puppet.service
這裏puppetagent.service 是鏈接到 puppet.service 都是啓動puppet agent的
puppetmaster.service 是啓動 puppet master的
[root@ops ssl]# systemctl start puppetmaster.service 使用ss -tnl查看端口
接着咱們就要安裝 、 配置agent端
安裝就簡單了
sudo yum install epel-realese sudo yum install agent facter
配置文件是 /etc/puppet/puppet.conf 中的 [agent] 段
默認配置文件中內容很少,咱們想首先 配置的應該是指明master端的 FQDN徹底限定名
若是咱們不在配置文件中指定,也可使用puppet agent命令指定
puppet agent --server puppet-master.my.com
注意若是命令執行了,agent端會自動生成一個ssl私鑰,並生成一個證書籤署請求然後發送給master端,並等待master端給它作簽署,在簽署完成以前雙方是不能夠進行通訊的。所以咱們第一次作的時候,對於agent端而言 仍是同樣 咱們先作測試,看能不能正常經過。命令以下:
puppet agent --server ops-zabbix.blockshine.com --noop --test -v --no-daemonize -v 顯示 --noop 表示dry run ,預演的意思 --test 表示測試
輸出結果如圖:
接下來把--noop 和 --test 選項去掉
執行後界面卡住以下:
簽署證書
打開master端,使用puppet help cert命令查看幫助
puppet cert <action> [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose] [--digest <digest>] [<host>] Action list 查看全部待簽署證書 sign 簽署證書 puppet cert list 顯示未簽發的 puppet cert list --all 顯示已經簽發和未簽發的 puppet sign 節點 簽發指定節點 puppet sign --all 簽發全部
上面顯示已經完成了爲節點簽署證書,客戶端再次啓動就顯示以下:
在master端:
(1)安裝全部要用到的模塊:
puppet module install 自建
(2)定義site manifest:
/etc/puppet/manifests/site.pp node 'NODE_NAME' { ... puppet code ... } 例如: node 'node3.my.com'{ include nginx::proxy } include直接跟類名,由於模塊中的類能夠全局進行直接調用的
當完成以上配置,而且運行master/agent後,agent每隔30分鐘會想master端索取catelog,但有時候要馬上執行,那麼能夠在master端進行推送,推送命令稍後說。
其實到這一步驟,基本上就夠咱們使用了,接下來就是一些比較好的實例用法。
站點清單高級定義方式
site.pp定義節點的方式:
(1) 以主機名直接給出其相關定義:
node 'NODE_NAME' { 節點變量$web_port = 8088 ... puppet code ... } (2) 把功能相近的主機事先按統一格式命名,按統一格式調用: node /^web\d+\.my\.com/ { ... puppet code ... } (3) 假如公司維護的節點有上千個,主機命名要依照 命名規範 進行命名 假如如今全部節點都須要進行ntp 時間同步,那麼有沒有比較方便的定義方法?這就是定義基節點,然後每個節點去繼承基節點。 node basenode { include ntp } node web.my.com inherits basenode { include nginx::proxy } 當某一模塊被多數主機所共用時,能夠經過定義基節點的方式,讓其餘節點經過繼承的方式獲取這個公共配置。 (4)無論怎麼講,咱們把上千個節點的配置放在site.pp文件中,也顯得臃腫,不方便查找。能夠經過對節點配置進行分段管理。 /etc/puppet/manifests/ site.pp import "webservers/*.pp" webservers/ unicom.pp telecom.pp cacheservers/ appservers/ (5) 模塊當中,若是manifest/init.pp 下要定義的類太多的話,也能夠採用分段切割,放在多個文件中,可是在init.pp中要把他們給import 進來,道理和節點分段管理同樣的。
角色-運營商-機房名-IP.管理域名
web1-unicom-sh-1.1.1.1.magedu.com
依賴於主機名稱互相通訊
DNS
主機名命令規範:
角色-運營商-機房名-IP.管理域名
web1-unicom-sh-1.1.1.1.magedu.com
定義節點:
node 'NODE_NAME' { 變量 聲明類 } 定義在站點清單:/etc/puppet/manifests/site.pp
節點名稱定義亦能夠繼承:
node basenode { $dbport = 3306 include baseserver } node "node2.magedu.com" inherits basenode { include nginx } node "node3.magedu.com" inherits basenode { $dbport = 3307 include mysql } 目的:爲全部節點應用相同的全局變量,以及完成節點的初始化; 節點定義方式: 一、每節點單獨定義; 二、在節點名稱中使用正則表達式; node "/node[0-9]+\.magedu\.com/" { }
puppet進程的配置文件:puppet.conf
生成配置:puppet master --genconfig > /etc/puppet/puppet.conf
puppet agent --genconfig >> /etc/puppet/puppet.conf
[main], [master], [agent] 瞭解配置文件路徑:puppet doc --configprint confdir
master端而言:/etc/puppet/manifests/site.pp
站點清單
認證配置文件:auth.conf 應用於puppet的restful風格的API的訪問受權; 名稱空間訪問認證配置文件:namespaceauth.conf [puppetmaster] allow *.magedu.com autosign.conf
配置puppet master支持多種不一樣的環境:
puppet.conf [master] environment = development, testing, production [development] manifests = /etc/puppet/manifests/development/site.pp modulepath = /etc/puppet/modules/development/:/usr/share/modules/development fileserverconfig = /etc/puppet/fileserver.conf.development [testing] manifests = /etc/puppet/manifests/testing/site.pp modulepath = /etc/puppet/modules/testing/:/usr/share/modules/testing fileserverconfig = /etc/puppet/fileserver.conf.testing [production] manifests = /etc/puppet/manifests/production/site.pp modulepath = /etc/puppet/modules/production/:/usr/share/modules/production fileserverconfig = /etc/puppet/fileserver.conf.production puppet agent: [agent] environment = development
模塊管理:
Puppet Forge: puppet維護模塊倉庫,大部分由第三方做者提供
puppet module list search install
Puppet kick機制:
緊急推送配置時使用。
puppet架構擴展:
單臺master節點可能會出現瓶頸之處:
認證功能 文件服務 網絡 解決思路:單機擴展 Nginx+Mongrel Apache+Passenger Nginx+Passenger 解決思路:多機擴展
mcollective
Foreman