自动化运维之puppet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维之puppet相关的知识,希望对你有一定的参考价值。

自动化运维之puppet

puppet介绍

puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。

puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息.

具体的工作流程:
技术分享图片

  • 客户端puppet调用facter(facter是通过SSL加密收集及检测分析客户端配置信息的一个工具)。facter探测出主机的一些变量,如主机名,内存大小,IP地址等。Puppet将这些信息通过SSL连接发送到服务端
  • 服务端的puppetmaster通过facter工具分析检测客户端的主机名,然后找到项目主配置文件manifest里面对应的node配置,并对该部分内容进行解析。facter发送过来的信息可以作为变量处理,node牵涉到的代码才进行解析,其他没牵涉的代码不解析。解析分几个阶段,首先进行语法检测,如果语法没有错,就继续解析,解析的结果生成一个中间的“伪代码”,然后将“伪代码”发送给客户端。
  • 客户端接受到“伪代码”并执行,然后将执行结果发送给服务端。
  • 服务端把客户端的执行结果写入到日志中去。
  • Puppet工作中以下两点值得注意:

  • 为了保证安全,client和master之间是基于SSL和证书通信的,只有经过master证书认证的client才可以和master通信。
  • puppet会让系统保持在人们期望的某种状态并之一持续下去,如检测某个文件并一直保证其一致存在,保证ssh服务始终开启,如果文件被删除或者ssh服务被关闭,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。

实验环境

本实验使用四台服务器模拟搭建puppet环境,具体拓扑图如下:
技术分享图片
各服务器IP分布如下表

主机 IP地址
puppetmaster 192.168.58.146
puppetclient1 192.168.58.148
puppetclient2 192.168.58.149
ntp server 192.168.58.147

实验实施

搭建puppet master

  • 规划服务器主机名
    在小规模的环境下,我们直接修改/etc/hosts和/etc/hostname两个文件,以pupetmaster服务器为例。
[[email protected] ~]# cat /etc/hostname   #修改主机名
master.test.cn

[[email protected] ~]# cat /etc/hosts      #将三台服务器主机名和IP地址写到/etc/hosts文件中去
192.168.58.146 master.test.cn
192.168.58.148 client1.test.cn
192.168.58.149 client2.test.cn

[[email protected] ~]# ping client1.test.cn
PING client1.test.cn (192.168.58.148) 56(84) bytes of data.
64 bytes from client1.test.cn (192.168.58.148): icmp_seq=1 ttl=64 time=0.846 ms
64 bytes from client1.test.cn (192.168.58.148): icmp_seq=2 ttl=64 time=0.477 ms
64 bytes from client1.test.cn (192.168.58.148): icmp_seq=3 ttl=64 time=0.438 ms
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# setenforce 0
  • 服务器时间同步
    由于Puppet需要使用SSL证书,依赖时间同步,所以需要搭建NTP服务器。以下操作在NTP服务器上操作。
[[email protected] ~]# yum install ntp -y

[[email protected] ~]# systemctl start ntpd
[[email protected] ~]# systemctl enable ntpd
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# setenforce 0
[[email protected] ~]# ntpstat
synchronised to NTP server (85.199.214.100) at stratum 2 
   time correct to within 191 ms
   polling server every 64 s
  • puppetmaster作为NTP服务器客户端进行配置
