介紹
來自Puppet Labs的Puppet是一種配置管理工具,可幫助系統管理員自動化服務器基礎架構的配置,配置和管理。提前規劃並使用Puppet等配置管理工具可以減少重複基本任務所花費的時間,並有助於確保您的配置在整個基礎架構中保持一致和準確。一旦掌握了使用Puppet和其他自動化工具管理服務器的情況,您將有更多的空閒時間可用於改進設置的其他方面。
Puppet有兩個品種,Puppet Enterprise和開源Puppet。它可以在大多數Linux發行版,各種UNIX平臺和Windows上運行。
在本教程中,我們將介紹如何在CentOS 7上的代理/主設置中安裝開源Puppet 4。在此設置中,運行Puppet Server軟件的Puppet主服務器可用於控制所有其他服務器,或Puppet代理節點。請注意,我們將使用Puppet Server軟件包,而不是Passenger或任何其他運行時環境。
要完成本教程,您需要具備一臺已經設置好可以使用sudo
命令的非root賬號的CentOS服務器,並且已開啓防火牆。沒有服務器的同學可以在這裏購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後再購買服務器。
準備
要學習本教程,您必須擁有對要使用Puppet的所有服務器的root用戶或超級用戶訪問權限。您還需要創建一個新的CentOS 7服務器作爲Puppet主服務器。如果您沒有現有的服務器基礎結構,請按照準備DNS設置教程重新創建示例基礎結構(如下所述)。
在開始安裝Puppet之前,請確保您做好了以下:
- 專用網絡DNS:必須配置正向和反向DNS,並且每個服務器必須具有唯一的主機名。如果未配置DNS,則必須使用
hosts
文件進行名稱解析。我們假設您將使用您的專用網絡在您的基礎架構中進行通信。 - 防火牆打開端口:必須在端口8140上訪問Puppet主機。
基礎結構示例
我們將使用以下基礎結構來演示如何設置Puppet:
主機名 | 角色 | 私人FQDN |
---|---|---|
主機1 | 通用CentOS 7服務器 | host1.nyc3.example.com |
主機2 | 通用CentOS 7服務器 | host2.nyc3.example.com |
NS1 | 主名稱服務器 | ns1.nyc3.example.com |
NS2 | 輔助名稱服務器 | ns2.nyc3.example.com |
puppet代理將安裝在所有這些主機上。這些主機將由其專用網絡接口引用,這些接口映射到DNS中的“.nyc3.example.com”子域。這與準備教程中描述的基礎結構相同:如何在CentOS 7上將BIND配置爲專用網絡DNS服務器。
做好這些準備後,讓我們繼續創建Puppet主服務器!
創建Puppet主服務器
創建一個新的CentOS 7 x64服務器,使用“puppet”作爲其主機名。硬件要求取決於您要管理的代理節點數量; 兩個CPU核心和1 GB內存是管理少數節點的最低要求,但如果您的服務器基礎架構較大,則需要更多資源。Puppet Server默認配置爲使用2 GB的RAM。
主機名 | 角色 | 私人FQDN |
---|---|---|
puppet | Puppet master | puppet.nyc3.example.com |
如果您只是設置DNS並且不確定如何包含新主機,請參閱DNS教程的維護DNS記錄部分。實質上,您需要添加“A”和“PTR”記錄,並允許新主機執行遞歸查詢。此外,請確保配置搜索域,以便服務器可以使用短主機名相互查找。
注意:本教程假設您的Puppet master的主機名是“puppet”。如果您使用其他名稱,則需要與本教程略有不同。具體而言,您必須在Puppet代理節點的配置文件中指定Puppet master的主機名,並且必須在簽署任何代理證書之前重新生成Puppet master的SSL證書。否則,您將收到此錯誤:Error: Could not request certificate: The certificate retrieved from the master does not match the agent's private key.
。
本教程不介紹配置此設置。
安裝NTP
由於它充當代理節點的證書頒發機構,因此Puppet主服務器必須保持準確的系統時間,以避免在頒發代理證書時出現潛在問題 - 如果存在時間差異,證書似乎已過期。我們將使用網絡時間協議(NTP)來實現此目的。
首先,使用此命令查看可用的時區:
timedatectl list-timezones
這將爲您提供服務器可用的時區列表。當您找到適合您的服務器的區域/時區設置時,請使用此命令設置它(替換您首選的區域和時區):
sudo timedatectl set-timezone America/New_York
使用以下命令通過yum安裝NTP:
sudo yum -y install ntp
使用ntpdate
命令執行一次性時間同步:
sudo ntpdate pool.ntp.org
通常的做法是更新NTP配置以使用地理位置更靠近NTP服務器的“池區域”。在Web瀏覽器中,轉到NTP池項目並查找在地理位置上關閉您正在使用的數據中心的池區域。
打開ntp.conf
進行編輯:
sudo vi /etc/ntp.conf
將NTP池項目頁面中的時間服務器添加到文件頂部(將其替換爲您選擇的服務器):
server 0.us.pool.ntp.org server 1.us.pool.ntp.org server 2.us.pool.ntp.org server 3.us.pool.ntp.org
保存並退出。
啓動NTP以添加新的時間服務器:
sudo systemctl restart ntpd
最後,啓用NTP守護程序:
sudo systemctl enable ntpd
現在我們的服務器保持準確的時間,讓我們安裝Puppet Server軟件。
安裝Puppet Server
Puppet Server是在Puppet主服務器上運行的軟件。它是將配置推送到其他服務器的組件,這些服務器將運行Puppet代理軟件。
使用以下命令啓用官方Puppet Labs集合存儲庫:
sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安裝puppetserver
包:
sudo yum -y install puppetserver
Puppet Server現在已安裝在主服務器上,但尚未運行。
配置內存分配(可選)
默認情況下,Puppet Server配置爲使用2 GB的RAM。您應該根據主服務器有多少可用內存以及它將管理多少個代理節點來自定義此設置。
首先,在您喜歡的文本編輯器中打開/etc/sysconfig/puppetserver
。我們將使用編輯器vi
:
sudo vi /etc/sysconfig/puppetserver
然後找到JAVA_ARGS
行,並使用-Xms
和-Xmx
參數來設置內存分配。例如,如果要使用3 GB內存,則該行應如下所示:
JAVA_ARGS="-Xms3g -Xmx3g"
完成後保存並退出。
啓動Puppet Server
現在我們準備用這個命令啓動Puppet Server:
sudo systemctl start puppetserver
接下來,啓用Puppet Server,以便在主服務器啓動時啓動它:
sudo systemctl enable puppetserver
Puppet Server正在運行,但它還沒有管理任何代理節點。讓我們來學習如何安裝和添加Puppet代理吧!
安裝Puppet Agent
Puppet代理軟件必須安裝在Puppet master將管理的任何服務器上。在大多數情況下,這將包括基礎架構中的每個服務器。正如介紹中所提到的,Puppet代理可以在所有主要的Linux發行版,一些UNIX平臺和Windows上運行。由於每個操作系統的安裝略有不同,本教程只介紹CentOS 7服務器上的安裝。
在所有代理服務器上執行這些步驟。
使用以下命令啓用官方Puppet Labs集合存儲庫:
sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安裝puppet-agent
包:
sudo yum -y install puppet-agent
現在已經安裝了Puppet代理,使用以下命令啓動它:
sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
第一次運行Puppet代理時,它會生成SSL證書並向Puppet主服務器發送簽名請求。在Puppet master簽署代理證書後,它將能夠與代理節點通信並對其進行控制。
請記住爲所有Puppet代理節點重複此部分。
注意:如果這是您的第一個Puppet代理,建議您在添加其他代理之前嘗試在Puppet主服務器上籤署證書,該證書將在下一步中介紹。驗證一切正常後,您可以回過頭來自信地添加剩餘的代理節點。
在Puppet Master上籤署證書
Puppet第一次在代理節點上運行時,它會向Puppet主機發送證書籤名請求。在Puppet Server能夠與代理節點通信並控制代理節點之前,它必須簽署該特定代理節點的證書。我們將介紹如何簽名和檢查簽名請求。
列出當前證書請求
在Puppet master上,運行以下命令以列出所有未簽名的證書請求:
sudo /opt/puppetlabs/bin/puppet cert list
如果您只是設置了第一個代理節點,您將看到一個請求。使用代理節點的主機名,它看起來如下所示:
"host1.nyc3.example.com" (SHA256) 15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:DD:B5:1C:33:F7:76:67:F3:F6:23:AE:07:4B:F6:E3:CC:04:11:4C
請注意,它前面沒有+
。這表明它尚未簽署。
簽署請求
要對證書請求進行簽名,請使用puppet cert sign
命令以及要簽名的證書的主機名。例如,要簽署host1.nyc3.example.com
證書,您將使用以下命令:
sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com
您將看到以下輸出,表明證書請求已簽名:
Notice: Signed certificate request for host1.nyc3.example.com Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem'
Puppet master現在可以通信並控制簽名證書所屬的節點。
如果要簽署所有當前請求,請使用--all
選項,如下所示:
sudo /opt/puppetlabs/bin/puppet cert sign --all
撤銷證書
您可能想要從Puppet中刪除主機,或者重建主機然後將其添加回Puppet。在這種情況下,您將需要從Puppet主服務器撤消主機的證書。爲此,您可以使用clean
操作:
sudo /opt/puppetlabs/bin/puppet cert clean hostname
指定主機的關聯證書將從Puppet中刪除。
查看所有簽名請求
如果要查看已簽名和未簽名的所有請求,請運行以下命令:
sudo /opt/puppetlabs/bin/puppet cert list --all
您將看到所有請求的列表。簽名請求前面有一個+
,而未簽名的請求沒有+
。
+ "puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:BB:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:puppet.nyc3.example.com") + "host1.nyc3.example.com" (SHA256) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:FE:24:11:24:54:6A + "host2.nyc3.example.com" (SHA256) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3:93:63:BF:F0:DB:F2:D8:E5:A6:27:10:71:78:DA + "ns2.nyc3.example.com" (SHA256) 58:47:79:8A:56:DD:06:39:52:1F:E3:A0:F0:16:ED:8D:40:17:40:76:C2:F0:4F:F3:0D:F9:B3:64:48:2E:F1:CF
恭喜!您的基礎架構現在已準備好由Puppet管理!
Puppet入門
現在您的基礎架構已設置爲使用Puppet進行管理,我們將向您展示如何使用Puppet執行一些基本任務。
如何收集事實
Puppet使用名爲facter的工具收集有關其每個節點的事實。默認情況下,Facter收集對系統配置有用的信息(例如,OS名稱,主機名,IP地址,SSH密鑰等)。可以添加不屬於默認事實集的自定義事實。
收集的事實在許多情況下都很有用。例如,您可以創建Web服務器配置模板,並自動爲特定虛擬主機填寫適當的IP地址。或者您可以確定您的服務器的分發是“CentOS”,因此您應該運行apache2
服務而不是httpd
。這些是基本的例子,但它們應該讓您瞭解如何使用事實。
要查看代理節點上自動收集的事實列表,請運行以下命令:
/opt/puppetlabs/bin/facter
主要清單文件
Puppet使用特定於域的語言來描述系統配置,這些描述保存到名爲“manifests”的文件中,這些文件具有.pp文件擴展名。默認主清單文件位於/etc/puppetlabs/code/environments/production/manifests/site.pp
上的Puppet主服務器上。我們現在創建一個佔位符文件:
sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp
請注意,主清單現在是空的,因此Puppet不會在代理節點上執行任何配置。
如何執行主要清單
Puppet代理定期檢查Puppet Server(通常每30分鐘一次)。當它檢入時,它將向主機發送關於它自己的事實,並拉出當前目錄 - 由主清單確定的編譯的資源列表及其與代理相關的所需狀態。然後,代理節點將嘗試進行適當的更改以實現其所需的狀態。只要Puppet master正在運行並與代理節點通信,此循環將繼續。
在特定代理節點上立即執行
也可以通過運行以下命令(在相關的代理節點上)手動啓動對特定代理節點的檢查:
/opt/puppetlabs/bin/puppet agent --test
運行此命令會將主清單應用於運行測試的代理。您可能會看到如下輸出:
Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin ... Info: Loading facts Info: Caching catalog for host1 Info: Applying configuration version '1457389302' Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}dd769ec60ea7d4f7146036670c6ac99f' Notice: Applied catalog in 0.04 seconds
此命令對於查看主清單如何立即影響單個服務器非常有用。
一次性清單
puppet apply
命令允許您根據需要執行與主清單無關的清單。它僅將清單應用於您運行apply的節點。這是一個例子:
sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp
如果要在代理節點上測試新清單,或者只想運行清單一次(例如,將代理節點初始化爲所需狀態),則以這種方式運行清單非常有用。
示例清單
您可能還記得,Puppet master上的主要清單文件位於/etc/puppetlabs/code/environments/production/manifests/site.pp
。
在Puppet主服務器上,立即編輯它:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
現在添加以下行來描述文件資源:
file {'/tmp/example-ip': # resource type file and filename ensure => present, # make sure it exists mode => '0644', # file permissions content => "Here is my Public IP Address: ${ipaddress_eth0}.\n", # note the ipaddress_eth0 fact }
現在保存並退出。內聯註釋應該解釋我們正在定義的資源。用簡單的英語,這將確保所有代理節點在/tmp/example-ip
都有一個具有-rw-r--r--
權限的文件,其內容包含節點的公共IP地址。
您可以等到代理自動檢入主服務器,也可以運行puppet agent --test
命令(來自其中一個代理節點)。然後運行以下命令來打印文件:
cat /tmp/example-ip
您應該看到如下所示的輸出(使用該節點的IP地址):
Here is my Public IP Address: 128.131.192.11.
指定節點
如果要爲特定節點定義資源,請在清單中定義一個node
。
在主服務器,編輯site.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
現在添加以下行:
node 'ns1', 'ns2' { # applies to ns1 and ns2 nodes file {'/tmp/dns': # resource type file and filename ensure => present, # make sure it exists mode => '0644', content => "Only DNS servers get this file.\n", } } node default {} # applies to nodes that aren't explicitly defined
保存並退出。
現在Puppet將確保在ns1和ns2上存在一個在/tmp/dns
中的文件。如果您不想等待計劃的Puppet代理程序拉取,則可能需要運行puppet agent --test
命令(來自ns1或ns2)。
請注意,如果您沒有定義資源,Puppet將盡力不要觸摸它。因此,如果從清單中刪除這些資源,Puppet將不會刪除它創建的文件。如果要刪除文件,請更改ensure
爲absent
。
這些示例沒有做任何有用的事情,但它們確實證明了Puppet正常工作。
使用模塊
現在讓我們使用一個模塊。模塊可用於將任務分組在一起。Puppet社區中有許多模塊,您甚至可以編寫自己的模塊。
在Puppet master上,從forgeapi 安裝模塊puppetlabs-apache
:
sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache
警告:請勿在現有Apache設置上使用此模塊。它將清除任何不受Puppet管理的Apache配置。
現在編輯site.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
現在添加以下行以在host2上安裝Apache :
node 'host2' { class { 'apache': } # use apache module apache::vhost { 'example.com': # define vhost resource port => '80', docroot => '/var/www/html' } } # node default {} # uncomment this line if it doesn't already exist in your manifest
保存並退出。現在Puppet下次更新host2時,它將安裝Apache軟件包,並配置名爲“example.com”的虛擬主機,偵聽端口80,以及文檔根目錄/var/www/html
。
在host2上,運行以下命令:
sudo /opt/puppetlabs/bin/puppet agent --test
您應該看到一堆輸出,表明正在安裝Apache。完成後,在Web瀏覽器中打開host2的公共IP地址。您應該看到Apache正在提供的頁面。
恭喜!你使用過你的第一個Puppet模塊!
結論
現在您已經安裝了基本的代理/主Puppet,現在您可以瞭解有關如何使用Puppet管理服務器基礎結構的更多信息。查看以下教程:10分鐘帶你光速入門運維工具之-Puppet
想要了解更多關於在主代理安裝程序中安裝Puppet 4的相關教程,請前往騰訊雲+社區學習更多知識。
參考文獻:《How To Install Puppet 4 in a Master-Agent Setup on CentOS 7》