puppet

Puppet是一種Linux、Unix平臺的集中配置管理系統使用ruby語言可管理配置文件用戶、cron任務軟件包系統服務等。Puppet把這些系統實體稱之爲資源,Puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係


puppet是一個IT基礎設施自動化管理工具它能夠幫助系統管理員管理基礎設施的整個生命週期供應(provisioning)、配置(configuration)、聯動(orchestration)及報告(reporting)。

基於puppet ,可實現自動化重複任務快速部署關鍵性應用以及在本地或雲端完成主動管理變更和快速擴展架構規模等

遵循GPL 協議(2.7.0-), 基於ruby語言開發

2.7.0 以後使用(Apache 2.0 license)

對於系統管理員是抽象的只依賴於rubyfacter

能管理多達40 多種資源例如fileusergrouphostpackageservicecronexecyum repo


puppet採用C/S星狀的結構所有的客戶端和一個或幾個服務器交互每個客戶端週期的默認半個小時向服務器發送請求獲得其最新的配置信息保證和該配置信息同步每個puppet客戶端每半小時(可以設置)連接一次服務器端, 下載最新的配置文件,並且嚴格按照配置文件來配置客戶端. 配置完成以後,puppet客戶端可以反饋給服務器端一個消息. 如果出錯,也會給服務器端反饋一個消息.

image.png

Puppet工作流程

image.png


使用模型

       puppet的使用模型分爲單機使用模型和master/agent模型



單機使用模型

  實現定義多個manifests --> complier --> catalog --> apply

image.png

master/agent模型

  master/agent模型實現的是集中式管理 agent 端週期性向 master 端發起請求請求自己需要的數據然後在自己的機器上運行並將結果返回給 master

image.png

從上面的圖我們可以看到,Master接收到Agent的請求後會查找自己的Manifests及相關的配置並找到請求節點相關的內容然後編譯成Catalog,發回給Agent執行


這個過程大概有這樣幾個步驟

1. Master加載配置文件

2. 查找節點定義查看節點中聲明的資源和類

3. 查找到這些資源和類編譯生成Catalog

 

 

puppet 名詞解釋

 

    資源puppet的核心通過資源申報定義在資源清單中相當於ansible中的模塊只是抽象的更加徹底

    一組資源清單

    模塊包含多個類相當於ansible中的角色

    站點清單以主機爲核心應用哪些模塊

 


操作篇:

 操作環境:

   


192.168.80.181


master.czm.com

ruby ruby-libs ruby-shadow

 puppet puppet-server facter

ntp

192.168.80.182client01.czm.com puppet    ntp
192.168.80.183client02.czm.com puppet      ntp

注:三臺主機均爲NAT模式

修改主機名:

  hostnamectl set-hostname   主機名

  exit  登出

  重連即可



master:

搭建

systemctl stop firewalld && setenforce 0 //關閉防火牆及selinux

釋放網絡倉庫    重啓網卡使主機可以ping通外網ip  

vi /etc/hosts

image.png

scp 發送給其他兩臺主機


yum install ntp -y  //時間同步

ntpdate time1.aliyun.com   //同步阿里雲網絡時間


yum install -y epel-release   //安裝網絡源

yum -y install ruby ruby-libs ruby-shadow  

yum -y  install puppet puppet-server facter


vi /etc/puppet/puppet.conf //[main]下新增

  modulepath = /etc/puppet/modules:/usr/share/puppet/modules


systemctl start puppetmaster

systemctl enable puppetmaster    //啓動服務以及開機自啓


netstat -anpt | grep 8140

image.png


client:(01和02搭建的環境基本一致)

關閉防火牆以及selinux      ntp同步網絡時間     安裝epel源

yum install -y puppet

注:

其中主配置文件爲/etc/puppet/puppet.conf,使用的主程序爲/usr/bin/puppet。

 

可以使用puppet describe來打印有關Puppet資源類型,提供者和元參數的幫助。使用語法如下:

 

puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]

-l:列出所有資源類型;

-s:顯示指定類型的簡要幫助信息;

-m:顯示指定類型的元參數,一般與-s一同使用;

 

例子:

puppet describe  -l -s -m


