Puppet 部署应用

Puppet 部署应用

技能目标

  • 熟悉 Puppet 工作原理
  • 掌握 Puppet 部署应用配置方法

案例一分析

案例概述

作为一名系统管理员,维护服务器正常运行是最基本的职责。在管理几台到几十台服务器时,大部分管理员喜欢写自己的小工具来维护。但是随着服务器数量的增多, 任务量也逐渐增加,这时就需要简洁的、强大的框架来完成系统管理任务。

为实现这一目的, 引入一批工具。这批工具是“可编程”的,系统管理员只需要为这批工具写上几行“代码”,它便会自动完成所有的工作,Puppet 就是这批运维自动化工具中的其中一种。在一些大型互联网企业中, Puppet 运维自动化工具管理着几百甚至上千台服务器,它可以针对多台服务器进行统一操作,如部署统一软件、进行统 一上线维护等,而且能够快速完成上线部署,减少人力并降低人力误操作风险。

案例前置知识点

1. Puppet 工作原理

Puppet 的目的是让管理员只集中于要管理的目标,而忽略实现的细节。Puppet 既可以在单机上使用,也可以以 C/S 结构使用。在大规模使用 Puppet 的情况下,通常使用 C/S 结构。在这种结构中 Puppet 客户端只运行 Puppet Client, Puppet 服务器端只运行 Puppet Master。

Puppet 管理工具的工作流程如下图所示。
Puppet 部署应用
(1)客户端 Puppet 调用 Facter 工具(Facter 是通过 SSL 加密收集及检测分析客户端配置信息的一个工具),Facter 探测出主机的一些变量,如主机名、内存大小、IP 地址等。Puppet 把这些信息通过 SSL 连接发送到服务器端。

(2)服务器端的 Puppet Master 通过 Facter 工具分析检测客户端的主机名,然后找到项目主配置文件 manifest 里面对应的 node 配置, 并对该部分内容进行解析。Facter 发送过来的信息可以作为变量处理,node 牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,首先进行语法检查。如果语法没错,就继续解析。解析的结果生成一个中间的“伪代码”,然后把伪代码发给客户端。

(3)客户端接收到“伪代码”并且执行,客户端把执行结果发送给服务器。

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

2. Puppet 工作中的注意事项

Puppet 工作过程中,有以下两点值得注意。

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

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

案例环境

1. 本案例实验环境

主机名 IP地址 配置 主要软件
master 192.168.10.101 2C/2G Puppet-server
client1 192.168.10.102 2C/2G Puppet
client2 192.168.10.103 2C/2G Puppet

2. 案例需求

使用 Puppet 批量修改客户端 SSH 服务端口

3. 案例实现思路

(1) 环境准备工作;

(2) 安装 Puppet Master 和 Puppet Client;

(3) 配置测试节点;

(4) 客户端主动拉取和服务端主动推送。

案例一实施

Puppet 安装与部署

1. 修改服务器主机名

在小规模 Puppet 环境下,一般是修改/etc/hosts 文件实现服务通过主机名进行通信,然而上千台服务器, 需要搭建自己的 DNS 服务器来实现服务通过主机名进行通信。此实验我们通过修改/etc/hosts 文件来实现。

192.168.10.101主机操作
hostnamectl set-hostname master
su

192.168.10.102主机操作
hostnamectl set-hostname client1
su

192.168.10.103主机操作
hostnamectl set-hostname client2
su

2. 关闭防火墙内核安全机制,所有主机操作

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

3. 安装启动时间同步服务器,所有主机操作

yum -y install chrony
systemctl start chronyd
systemctl enable chronyd
chronyc sources -v

4. 添加hosts解析,所有主机操作

cat >> /etc/hosts << EOF
192.168.10.101 master
192.168.10.102 client1 
192.168.10.103 client2 
EOF

Puppet 安装与部署

1. 安装 Puppet-server , master主机操作
从 官 网 https://yum.puppetlabs.com/el/7/products/x86_64/ 下 载 Puppet 源puppetlabs-release-7-12.noarch.rpm 软件包,上传到 master服务器上。

#解压源码包
rpm -ivh puppetlabs-release-7-12.noarch.rpm

#安装启动puppet-server
yum install -y puppet-server
systemctl start puppetmaster
systemctl enable puppetmaster

