實戰Puppet 集中配置管理系統(1)——認證與資源定義

1.什麼是Puppet? html

       puppet 是一個配置管理工具, 典型的, puppet 是一個 C/S 結構, 固然,這裏的 C 能夠有不少,因此,也能夠說是一個星型結構. 全部的 puppet 客戶端同一個服務器端的 puppet 通信. 每一個puppet 客戶端每半小時(能夠設置)鏈接一次服務器端, 下載最新的配置文件,而且嚴格按照配置文件來配置服務器. 配置完成之後,puppet 客戶端能夠反饋給服務器端一個消息. 若是出錯,也會給服務器端反饋一個消息 node

2.puppet 的細節和原理shell

        puppet 的目的是讓你只集中於你要管理的目標,而忽略實現的細節,例如命令名,參數或者文件格式. puppet 把系統裏面的用戶,軟件包,服務看做是"資源", puppet 的做用就是管理這些資源以及資源之間的相互聯繫.Puppet 採用了很是簡單的 C/S 架構,全部數據的交互都經過 SSL 進行,以保證安全。它的工做流程如圖所示json

wKioL1gV3BeDsHs2AAKD-Zk5CJE766.png

1. 客戶端 Puppetd 向 Master 發起認證請求,或使用帶簽名的證書。vim

2. Master 告訴 Client 你是合法的。3. 客戶端 Puppetd 調用 Facter,Facter 探測出主機的一些變量,例如主機名、內存大小、IP 地址等。Puppetd 將這些信息經過 SSL 鏈接發送到服務器端。安全

4. 服務器端的 Puppet Master 檢測客戶端的主機名,而後找到 manifest 對應的 node 配置,並對該部份內容進行解析。Facter 送過來的信息能夠做爲變量處 理,node 牽涉到的代碼才解析,其餘沒牽涉的代碼不解析。解析分爲幾個階段,首先是語法檢查,若是語法錯誤就報錯;若是語法沒錯,就繼續解析,解析的結 果生成一箇中間的「僞代碼」(catelog),而後把僞代碼發給客戶端。ruby

5. 客戶端接收到「僞代碼」,而且執行。bash

6. 客戶端在執行時判斷有沒有 File 文件,若是有,則向 fileserver 發起請求。服務器

7. 客戶端判斷有沒有配置 Report,若是已配置,則把執行結果發送給服務器。架構

8. 服務器端把客戶端的執行結果寫入日誌,併發送給報告系統。

    http://puppet.wikidot.com 中文 wiki


實驗環境:

    物理主機    redhat7.0 內核版本 3.10.0-123.el7.x86_64

    虛擬機        redhat6.5 內核版本 2.6.32-431.el6.x86_64

  master服務器   server1.example.com       172.25.254.1

  Agent 客戶端    server2.example.com172.25.254.2

  Agent 客戶端    server3.example.com172.25.254.3

  Agent 客戶端    server4.example.com172.25.254.4


1.安裝puppet軟件包

1)在master服務器 server1上安裝puppet-server

     #  yum install -y  puppet-server-3.8.1-1.el6.noarch.rpm  puppet-3.8.1-1.el6.noarch.rpm facter-2.4.4-1.el6.x86_64.rpm hiera-1.3.4-1.el6.noarch.rpm rubygem-json-1.5.5-3.el6.x86_64.rpm ruby-shadow-2.2.0-2.el6.x86_64.rpm ruby-augeas-0.4.1-3.el6.x86_64.rpm rubygems-1.3.7-5.el6.noarch.rpm 

wKioL1gV4MrBs3KcAAA1h-9WKTA102.png

#/etc/init.d/puppetmaster start//啓動puppet-server

wKioL1gV4RHS-UB_AAAVCHgcRkU679.png

wKioL1gV4eeSomptAAA1PSaf_o8122.png

2)在Agent 客戶端 server2/server3/server4上安裝puppet:

    #yum install -y puppet-3.8.1-1.el6.noarch.rpm facter-2.4.4-1.el6.x86_64.rpm hiera-1.3.4-1.el6.noarch.rpm rubygem-json-1.5.5-3.el6.x86_64.rpm ruby-shadow-2.2.0-2.el6.x86_64.rpm  ruby-augeas-0.4.1-3.el6.x86_64.rpm rubygems-1.3.7-5.el6.noarch.rpm 

wKioL1gV4Wvzn8LSAAA2KZpt63E733.png


2.請求與認證(三種方式)

    client 向 master 發出證書驗證請求,而後等待 master 簽名並返回證書。

    2.1 客戶端(server2/server3)發送請求

#puppet agent --server 172.25.254.1 --no-daemonize -vt

  //參數--server 指定了須要鏈接的 puppet master 的名字或是地址,默認鏈接名爲「puppet」的主機

  如要修改默認鏈接主機能夠修改/etc/sysconfig/puppet 文件中的 PUPPET_SERVER=puppet 選項

  參數--no-daemonize 是 puppet 客戶端運行在前臺

  參數--verbose 使客戶端輸出詳細的日誌