vi /etc/puppet/puppet.conf  //[agent]下添加末尾添加

image.png

定義主服務器name



service puppet start

systemctl enable puppet

ps aux | grep pupp

image.png


——————————申請與註冊————————————


 

client上操作--接着在服務器上授權

 

client申請註冊

puppet agent --server=master.czm.com --no-daemonize --verbose --debug

 

master

puppet cert --list //查看申請的客戶端

image.png

 

puppet cert sign --all

 //將未註冊的客戶端進行註冊

ll /var/lib/puppet/ssl/ca/signed/  //查看已經註冊的客戶端

image.png

 

認證報錯後

find /var/lib/puppet -type f -print0 |xargs -0r rm  //刪除認證ssl

將刪除語句執行在了master主機上客戶端連接報以下錯

重啓puppetmaster即可

 

到此申請完成


配置實例

案例描述

爲了保護linux的ssh端口,批量修改客戶端sshd端口,將22端口修改爲9922,並實現重啓工作。


注:配置文件內要注意格式  結尾不能多加空格行

1、創建必要的目錄

master

mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}

//創建ssh模塊模塊下面有三個文件:manifests、templatesfiles  

 

 

mkdir /etc/puppet/manifests/nodes   //創建節點目錄

mkdir /etc/puppet/modules/ssh/files/ssh   //創建ssh模塊目錄

chown -R puppet /etc/puppet/modules/

 

 

ll /etc/puppet/modules/ssh/

 

 

2、創建模塊配置文件install.pp

vi /etc/puppet/modules/ssh/manifests/install.pp  //新建文件首先確定客戶端安裝ssh服務

 

class ssh::install{

package{"openssh":

        ensure => present,

        }

}

 

 

 

vi /etc/puppet/modules/ssh/manifests/config.pp//新建文件

class ssh::config{

file {"/etc/ssh/sshd_config":

        ensure => present,

        owner => "root",

        group => "root",

        mode => "0600",

        source => "puppet://$puppetserver/modules/ssh/ssh/sshd_config",

        require => Class["ssh::install"],

        notify => Class["ssh::service"],

        }

}

 

 

vi /etc/puppet/modules/ssh/manifests/service.pp //新建文件

class ssh::service {

        service {"sshd":

                ensure=>running,

                hasstatus=>true,

                hasrestart=>true,

                enable=>true,

                require=>Class["ssh::config"]

        }

}

 

 

vi /etc/puppet/modules/ssh/manifests/init.pp  //新建文件

class ssh{

        include ssh::install,ssh::config,ssh::service

}

 

ll /etc/puppet/modules/ssh/manifests/  //下面有四個文件

 

 

cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/

chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config  //修改權限

 

vi /etc/puppet/manifests/nodes/ssh.pp

node 'client02.czm.com' {

        include ssh

}

node 'client01.czm.com' {

        include ssh

}

 

 

vi /etc/puppet/manifests/site.pp  //新建文件

import "nodes/ssh.pp"

 

vi /etc/puppet/modules/ssh/files/ssh/sshd_config  //修改(13)

Port 9922

 

service puppetmaster restart  //重新啓動puppet

 

--------------client----客戶端主動拉取---------

puppet agent -t

 

 image.png

cat /etc/ssh/sshd_config   //驗證如下

Port 9922

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

 

從上圖可以看出更換了ssh的端口

 

netstat -tunlp| grep ssh  //查看服務器ssh服務是否重啓端口是否生效

 image.png

 

5、配置服務器推送同步客戶端

 

vi /etc/puppet/puppet.conf  //最後一行添加

listen = true

 

vi /etc/puppet/auth.conf   //最後一行添加

allow *

 

service puppet restart  //啓動puppet客戶端

 

 

cat /etc/ssh/sshd_config //查看

#Port 22

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

 

 

netstat -tunlp| grep ssh   //確認啓動ssh服務

 

 

------------master---------------

 

puppet kick  clientname  //開始往客戶端推送

 

 

vi /etc/ssh/sshd_config   //clientname上查看驗證如下

Port 9922

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

 

 

netstat -tunlp| grep sshd  //clientname上查看查看服務器ssh服務是否重啓端口是否生效