2. 安装Puppet,两台client主机操作

#上传puppetlabs源到client主机中,安装 puppetlabs 源
rpm -ivh puppetlabs-release-7-12.noarch.rpm

#安装puppet
yum install -y puppet

3. 修改两台客户端的配置文件

vim /etc/puppet/puppet.conf
#在文 件 中 的 [main] 标 题 下 添 加 “server = master”配置字段用于设置 Puppet-server 的域名
server = master     #master主机名,如果有DNS服务器的话可以写域名

4. 在两台客户端申请注册

#client1主机注册
puppet agent --server=master --no-daemonize --verbose

#client2主机注册
puppet agent --server=master --no-daemonize --verbose

#等待一会儿,然后可以按 Ctrl+C 结束

5. 在 master 端查看申请注册的客户端

puppet cert --list
"client1" (SHA256) 1D:D4:FE:81:C7:C3:98:1C:53:28:86:49:6E:1C:FF:13:7F:61:D3:0C:DC:2F:94:51:49:18:8E:EB:C8:24:1A:1C
"client2" (SHA256) 02:3D:64:24:56:42:F4:CE:46:B5:96:91:06:CF:E9:E9:FB:1D:CD:BC:CB:CF:CA:CD:55:27:A1:7F:17:9E:72:29

6. 在 master 端将所有申请未注册的客户端进行注册

puppet cert sign --all
Notice: Signed certificate request for client1
Notice: Removing file Puppet::SSL::CertificateRequest client1 at '/var/lib/puppet/ssl/ca/requests/client1.pem'
Notice: Signed certificate request for client2
Notice: Removing file Puppet::SSL::CertificateRequest client2 at '/var/lib/puppet/ssl/ca/requests/client2.pem'

#如果想允许单个客户端进行注册可以使用以下命令
puppet cert sign 客户端主机名或域名

#注册成功后,可以通过目录去查看已经注册的客户端
ll /var/lib/puppet/ssl/ca/signed/
总用量 12
-rw-r--r--. 1 puppet puppet 1931 5月  31 17:20 client1.pem
-rw-r--r--. 1 puppet puppet 1931 5月  31 17:20 client2.pem
-rw-r--r--. 1 puppet puppet 1927 5月  31 15:53 master.pem

配置实例

为了保护 Linux 的 SSH 端口, 批量修改客户端 SSH 端口, 将默认端口 22 修改为 9922, 并实现重启工作。在 Master 端创建 SSH 模块, 模块目录为 ssh, 模块目录下面有三个子目录: manifests、templates 和 files。

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

  • files 目录是该模块的文件发布目录,Puppet 提供一个文件分发机制,类似 rsync的模块。

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

配置测试节点,master端操作

Master 需要使用的相关配置文件如下:

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

  • 模块信息:在/etc/puppet/modules/

(1) Master 上创建需要的目录

cd /etc/puppet/
mkdir -p modules/ssh/{manifests,templates,files}
mkdir manifests/nodes
mkdir modules/ssh/files/ssh
chown -R puppet modules/       #修改权限
ll modules/ssh    #查看/etc/puppet/modules/ssh 目录下的结构
总用量 0
drwxr-xr-x. 3 puppet root 17 5月  31 17:31 files
drwxr-xr-x. 2 puppet root  6 5月  31 17:31 manifests
drwxr-xr-x. 2 puppet root  6 5月  31 17:31 templates

(2) 创建模块配置文件 install.pp

vim /etc/puppet/modules/ssh/manifests/install.pp
#输入以下信息(首先确定客户端安装SSH 服务)
class ssh::install{
    package{ "openssh":
        ensure => present,
    }
}

(3) 创建模块配置文件 config.pp

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

(4) 创建模块配置文件 service.pp

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 调用
    }
}

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

vim /etc/puppet/modules/ssh/manifests/init.pp
class ssh{
    include ssh::install,ssh::config,ssh::service     #加载以上配置文件
}

#此时,/etc/puppet/modules/ssh/manifests 目录下有四个文件
ll /etc/puppet/modules/ssh/manifests/
总用量 16
-rw-r--r--. 1 root root 628 5月  31 17:46 config.pp
-rw-r--r--. 1 root root  63 5月  31 17:47 init.pp
-rw-r--r--. 1 root root  79 5月  31 17:45 install.pp
-rw-r--r--. 1 root root 186 5月  31 17:46 service.pp

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

