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
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