puppet的部署与应用

Puppet的部署与应用

1、 案例概述

作为一名系统管理员,维护服务器正常运行是最基本的职责,在管理几台到几十台服务器时,大部分管理员喜欢自己写小工具来维护,但随着服务器的数量曾多,任务量也逐渐增多,这时就需要简洁的、强大的框架来完成系统管理的任务,为了实现这一目的,我们引入了一些工具,这些工具是可编程的,系统管理员只需要为这个工具写上几行代码,它便会自动的完成所有的工作,这批工具就是运维自动化puppet,它可以针对多台服务器进行统一操作,如部署统一的软件、进行统一上线维护等,而且能快速完成上线部署,减少人力及人力误操作风险。

2、 Puppet的工作原理

Puppet的目录是让管理员只集中于要管理的目标,而忽略实现的细节。Puppet即可以运行在单机上,也可以以C/S结构使用。在大规模使用puppet的情况下,通常使用C/S结构,在这种结构中puppet客户端只运行puppeclient,puppet服务端只运行puppemaster。
1、puppet具体的工作原理

puppet客户端首先会连接到puppet服务器端,并且通过facter工具把客户端的基本配置信息发送给服务器端. 服务器端通过分析客户端的主机名,通过node 定义,找到该主机的配置代码,然后编译配置代码,把编译好的配置代码发回客户端,客户端执行代码完成配置.并且把代码执行情况反馈给puppet服务器端.

      

1)      客户端puppet调用fast探测出主机的一些变量,如主机名、内存大小、IP地址等。Puppet把这些信息使用SSL连接发送给服务器端

2)      服务器端的puppetmaster通过fast工具分析检测客户端的主机名,然后找到项目的主配置文件manifest里面对应的node配置,并对该部分内容进行解析,fast发送过来的信息可以作为变量处理,node牵扯到的代码才被解析,没牵扯到的不解析,解析分为语法检查,如果语法没错,继续解析,解析结果生成一个结果‘伪代码’,然后把‘伪代码’发给客户端

3)      客户端收到‘伪代码’并且执行,客户端把执行结果发给服务器

4)      服务器端把客户端的执行结果写入日志



2、puppet工作过程中的注意事项

1)      为了保证安全,Client和Master之间是基于SSL和证书的,只有经Master证书认证的Client可以与Master通信

2)      Puppet会让系统保持在人们所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证SSH服务始终开启,如果文件被删除了或者ssh服务关闭了,puppet下次执行时(默认30分钟)会重新创建该文件或者启动SSH服务


主机
    

操作系统Centos7
    

IP地址 :192.168.91.134(server),192.168.91.133(client)
    




一、配置server端和client端


==================server端:====================================
hostname master.2018.com
bash
vi /etc/hosts
192.168.91.132 master.2018.com
192.168.91.133 client1.2018.com

yum -y install ntp
systemctl start ntpd
systemctl enable ntpd

systemctl stop firewalld
systemctl enable firewalld
sed -i "s/SELINUX=enforcing/SELINUX=disabled/"   /etc/selinux/config

rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm
yum -y install ruby facter puppet-server

cp -P /usr/lib/systemd/system/puppetmaster.service /etc/init.d/
chmod +x /etc/init.d/puppetmaster.service
systemctl start puppet
systemctl enable puppet
systemctl start puppetmaster
systemctl enable puppetmaster

=====================client端:=================================
hostname client1.2018.com
bash
vi /etc/hosts
192.168.91.132 master.2018.com
192.168.91.133 client1.2018.com

yum -y install ntp
systemctl start ntpd
systemctl enable ntpd

systemctl stop firewalld
systemctl enable firewalld
sed -i "s/SELINUX=enforcing/SELINUX=disabled/"   /etc/selinux/config

rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm
yum -y install ruby facter puppet

修改配置文件vim /etc/puppet/puppet.conf

[agent]标题下添加一行

server = master.2018.com

systemctl start puppet
systemctl enable puppet


=======================================server与client端配置完成======================================






二、申请和注册:



1.启动server,以no-daemonize方式,这样可以在控制台看到操作信息(Server端):

$ puppet master --no-daemonize --debug
... ...
Notice: Starting Puppet master version 3.8.7  #启动成功,会看到这样的信息    
-----------------puppet master --no-daemonize --debug报错(Server端):注意--------------------------------------------
Error: Could not run: The certificate retrieved from the master does not match the agent's private key.
Certificate fingerprint: 7C:AD:DE:0D:04:E0:42:80:5A:2E:C4:72:10:CA:68:06:8F:A2:DB:94:80:68:E9:45:FA:32:6B:B3:7D:D2:66:0C
To fix this, remove the certificate from both the master and the agent and then start a puppet run, which will automatically regenerate a certficate.
On the master:
  puppet cert clean master.2018.com
On the agent:
  1a. On most platforms: find /var/lib/puppet/ssl -name master.2018.com.pem -delete
  1b. On Windows: del "/var/lib/puppet/ssl/master.2018.com.pem" /f
  2. puppet agent -t

解决(Server端):
puppet cert clean master.2018.com



2.启动agent(client端,以root用户):
[root@client1 ~]# puppet agent --server=master.2018.com --no-daemonize --verbose
Notice: Starting Puppet client version 3.8.7


3.启动后,agent向server申请证书,因为证书还没有被server审核,所以目前通信是不成功的。

回到server,通过puppet cert查看申请注册的客户端:

将未注册的客户端进行注册:
[root@master ~]# puppet cert list --all    #查看
[root@master ~]# puppet cert sign --all    #注册
  "client1.2018.com"      (SHA256) E6:BD:DE:D5:9C:0C:E8:1F:1D:29:67:54:93:A4:AD:72:9C:CA:04:95:28:51:9C:CB:11:3B:EA:93:6C:6A:BB:24
