Puppet

#运维

About

系统配置管理、运维自动化工具。

2005 年由 Luke Kanies 开发——使用 Ruby 语言。

工作原理

Puppet 是 C/S 架构。配置文件保存在服务器端,客户端定期下载并按要求配置系统。

为了安全,客户端和服务器端通信使用 SSL 证书,服务器端给客户端颁发证书后,客户端就能从服务器端获取配置并执行任务。

安装

两台主机:服务器端 (b2)、客户端 (b6)。

CentOS 7 的所有机器都要先安装 Puppet 的源:

yum install https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm

服务器端:

yum install puppet-server          # 3.8.7-1.el7
systemctl start puppetmaster       # 启动服务
systemctl status puppetmaster      # 确认状态
systemctl enable puppetmaster      # 开机启动
systemctl stop firewalld           # 暂时把防火墙关了

客户端:

yum install puppet
systemctl enable puppet
systemctl stop firewalld           # 暂时把防火墙关了

/etc/sysconfig/puppet 文件中设置 Server 主机名:

PUPPET_SERVER=b2

/etc/puppet/puppet.conf 文件中设置 Server 主机名:

[agent]
    server=b2

启动服务:

systemctl start puppet
systemctl status puppet        # 确认状态
systemctl enable puppet        # 开机启动

手动强制执行任务:

$ puppet agent -t
Exiting; no certificate found and waitforcert is disabled        # 正常,要等服务器验证通过

服务器端:

$ puppet cert list
  "b6" (SHA256) ...           # 待认证的主机

$ puppet cert sign b6         # 分配证书 (从 request/ 移到了 signed/)

安装到这里就完成了,接下来可以给 Server 布置一些任务,比如给客户端安装一些工具、创建一些账户等等。

任务测试

服务器端:

创建任务文件 /etc/puppet/manifests/site.pp (文件名不能变):

node 'b6' {
    include example
}
 
class example {
    package { ["nmap","telnet","traceroute"]:
        ensure => latest,
        allow_virtual => false,
    }
}

重启服务:

systemctl restart puppetmaster

客户端:

手动执行任务:

puppet agent -t

客户端默认每 30分钟 (m) 到 Server 端更新一次配置,如果要调整该时间,编辑 /etc/puppet/puppet.conf 文件:

[agent]
    runinterval=30s        # 为了测试设短一点。可选单位有 s|m|h|d|y,0 表示立即执行。

重启服务:

systemctl restart puppet

服务器端:

编辑任务,再多加一个包,重启服务,等 30s,客户端应该就安装好这个包了。

配置文件

/etc/sysconfig/puppet

/etc/puppet/
|-- auth.conf
|-- fileserver.conf     # (服务器端)
|-- manifests/          # 任务 (服务器端)
|-- modules/
`-- puppet.conf

/var/lib/puppet/ssl     # 证书目录 (服务器端)

命令

# 客户端
puppet agent -t                      # 测试
puppet agent -t --debug              # 测试,打印更多输出
puppet agent -t --debug --noop       # 测试,不真的执行
puppet agent --no-daemonize --verbose --onetime
systemctl status puppet              # 查看任务执行时的报错

证书相关:

# 服务器端
puppet cert list                     # 查看认证请求
puppet cert sign HOSTNAME            # 通过认证、颁发证书

模块相关 (https://forge.puppet.com/):

# 服务器端
puppet module install NAME
puppet module search STRING
puppet module list               # 已安装的模块

任务

创建账户、分组

# 创建用户 (无 HOME 目录)
user {"test":
    uid=>2000,
    # gid=>2000,                  # CentOS 7 不需要,默认 uid=gid。要使用该配置就必须先创建该分组。
    home=>"/home/test",
    shell=>"/bin/bash";
}

# 删除用户
user {"test":
    ensure=>"absent",
}

# 创建用户 (有 HOME 目录)
user {"test":
    ensure=>"present",
    managehome=>true,
    groups=>wheel,               # 加入用户组
}

# 创建分组
group {"tmp":
    ensure=>"present",
    gid=>3000,
}

group {"tmp":
    ensure=>"absent",
}

配置仓库、安装包

yumrepo"epel7":
    descr=>"163repo",
    baseurl=>"http://mirrors.163.com/centos/7/os/x86_64/",
    gpgcheck=>"0",
    enabled=>"1";
}

package {"puppet":
    ensure=>installed,
    require=>Yumrepo["puppetlabs"]       # puppetlabs 源是依赖,必须存在
}

周期任务

cron {"logrotate":
    command=>"/usr/sbin/logrotate",
    user=>root,
    hour=>2,                             # 每 2 小时执行一次 
    minute=>0
}

cron {"logrotate":
    command=>"/usr/sbin/logrotate",
    user=>root,
    hour=>['2-4'],                       # 第 2-4 小时内,每 10 分钟执行一次
    minute=>'*/10'
}

cron {"ntpdate":
    command=>"/usr/sbin/ntpdate 192.168.0.1",
    user=>root,
    minute=>'*/5',                       # 每5分钟执行一次
    require=>Package["crontabs"];        # 依赖的包,必须先安装
}

执行命令

多个 exec 的资源名可以相同。

exec {"squid":
    command => "/usr/local/sbin/squid",
    path    => "/usr/local/sbin/",
}

exec {"logrotate":
   path => "/usr/bin:/usr/sbin:/bin",
   onlyif => "test `du /var/log/messages | cut -f1` -gt 100000"      # 执行命令的条件
}

创建文件

file {"/etc/aliases":
    source => "puppet://server/module/aliases"
}