Puppet-server/agent

Puppet的服務器端內部有一張主機資源清單,每一臺主機有對應的代碼資源。當一臺主機通過http發起請求到master時,master按照清單找到對應的代碼編譯生成catalog後發送給agent,其中master需要監聽在一個套接字上8140端口,agent會運行一個守護進程週期性(30分鐘)的向master發起請求。
master與agent之間的通信是使用加密的http,這就意味着master還得是一個CA,給自己和所有得agent簽發證書。
配置示例:
首先puppet推薦使用主機名來識別master與agent,以後得實際生產中推薦使用DNS這裏我們使用hosts文件來配置。

192.168.31.200 node1.lvqing.com
192.168.31.201 node2.lvqing.com
192.168.31.203 node3.lvqing.com

node1作master,node2與node3作agent,做之前要同步時間
然後master需要作

安裝程序包
facter, puppet, puppet-server 
        
初始化master:
puppet master --no-daemonize --verbose          

站點清單的定義

vim /etc/puppet/manifests/site.pp

node 'node2.lvqing.com'{
        include chrony
}

模式匹配

node /PATTERN/ {
    ...puppet code...
}
            
node /node[0-9]+\.magedu\.com/

還可以定義節點的繼承

節點定義的繼承:
    node NODE inherits PAR_NODE_DEF {
        ...puppet code...
    }

agent向master發起請求

puppet agent --server node1.lvqing.com --no-daemonize -v --noop

Info: Caching catalog for node2.lvqing.com
Info: Applying configuration version '1546050755'
Notice: Finished catalog run in 11.54 seconds

前面只是我們讓master運行在前臺以便直觀的觀察到程序的運行狀態,實際上master只需要直接執行systemctl start puppetmaster.service即可,agent稍微修改下配置文件也直接啓動就行了。難點在於模塊的製作與各資源之間的定義使用。
接下來我們可以直接在agent的配置文件中添加一條指向master的配置即可讓agent以守護進程的方式運行了。

vim /etc/puppet/puppet.conf
添加
server = node1.lvqing.com
啓動
systemctl start puppetagent.service

接下來模擬puppet創建nginx+tomcat實例

模塊創建目錄
mkdir ./{jdk8,tomcat}/{manifests,files,templates,lib,spec,tests} -pv

vim jdk8/manifests/init.pp
class jdk8{
        package{'jdk8}:
                name    => 'java-1.8.0-openjdk-devel'
                ensure  => latest,
        }

        file{'java.sh':
                path    => '/etc/profile.d/java.sh',
                source  => 'puppet:///modules/jdk8/java.sh',
        }
}

vim files/java.sh
export JAVA_HOME=/usr

tomcat的模板

vim modules/tomcat/manifests/init.pp
class tomcat{
       package{"['tomcat','tomcat-admin-webapps']":
                           ensure  => latest
        } ->

        file{'server.xml':
                path    => '/etc/tomcat/server.xml',
                source  => 'puppet:///modules/tomcat/server.xml',
        } ~>

        service{'tomcat':
                ensure  => running,
                enable  => true
        }
}

cp /etc/tomcat/server.xml ./files 
cp modules/* /etc/puppet/modules/ -a

模塊都已經準備好了,接下來我們定義主機清單,給第二個節點安裝tomcat

vim /etc/puppet/manifests/site.pp
添加
node 'node3.lvqing.com'{
        include jdk8
        include tomcat
}

node3修改配置文件或直接運行命令前臺拉取數據
puppet agent --server node1.lvqing.com --no-daemonize -v --debug
可以看到結果:

/Stage[main]/Tomcat/Package[tomcat]/ensure: created
/Stage[main]/Tomcat/Service[tomcat]/ensure: ensure changed 'stopped' to 'running'
Finished catalog run in 12.79 seconds
/Stage[main]/Tomcat/Service[tomcat]/ensure: ensure changed 'stopped' to 'running'

如果puppet管理的主機非常多,我們也可以對清單的配置信息進行模塊化組織,不同的角色放置在不同的目錄中,再在主manifests的site.pp中導入配置

databases.d/
tomcatservers.d/
nodes.d/
可通過多個pp文件分別定義各類站點的清單;而後統一導入site.pp,方法如下:
import 'DIRECTORY_NAME/*.pp

一般的公司都擁有三種環境,開發環境,生成環境和測試環境,puppet只能針對單一的一種環境設置,默認是指Production環境

puppet3.6之後的版本配置多環境的方法

master端:
(1) 配置文件puppet.conf
    [master]
    environmentpath = $confdir/environments
                
(2) 在多環境配置目錄下爲每個環境準備一個子目錄
    ENVIRONMENT_NAME/
    manifests/
        site.pp
    modules/

agent端:
    [agent]
    environment = { production|development | testing }

多環境配置實例:
同一個包三種不同環境下不同的配置

每個環境下必須要有modules和manifests,這樣默認目錄下的modules就沒有用了
mkdir environments/{production,development,testing}/{manifests,modules}

cp modules/chrony/ environments/testing/modules/ -a
cp modules/chrony/ environments/development/modules/ -a
cp modules/chrony/ environments/production/modules/ -a

vim /etc/puppet/puppet.conf #添加
[main]
    environmentpath = $confdir/environments
#這裏的$confdir是指/etc/puppet

對服務的配置進行區分修改
(development)node2修改chrony配置文件添加
server node2.lvqing.com iburst
(testing)node3修改chrony配置文件添加
server node3.lvqing.com iburst

接下來創建各環境下的site.pp
vim /etc/puppet/environments/development/manifests/site.pp
node 'node2.lvqing.com' {
        include chrony
}
vim /etc/puppet/environments/testing/manifests/site.pp
node 'node2.lvqing.com' {
        include chrony
}
這裏包括的類都一樣但因爲node2所處的環境不同,chrony指向的服務器也不同

現在我們有兩種環境,development和testing相同的服務不同的配置,agent根據自己的需求到對應的環境中拉取數據
agent端配置

vim /etc/puppet/puppet.conf
environment = development
注意不加s是讓自己處於某種環境中而不是對變量進行賦值。

額外配置文件:
文件系統:fileserver.conf
認證(URL):auth.conf
對agent請求的資源作認證

當master上定義agent的配置更改了,如何通知給agent呢,agent默認30分鐘訪問master一次。
agent配置文件中需要添加
listen = true
因爲是master主動聯繫agent所以還要在agent的auth.conf文件中添加

path /run
method save
auth any
allow node1.lvqing.com

配置好後需要master使用命令主動通知agent過來拉取配置

puppet kick node2.lvqing.com
結果
Triggering node2.lvqing.com
Getting status
status is success
node2.lvqing.com finished with exit code 0
Finished

利用puppet來進行發佈和回滾
發佈

  • 1、創建一個新的資源目錄,定義file資源將其推送過去
  • 2、用file創建一個符號鏈接指向新的版本
    回滾
  • 1、定義一個資源回滾,將舊的版本推送過去。
  • 2、用file創建一個符號鏈接指向舊的版本
    或者可以寫在模塊裏,平時不使用,一但出現問題手動include模塊,符號鏈接指向老的版本

改完以後就使用kick將文件推到agent上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章