[[email protected] ~]# yum install ntpdate -y
#安装NTP客户端
[[email protected] ~]# ntpdate 192.168.58.147
 5 Aug 16:54:55 ntpdate[2361]: adjust time server 192.168.58.147 offset -0.022671 sec
 #与NTP服务器进行时间同步
  • 安装Puppet服务端
    [[email protected] ~]# yum install epel-release -y
    #安装epel第三方源
    [[email protected] ~]# yum install puppet-server -y
    #安装Puooet服务端
    [[email protected] ~]# systemctl start puppetmaster.service 
    #启动puppetmaster服务

    搭建puppetclient

    两台puppetclient服务器配置类似,只有主机名注意区分

  • 首先配置服务器主机名
    [[email protected] ~]# cat /etc/hostname 
    client1.test.cn
    [[email protected] ~]# cat /etc/hosts
    192.168.58.146 master.test.cn
    192.168.58.148 client1.test.cn
    192.168.58.149 client2.test.cn
    [[email protected] ~]# ping master.test.cn
    PING master.test.cn (192.168.58.146) 56(84) bytes of data.
    64 bytes from master.test.cn (192.168.58.146): icmp_seq=1 ttl=64 time=0.665 ms
    64 bytes from master.test.cn (192.168.58.146): icmp_seq=2 ttl=64 time=0.504 ms
    ^C64 bytes from master.test.cn (192.168.58.146): icmp_seq=3 ttl=64 time=0.163 ms
    #可以通过域名ping通pupetmaster服务器
  • 服务器时间同步
    [[email protected] ~]# yum install ntpdate -y
    [[email protected] ~]# ntpdate 192.168.58.147
    5 Aug 17:00:29 ntpdate[2249]: adjust time server 192.168.58.147 offset -0.052137 sec
    #和NTP服务器进行同步

    技术分享图片

  • 安装puppet客户端
    [[email protected] ~]# yum install epel-release -y
    #安装epel第三方源
    [[email protected] ~]# yum install puppet -y
    #安装puppet客户端
  • 修改配置文件
    两台puppetclient都是一样的修改,指定Puppet Master服务器。
    [[email protected] ~]# vim /etc/puppet/puppet.conf 

    技术分享图片

  • 申请和注册
    分别在client1和client2上进行注册。

    [[email protected] ~]# puppet agent --server=master.test.cn --no-daemonize --verbose
    #这个就是注册命令,执行完后会有下面的提示
    Info: Creating a new SSL key for client1.test.cn
    Info: Caching certificate for ca
    Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
    Info: Creating a new SSL certificate request for client1.test.cn
    Info: Certificate Request fingerprint (SHA256): 92:9E:71:34:3C:A8:90:5B:68:77:44:5A:3A:15:26:C9:29:86:F9:60:D2:2D:61:D4:1A:79:C2:2F:C9:CF:C5:01
    Info: Caching certificate for ca
    #等待一会儿后,可以自己Ctrl+C结束,然后到server中查看申请信息。

    我们到master服务器中查看申请信息

    [[email protected] ~]# puppet cert --list
    "client1.test.cn" (SHA256) 92:9E:71:34:3C:A8:90:5B:68:77:44:5A:3A:15:26:C9:29:86:F9:60:D2:2D:61:D4:1A:79:C2:2F:C9:CF:C5:01
    "client2.test.cn" (SHA256) 9D:7E:22:85:1D:79:08:31:00:BE:2F:35:C2:F2:71:B9:DC:22:0D:24:8C:58:8E:7D:DA:79:9A:94:D5:C6:22:9A
    #可以看到两台客户端提出了注册申请

    对未注册的客户端注册

    [[email protected] ~]# puppet cert sign --all
    Notice: Signed certificate request for client1.test.cn
    Notice: Removing file Puppet::SSL::CertificateRequest client1.test.cn at ‘/var/lib/puppet/ssl/ca/requests/client1.test.cn.pem‘
    Notice: Signed certificate request for client2.test.cn
    Notice: Removing file Puppet::SSL::CertificateRequest client2.test.cn at ‘/var/lib/puppet/ssl/ca/requests/client2.test.cn.pem‘
    #可以看到已经通过了申请

    可以通过目录去查看已经注册的客户端

    [[email protected] puppet]# cd /var/lib/puppet/ssl/ca/signed/
    [[email protected] signed]# ls
    client1.test.cn.pem  client2.test.cn.pem  master.test.cn.pem
    #可以看到已经完成了证书的请求和签名

    配置实例

    这里为了保护Linux的ssh端口,修改客户端client1的sshd端口,将端口22修改为9922,并实现重启工作。

  • 首先创建ssh模块,ssh模块下面有三个文件:manifests,templates和files。
  • 在manifests里面包含一个init.pp文件,这是该模块的初始入口文件,导入模块时,会从init.pp开始执行。可以把所有的代码都写到init.pp里面,也可以分成多个pp文件,init再去包含其他文件。定义class类名的时候必须是ssh,这样才能调用
  • file目录是该模块的文件发布目录,Puppet提供一个文件分发机制,类似于rsync的模块。
  • templates目录包含erb模型文件,这个和file资源的template属性相关,不过很少用。具体配置如下:
    创建必要的目录:
    [[email protected] signed]# cd /etc/puppet/
    [[email protected] puppet]# mkdir -p modules/ssh/{manifests,templates,files}
    [[email protected] puppet]# mkdir manifests/nodes
    [[email protected] puppet]# mkdir modules/ssh/files/ssh
    [[email protected] puppet]# chown -R puppet modules/   #修改属主

    此时/etc/puppet/modules/ssh目录下的结构如下:

    [[email protected] puppet]# ll modules/ssh/
    总用量 0
    drwxr-xr-x. 3 puppet root 17 8月   5 17:25 files
    drwxr-xr-x. 2 puppet root  6 8月   5 17:25 manifests
    drwxr-xr-x. 2 puppet root  6 8月   5 17:25 templates

    创建模块配置文件install.pp

    [[email protected] puppet]# vim /etc/puppet/modules/ssh/manifests/install.pp
    class ssh::install{
    package{"openssh":
      ensure=>present,
      }
    }
    ~          

    创建模块配置文件config.pp

    
    [[email protected] puppet]# vim /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"], #调用install.pp确认ssh已经安装