+ "localhost.localdomain" (SHA256) C6:AF:22:E6:B5:AD:6E:7A:A1:E0:30:93:C8:D2:82:23:3B:CF:BF:95:4F:E9:3C:80:F3:22:6A:33:6A:9F:22:21 (alt names: "DNS:localhost.localdomain", "DNS:puppet", "DNS:puppet.localdomain")
+ "master.2018.com"       (SHA256) 46:6C:62:27:19:05:FA:72:66:81:EE:95:1D:35:36:EA:B3:D3:37:C1:11:05:44:C1:F4:D2:9B:8F:D2:4D:D9:87 (alt names: "DNS:master.2018.com", "DNS:puppet", "DNS:puppet.2018.com")

可以通过目录查看已注册的客户端:
[root@master ~]# ll /var/lib/puppet/ssl/ca/signed/
total 12
-rw-r--r-- 1 puppet puppet 1956 Jun 28 02:34 client1.2018.com.pem
-rw-r--r-- 1 puppet puppet 2045 Jun 28 02:09 localhost.localdomain.pem
-rw-r--r-- 1 puppet puppet 2025 Jun 28 02:17 master.2018.com.pem

此时客户端已经完成了证书的请求和签名


==================================================================================================

三、使用测试:


1.      配置一个测试节点

节点信息:/etc/puppet/manifests/nodes

模块信息:/etc/puppet/modules

为了保护Linux的ssh端口爆破,批量修改客户端sshd端口,将端口22修改为9922,并实现重启工作

创建ssh模块,模块目录为ssh,模块下面有三个文件:mainfests、templates和files

Mainfests里面必须要包含一个init.pp文件,这是该模块的初始文件,导入一个模块的时候,会从init.pp开始执行。可以把所以的代码写到init.pp文件里面,也可以分成多个pp文件,init再去包含其他文件,定义class类名的时候必须是ssh,这样能实现调用

Files目录是该模块的文件发布目录,puppet提供一个文件的分发机制,类似rsync的模块

Templates目录包含erb模型文件,这个和file资源的template属性有关(很少用)

Master端:

1)      创建需要的必要的目录

此时/etc/puppet/modules/ssh/目录下结构:
[root@master ~]# mkdir /etc/puppet/modules/ssh
[root@master ~]# mkdir /etc/puppet/modules/ssh/manifests
[root@master ~]# mkdir /etc/puppet/manifests/nodes
[root@master ~]# mkdir /etc/puppet/modules/ssh/templates
[root@master ~]# mkdir /etc/puppet/modules/ssh/files
2)      创建模块配置文件install.pp
[root@master ~]# vi /etc/puppet/modules/ssh/manifests/install.pp
class ssh::install{
package{"openssh":
        ensure => present,
        }
}
3)      创建模块配置文件config.pp
root@master ~]# 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://$puppetmaster/modules/ssh/files/ssh/sshd_config",   #对应这个文件路径/etc/puppet/modules/ssh/files/ssh/sshd_config
        require => Class["ssh::install"],
        notify => Class["ssh::service"],
        }

}

4)      创建模块配置文件service.pp
root@master ~]# 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"]
        }
}

5)      创建模块主配置文件init.pp
[root@master ~]# vi /etc/puppet/modules/ssh/manifests/init.pp

class ssh{
        include ssh::install,ssh::config,ssh::service
}

此时/etc/puppet/modules/ssh/manifests目录下有四个文件:
[root@master manifests]# pwd
/etc/puppet/modules/ssh/manifests
[root@master manifests]# ll
-rw-r--r-- 1 root root 263 Jun 28 04:01 config.pp
-rw-r--r-- 1 root root  62 Jun 28 02:56 init.pp
-rw-r--r-- 1 root root  64 Jun 28 02:54 install.pp
drwxr-xr-x 2 root root   6 Jun 28 02:59 nodes
-rw-r--r-- 1 root root 152 Jun 28 04:04 service.pp


6)      建立服务器端ssh统一维护文件

由于服务器端和客户端的sshd_config文件默认一样,此时将服务器端/etc/ssh/sshd_config复制到模块默认路径
[root@master ~]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/sshd_config
[root@master ~]# chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config

7)      创建测试节点配置文件,并将ssh加载进去
[root@master ~]# cat /etc/puppet/manifests/nodes/ssh.pp
node 'client1.2018.com'{
        include ssh
}
#node 'client2.2018.com'{
#        include ssh
#}
#node 'client3.2018.com'{
#        include ssh
#}

8)      将测试节点载入puppet,即修改site.pp
[root@master ~]# cat /etc/puppet/manifests/site.pp
import "nodes/ssh.pp"

9)      修改server端维护的sshd_config配置文件
[root@master ~]# vi /etc/puppet/modules/ssh/files/ssh/sshd_config
Port 9922   #将22改成9922

10)   重新启动puppet
[root@master ~]# systemctl restart puppetmaster

[root@client1 ~]# tail -1  /etc/puppet/puppet.conf
    listen = true

[root@client1 ~]# tail -1 /etc/puppet/auth.conf
allow *


最后client端验证:
[root@client1 ~]# grep 9922 /etc/ssh/sshd_config    
Port 9922        #文件已修改

[root@client1 ~]#ssystemctl restart sshd
[root@client1 ~]# netstat -tunlp | grep 9922
tcp        0      0 0.0.0.0:9922            0.0.0.0:*               LISTEN      12579/sshd          
tcp6       0      0 :::9922                 :::*                    LISTEN      12579/sshd

猜你喜欢

转载自blog.csdn.net/weixin_41515615/article/details/80947439