wKiom1gV5HngFrxvAAB-qyVZJJk295.png

wKioL1gV5Njxi1TEAAB_g5RC6F8333.png

    2.2. master服務器 server2/server3 簽名認證

# cd /etc/puppet/manifests

    puppet 的第一個執行的代碼是在/etc/puppet/manifest/site.pp,所以這個文件必須存在,並且其餘的代碼也要經過該文件來調用。

# touch site.pp#沒有此文件 puppet master 沒法啓動,配置後面再定義

#puppet cert list//有等待,顯示全部等待簽名的證書

wKioL1gV5TvCSi8fAABBs1E_Z7Y957.png

#puppet cert sign server2.example.com//簽名

如要同時簽名全部證書,執行如下命令:

# puppet cert sign --all

#puppet cert list//就沒有等待了。

wKioL1gV5X2T8PUSAABfXuJEk5M591.png

    2.3 客戶端(server2/server3)再次發送請求

# puppet agent --server server1.example.com  --no-daemonize -vt

wKioL1gV5gqieneoAADBjHD3IUA526.png

wKioL1gV5gmgcDFmAABr3qSKMRo049.pngNotice: Finished catalog run in 0.02 seconds//出現這條信息就行了


3.自動簽名

    3.1 master服務器 server1 修改配置文件

# cd /etc/puppet/

# vim puppet.conf##添加

   2         autosign = true

# vim autosign.conf

   1  *.example.com  

# /etc/init.d/puppetmaster reload

wKiom1gV54mDRr8OAAA2bVTGmyc985.png

    3.2 客戶端(server4)發送認證請求

[root@server4 update]# puppet agent --server server1.example.com --no-daemonize -vt

wKiom1gV6pyht4-DAADofjRSh2s046.png

    3.3 從新認證測試 

        當客戶端從新裝了系統以後或者在實際中有時會修改 client 端的主機名,這樣就須要從新生成證書:

    3.3.1 master服務器 server1 先刪除以前認證的簽名

# puppet cert list --all

wKiom1gV62qT1AdVAACNX7nzZFA981.png

# puppet cert clean server2.example.com//要刪除的原 client 端主機名

wKiom1gV69KC-3sGAAC4Yb0oot4153.png

    3.3.2 客戶端(server2)上:

# cd /var/lib/puppet/ssl/

# rm -rf *    # rpm -qf /var/lib/puppet/ssl,能夠看到ssl目錄是自動生成的,不依賴於任何軟件包

# puppet agent --server server1.example.com --no-daemonize -vt

     ###再次發送請求便可

wKiom1gV7JzSMlQVAAEG3P3BSsk605.png


4.puppet 資源定義

        如下資源均定義在/etc/puppet/manifest/site.pp 文件中,在沒有指定節點的狀況下,對全部已經通過驗證的 client 都生效。

    4.1 文件

    4.1.1 master服務器 server1上:

[root@server1 manifests]# ls

site.pp

[root@server1 manifests]# vim site.pp 

wKiom1gV7f3QAFMbAAATsskM1x0506.png

[root@server1 manifests]# cd /etc/puppet/

[root@server1 puppet]# mkdir files

[root@server1 puppet]# cd files

[root@server1 files]# cp /etc/passwd .

[root@server1 files]# vim /etc/puppet/fileserver.conf

wKioL1gV7peBKZNRAAAQIn8Bh20748.png

[root@server1 files]# /etc/init.d/puppetmaster reload

    4.1.2 在Agent 客戶端 server2和客戶端 server3上

# puppet agent --server server1.example.com --no-daemonize -vt

wKioL1gV72WDczv_AABqfyq8g2I996.png

wKioL1gV72bAOG-mAABoyYsVNm8287.png

[root@server2 ~]# cat /tmp/testfile 

willis.blog.51cto.com[root@server2 ~]# 

[root@server2 ~]# cd /tmp/

wKiom1gWkd-yDqkPAAAgM_U9FYA070.png

//所建立的tmp/testfile默認設置爲md5sum加密,當手動改寫testfile中的內容後,它的md5會改變,當再次執行向puppt-server的請求後,md5又會再次恢復。

wKioL1gWnBugB6egAABK0CtllDA840.png

wKiom1gWnEaDI-lVAAAVa8sZJuw375.png

    4.1.3 服務器server1上:

# vi /etc/puppet/manifests/site.pp

 1 file {

  2         "/tmp/testfile":

  3         source => "puppet:///files/passwd"

  4 }

可再次實驗認證。

    server2上再次測試:

wKioL1gV87XxreF9AAC-ngUCrVs571.png


    4.2軟件包定義

    4.2.1 server2上安裝httpd服務與vsftpd服務

wKiom1gWnhSSQhJXAAAiuTxEVAk801.png

    4.2.2 服務器端server1定義軟件包規則