notify=>Class["ssh::service"], #如果config.pp发生变化,通知service.pp
}
}
~

创建模块配置文件service.pp

[[email protected] puppet]# vim /etc/puppet/modules/ssh/manifests/service.pp
class ssh::service{
service { "sshd":
ensure=>running, #确认ssh运行
hasstatus=>true, #puppet该服务支持status命令,类似于service sshd status
hasrestart=>true, #puppet该服务支持restart,类似于service sshd restart
enable=>true, #服务器是否开机启动
require=>Class["ssh::config"] #确认config.pp调用
}
}

创建模块主配置文件init.pp

[[email protected] puppet]# vim /etc/puppet/modules/ssh/manifests/init.pp
class ssh {
include ssh::install,ssh::config,ssh::service
#将配置文件加载到ssh类中去
}
~

现在/etc/puppet/modeles/ssh/mainfests目录下有四个文件:

[[email protected] puppet]# ll /etc/puppet/modules/ssh/manifests/
总用量 16
-rw-r--r--. 1 root root 337 8月 5 17:34 config.pp
-rw-r--r--. 1 root root 67 8月 5 17:43 init.pp
-rw-r--r--. 1 root root 72 8月 5 17:28 install.pp
-rw-r--r--. 1 root root 203 8月 5 17:40 service.pp

建立服务端ssh同意维护文件,由于服务端和客户端的sshs_config文件默认一样,此时将服务端的/etc/ssh/sshd_config复制到模块默认路径中去。

[[email protected] puppet]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
[[email protected] puppet]# chown -R puppet /etc/puppet/modules/ssh/files/ssh/
#修改文件夹属主

创建测试节点配置文件,并将ssh加载进去。

[[email protected] puppet]# vim /etc/puppet/manifests/nodes/ssh.pp

node ‘client1.test.cn‘{
include ssh
}
~

将测试节点载入puppet,即修改site.pp

[[email protected] puppet]# vim /etc/puppet/manifests/site.pp
import "nodes/ssh.pp"
~

修改服务器维护的sshd_config配置文件

[[email protected] puppet]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config

Port 9922 #修改为9922

重启puppet

[[email protected] puppet]# systemctl restart puppetmaster.service

客户端主动拉取,

[[email protected] ~]# puppet agent -t
...省略
Info: Applying configuration version ‘1533463512‘
Notice: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]/content:
--- /etc/ssh/sshd_config 2017-08-07 10:28:25.000000000 +0800
+++ /tmp/puppet-file20180805-3493-173oey2 2018-08-05 18:05:13.550668088 +0800
@@ -14,7 +14,7 @@

SELinux about this change.

semanage port -a -t ssh_port_t -p tcp #PORTNUMBER

#
-#Port 22
+Port 9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...省略

此时在client端已经执行成功,现在就去客户端验证一下:

[[email protected] ~]# netstat -ntap | grep 9922
tcp 0 0 0.0.0.0:9922 0.0.0.0: LISTEN 3695/sshd
tcp6 0 0 :::9922 :::
LISTEN 3695/sshd

以上是关于自动化运维之puppet的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维之Puppet服务部署

自动化运维之Puppet

自动化运维之puppet

自动部署运维之Puppet

puppet自动化运维之package资源

puppet自动化运维之exec资源