复制服务器端/etc/ssh/sshd_config 文件到模块默认路径。

cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
chown -R puppet /etc/puppet/modules/ssh/files/ssh/

(7) 创建测试节点配置文件

创建测试节点配置文件,并加载 SSH。

vim /etc/puppet/manifests/nodes/ssh.pp
node 'client1'{       #这里注意node后面跟的是客户端的主机名或域名
    include ssh
}
node 'client2'{
    include ssh
}

(8) 将测试节点载入 Puppet,即修改 site.pp

vim /etc/puppet/manifests/site.pp
import "nodes/ssh.pp"

(9) 修改服务端维护的 sshd_config 配置文件

vim /etc/puppet/modules/ssh/files/ssh/sshd_config
Port 9922	#取消注释并修改为 9922 

(10) 重新启动 puppet master 服务

systemctl restart puppetmaster


tree /etc/puppet
/etc/puppet
├── auth.conf
├── environments
│   └── example_env
│       ├── manifests
│       ├── modules
│       └── README.environment
├── fileserver.conf
├── manifests
│   ├── nodes
│   │   └── ssh.pp
│   └── site.pp
├── modules
│   └── ssh
│       ├── files
│       │   └── ssh
│       │       └── sshd_config
│       ├── manifests
│       │   ├── config.pp
│       │   ├── init.pp
│       │   ├── install.pp
│       │   └── service.pp
│       └── templates
└── puppet.conf

12 directories, 11 files

客户端主动拉取

在其中一台 client1客户端上, 执行以下操作从服务器端主动拉取配置。

puppet agent -t

netstat -tunlp | grep ssh   #查看TCP/UDP端口号然后过滤出来ssh的端口号
tcp        0      0 0.0.0.0:9922            0.0.0.0:*               LISTEN      19797/sshd          
tcp6       0      0 :::9922                 :::*                    LISTEN      19797/sshd

#ssh的端口号果然变成了9922

服务端主动推送

当大规模部署时不可能在每台客户端都采用拉取动作,而此时用服务器推送模式 反而更合理。在客户端 client2上做修改。

(1) 修改 puppet 配置文件,最后一行添加如下。

vim /etc/puppet/puppet.conf
#在文件最后一行添加
listen = true    #使 puppet 监听 8139 端口

(2) 修改验证配置文件 auth.conf 定义一些验证信息及访问权限, 最后一行添加如下。

 vim /etc/puppet/auth.conf
#最后一行添加如下 
allow *	     #允许任何服务端推送

(3) 启动 Puppet Agent 客户端。

systemctl start puppetagent

(4) 修改客户端 client2 的/etc/ssh/sshd_config 文件,将 Port 9922还原成最初始状态,然后重启 sshd 服务。

vim //etc/ssh/sshd_config
#Port 22

systemctl restart sshd

netstat -tunlp | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      18913/sshd          
tcp6       0      0 :::22                   :::*                    LISTEN      18913/sshd 

(5) 向 client2 节点推送配置,master主机操作

puppet kick client2

如果出现这个“错误:主机客户端2失败:连接被拒绝-连接(2)”去客户端查看以下puppetagent的状态
Puppet 部署应用客户端查看状态
Puppet 部署应用直接把/var/run/puppet/agent.pid文件删除

cd /var/run/puppet/
rm -rf agent.pid

#然后重启puppetagent
systemctl restart puppetagent
systemctl status puppetagent

Puppet 部署应用然后再去master主机再次进行推送,就不会有错误出现了
Puppet 部署应用

(6) 校验结果,client2主机操作
此时,在 client2 主机上可以查看到 SSH 端口已经被更改为 9922。

cat /etc/ssh/sshd_config | grep Port
#Port 9922
#GatewayPorts no

netstat -tunlp | grep sshd
tcp        0      0 0.0.0.0:9922            0.0.0.0:*               LISTEN      19158/sshd          
tcp6       0      0 :::9922                 :::*                    LISTEN      19158/sshd  

扩展: puppet kick -p 10 -host 客户端 #-p表示一批10个客户端推送 --host 推送给谁

上一篇:C++单链表创建、遍历、插入、删除结点、整体删除、反转


下一篇:PP视频如何关闭下载完成通知我