軟件包定義方法:

1)package {

          "vsftpd":

          ensure => absent

  }

2)package {

        "vsftpd":

        ensure => present;

        "man":

        ensure => present

 }

3)package {

        ["vsftpd","man"]:

        ensure => absent;

}

[root@server1 puppet]# vim manifests/site.pp 

wKiom1gWnleA_LsCAAAZbn3f6Xw672.png

    4.2.3 客戶端server2同步服務器端規則,檢查軟件包安裝狀況

[root@server2 tmp]# puppet agent --server server1.example.com --no-daemonize -vt

wKiom1gWnt_DFHJOAAAgmRpkB2I912.png


    4.3. 服務定義

    4.3.1 server2上啓動httpd服務與vsftpd服務

wKiom1gWy2yyjNx3AABOCu6umhY101.png

    4.3.2 服務器端server1定義服務規則

[root@server1 puppet]# vim manifests/site.pp 

wKioL1gWy5SDS0-LAAAYTb2EW-U857.png

    4.3.3 客戶端server2同步服務器端規則,檢查服務啓動狀況

[root@server2 tmp]# puppet agent --server server1.example.com --no-daemonize -vt

wKioL1gWy_Ow8T1aAAAklVerGxs259.png

    4.3.4 對httpd服務進行全面定義

                服務器端server1定義服務規則以下:

[root@server1 puppet]# vim manifests/site.pp 

file {

        "/var/www/html/index.html":

        content => "willis.blog.51cto.com",

        require => Package["httpd"]

}

file {

        "/etc/httpd/conf/httpd.conf":

        source =>"puppet:///files/httpd.conf",

        require =>Package["httpd"],

        notify =>Service["httpd"]

}

package {

        "httpd":

        ensure => present

}

service {

        "httpd":

        ensure => running,

        require => File["/etc/httpd/conf/httpd.conf"]

}

wKiom1gW-9KCQTZTAAB6S-D2_Z8133.png

    4.3.5客戶端測試

        首先卸載httpd服務,而後獲取

wKioL1gW_FrQmQMPAAAfaajgIRM991.png

[root@server2 tmp]# puppet agent --server server1.example.com --no-daemonize -vt

wKioL1gW_K-SYCd_AAB4s3dM-eo575.png

wKiom1gW_OSSic85AAAn1pyP-iE447.png


    4.4 組定義

group { "willis": gid => 600 }

    

    4.5. 用戶定義

方法一:

user { "willis":

uid => 600,

gid => 600,

home => "/home/willis",

shell => "/bin/bash" ,

password => willis

}

file { "/home/willis":

owner => willis,

group => willis,

mode => 700,

ensure => directory

}

file { "/home/willis/.bash_logout":

source => "/etc/skel/.bash_logout",

owner => willis,group => willis

}

file { "/home/willis/.bash_profile":

source => "/etc/skel/.bash_profile",

owner => willis,

group => willis

}

file { "/home/willis/.bashrc":

source => "/etc/skel/.bashrc",

owner => willis,

group => willis

}

user { "test": uid => 900,

home => "/home/test",

shell => "/bin/bash",

provider => useradd,

managehome => true,

ensure => present

}

exec { "echo westos | passwd --stdin test":

path => "/usr/bin:/usr/sbin:/bin",

onlyif => "id test"

}

wKiom1gXBBShHrV2AADkb8SsGA4282.png

方法二:


user {

 "test": uid => 900,

home => "/home/test",

shell => "/bin/bash",

provider => useradd,

managehome => true,

ensure => present

}

exec { "echo willis | passwd --stdin test":

path => "/usr/bin:/usr/sbin:/bin",

onlyif => "id test"

}


    4.6文件系統掛載

    4.6.1 服務端配置

[root@server1 puppet]# vim manifests/site.pp

file {

        "/public":

        ensure => directory

}

mount {

        "/public":device => "172.25.254.1:/var",

        fstype => "nfs",

        options => "defaults",

        ensure => mounted

}

    自動掛載文件系統,並同步 fstab 文件,若是須要卸載,改成 absent

    4.6.2 服務端nfs配置

[root@server1 puppet]# yum install nfs-utils   -y

[root@server1 puppet]# /etc/init.d/nfs start

[root@server1 puppet]# vim /etc/exports 

  /var*(ro)

[root@server1 puppet]# exportfs -rv

    exporting *:/var

wKiom1gXEBWC0BQ1AACt_ZNiup4294.png


wKioL1gXEBGDrCnRAAB0KvLZtZg552.png


    4.7 crontab 任務

[root@server1 puppet]# vim manifests/site.pp

cron { echo:

command => "/bin/echo `/bin/date` >> /tmp/echo",

user => root,

hour => ['2-4'],

minute => '*/10'

}

# 任務會在 client 上/var/spool/cron 目錄中生成。

wKiom1gXEMCxnCG3AADPde9R6W8497.png

相關文章
相關標籤/搜索