擴展

管理系統上的用戶組

vim group.pp
        group{'mygrp':
        name => 'mygrp',
        ensure => present,
        gid => 2000,
        }

說明

        name:組名可以省略如果省略將繼承title的值
        gid:GID;
        system:是否爲系統組,true OR false;
        ensure:目標狀態,present/absent;
        members:成員用戶;

 

管理系統上的用戶

vim user1.pp
        user{'keerr':
        ensure => present,
        system => false,
        comment => 'Test User',
        shell => '/bin/tcsh',
        home => '/data/keerr',
        managehome => true,
        groups => 'mygrp',
        uid => 3000,
        }

說明

        name:用戶名可以省略如果省略將繼承title的值
        uid: UID;
        gid:基本組ID;
        groups:附加組不能包含基本組
        comment:註釋
        expiry:過期時間 ;
        home:用戶的家目錄
        shell:默認shell類型
        system:是否爲系統用戶 ;
        ensure:present/absent;
        password:加密後的密碼串

 

puppet的管理軟件包

vim package1.pp
        package{'nginx':
                   ensure  => installed,
            provider    =>  yum
        }        

 

說明

        ensure:installed, present, latest, absent, any version string (implies present)
        name:包名可以省略如果省略將繼承title的值
        source:程序包來源僅對不會自動下載相關程序包的provider有用例如rpmdpkg;
        provider:指明安裝方式

 

定義服務的狀態

vim service1.pp
        service{'nginx':
                    ensure  => true,
            enable  => false
        }

 

說明

        ensure:服務的目標狀態值有true(running)false(stopped)
        enable:是否開機自動啓動值有truefalse
        name:服務名稱可以省略如果省略將繼承title的值
        path:服務腳本路徑默認爲/etc/init.d/
        start:定製啓動命令
        stop:定製關閉命令
        restart:定製重啓命令
        status:定製狀態

 

管理文件目錄軟鏈接

vim file1.pp
        file{'aaa':
                    path    => '/data/aaa',
            source  => '/etc/aaa',
            owner   => 'keerr',
            mode    => '611',
        }

說明

        ensure:目標狀態值有absent,present,file,directorylink
                file:類型爲普通文件其內容由content屬性生成或複製由source屬性指向的文件路徑來創建
                link:類型爲符號鏈接文件必須由target屬性指明其鏈接的目標文件
                directory:類型爲目錄可通過source指向的路徑複製生成,recurse屬性指明是否遞歸複製
        path:文件路徑
        source:源文件
        content:文件內容
        target:符號鏈接的目標文件
        owner:定義文件的屬主
        group:定義文件的屬組
        mode:定義文件的權限
        atime/ctime/mtime:時間戳

 

執行命令慎用通常用來執行外部命令

vim exec1.pp
        exec{'cmd':
                    command => 'mkdir /data/testdir',
            path => ['/bin','/sbin','/usr/bin','/usr/sbin'],
        #   path => '/bin:/sbin:/usr/bin:/usr/sbin',
        }

 

說明

        command(namevar):要運行的命令
        cwd:指定運行該命令的目錄
        creates:文件路徑僅此路徑表示的文件不存在時,command方纔執行
        user/group:運行命令的用戶身份
        path:指定命令執行的搜索路徑
        onlyif:此屬性指定一個命令此命令正常退出碼爲0)運行時當前command纔會運行
        unless:此屬性指定一個命令此命令非正常退出碼爲非0)運行時當前command纔會運行
        refresh:重新執行當前command的替代命令
        refreshonly:僅接收到訂閱的資源的通知時方纔運行

 

 

定義週期性任務

vim cron1.pp
        cron{'timesync':
            command => '/usr/sbin/ntpdata 172.16.0.1',
            ensure  => present,
            minute  => '*/3',
            user    => 'root',
        }

 

說明

        command:要執行的任務命令或腳本);
        ensure:目標狀態,present/absent;
        hour:
        minute:
        monthday:
        month:
        weekday:
        user:以哪個用戶的身份運行命令默認爲root);
        target:添加爲哪個用戶的任務
        name:cron job的名稱


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