如何使用 Example42 的 Puppet 模块

现在我们差不多移植了100多台服务器到虚拟机,中间合并了很多功能类似的服务器(历史遗留问题)到同一虚拟机,并且整个配置过程完全用 Puppet 代码化,也就是说有一天我们实验室机房遭遇物理毁灭(刚看完 Battleship,有点激动~),只要再给我们合适的硬件设备(异地有备份数据)我们应该能在6小时内恢复整个基础设施(OS, DNS, DHCP, Provision, Firewall, Squid, Web, Database, LDAP, Email, VPN, Kerberos, NFS, HPC, Cloud, Monitor, Backup, …)。自从 Puppet/Chef 之类的自动化配置工具流行以后,现在甚至有了一个新职位叫做 DevOps.

安装好 Puppet 后,就可以开始自己写配置代码了,当然也可以在网上找到别人的配置代码直接拿过来用,更妙的是一些通用的 Puppet 配置代码,比如配置一台 Nginx/PHP/MySQL、配置 NFS、配置 DHCP、配置 DNS、配置 OpenNebula 等等已经有人写成模块了,直接拷过来就可以用了。Example42 就是这样的开源 Puppet 模块大集合,包含了众多常用的服务器配置。

首先去 Example42 下载 Puppet 模块代码:

$ git clone http://github.com/example42/puppet-modules.git

看看 Example42 包含了哪些模块吧,几乎常用的都有,不用自己亲自去写配置:

$ cd puppet-modules/
$ ls
DOCS		example42	mysql		puppi		synbak
Example42-tools	exim		nagios		rails		sysctl
LICENSE		firewall	network		redis		sysklogd
README.rdoc	foo		nfs		repo		syslog-ng
Rakefile	foreman		nginx		resolver	tftp
activemq	git		nrpe		rootmail	timezone
apache		haproxy		ntp		rpmbuild	tomcat
apt		hardening	openldap	rsync		trac
autofs		hosts		openntpd	rsyslog		users
backup		iptables	openssh		samba		vagrant
bind		jboss		openvpn		sarg		varnish
clamav		jenkins		oracle		selinux		virtualbox
cobbler		lighttpd	pam		sendmail	vmware
collectd	link		php		snmpd		vsftpd
common		logrotate	phpsyslogng	spamassassin	wordpress
concat		lsb		portmap		splunk		xinetd
controltier	mailscanner	postfix		sqlgrey		yum
cron		mailx		postgresql	squid		zip
dashboard	mcollective	powerdns	squirrelmail
dhcpd		monit		psad		ssh
dovecot		monitor		psick		ssmtp
drupal		munin		puppet		stdlib42

把上面的 Example42 代码移到 /etc/puppet 目录,然后修改 Puppet 服务器的配置,加上 puppet-modules 模块路径,别忘了重启 puppetmaster 服务:

# mv puppet-modules /etc/puppet

# vi /etc/puppet/puppet.conf
...
[master]
    modulepath = /etc/puppet/puppet-modules

# /etc/init.d/puppetmaster

写个配置文件测试一下,自动配置 PHP + Apache + MySQL:

# vi /etc/puppet/manifests/node.pp

node 'web.vpsee.com' {
    include apache

    include php
    include php::pear
    include php::apc
    php::module { mysql: }
    php::module { curl: }
    php::module { gd: }
    php::module { idn: }
    php::module { imagick: }
    php::module { imap: }
    php::module { mcrypt: }
    php::module { ming: }
    php::module { ps: }
    php::module { pspell: }
    php::module { recode: }
    php::module { snmp: }
    php::module { tidy: }
    php::module { xmlrpc: }
    php::module { xsl: }
    php::module { ldap: }

    include mysql
}

在要配置的机器上执行下面一条命令就自动装上 Apache/PHP/MySQL 了,再不用自己手动去安装配置了:

# puppet agent --test --server=master.vpsee.com

评论 (28 Comments)

  1. 您這分享太牛了,感謝。

  2. 非常不错哦。Puppet自动化部署维护非常不错。

  3. 模块目录中的apache怎么是空的。怎么让client重新连接master?

  4. @ooopiece
    服务器端 puppet cert clean 以后客户端重新连接。

  5. 谢谢回复,我正在做这个实验,有几个问题,自动安装Apache/PHP/MySQL是用什么方式装的,yum还是编译?我在执行puppet agent –test –server=master.vpsee.com时,出现
    “err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class php::apc for client.vpsee.com at /etc/puppet/manifests/node.pp:6 on node client.vpsee.com”我试着把这行删了,再执行,提示php-mcrypt之类的一些找不到。
    再次感谢!

  6. 最近在折腾openstack,想请教VPSEE大牛问题:
    硬件环境:1 * Controller/Compute node(4 cores / 4GB memory) + 1 Compute node( 16cores /12GB memory)

    软件环境ok,创建多个m1.large类型instance都ok(m1.large: Memory: 8192MB, VCPUS: 4, Storage: 80GB, FlavorID: 4, Swap: 0MB, RXTX Quota: 0GB, RXTX Cap: 0MB)。

    而只创建一个m1.xlarge的instance一直pending状态,是什么原因啊?(m1.xlarge: Memory: 16384MB, VCPUS: 8, Storage: 160GB, FlavorID: 5, Swap: 0MB, RXTX Quota: 0GB, RXTX Cap: 0MB)

    Openstack能实现将多台server合并成一台super server吗?公司业务需要这种模型。

    many thanks!

  7. 请教,是用什么管理虚拟机?ganeti ? openstack ? 还是其他?

  8. @ooopiece
    采用 yum 方式。error 提示是说,没找到相关文件,检查一下文件名字和类的名字是否都正确,是否忘记在 site.pp 里面包含这个 web.vpsee.com 等等。

  9. @newbie
    penging 原因很多,要看日志。
    openstack 不适合这样用,你可以考虑集群的模式。

  10. @ebiss
    主要是 openstack 和 opennebula,还有 vmware.

  11. 请教,网站曾介绍过ganeti,没有用的原因是什么?

  12. @ebiss
    ganeti 生态环境没有 openstack 和 opennebula 大,貌似像个人项目,而且 ganeti 只适合40台以下的机器。

  13. thanks VPSEE!

    已经找到原因,超出node memory容量限制,openstack基于VM,VM不可能超过compute node的能力。

  14. 这里还有更多的puppet模块:http://forge.puppetlabs.com…

  15. 最新最潮的技术都在这里学习到了,谢谢

  16. err: /Stage[main]//Node[client.wwgp.com]/Php::Module[php-fpm]/Package[PhpModule_php-fpm]/ensure: change from absent to present failed: Execution of ‘/usr/bin/yum -d 0 -e 0 -y install php-fpm’ returned 1: Error: Nothing to do

    err: /Stage[main]//Node[client.wwgp.com]/Php::Module[php-xsl]/Package[PhpModule_php-xsl]/ensure: change from absent to present failed: Execution of ‘/usr/bin/yum -d 0 -e 0 -y install php-xsl’ returned 1: Error: Nothing to do

    err: /Stage[main]//Node[client.wwgp.com]/Php::Module[php-pspell]/Package[PhpModule_php-pspell]/ensure: change from absent to present failed: Execution of ‘/usr/bin/yum -d 0 -e 0 -y install phpphp-pspell’ returned 1: Error: Nothing to do

    err: /Stage[main]//Node[client.wwgp.com]/Php::Module[php-recode]/Package[PhpModule_php-recode]/ensure: change from absent to present failed: Execution of ‘/usr/bin/yum -d 0 -e 0 -y install php-recode’ returned 1: Error: Nothing to do

    err: /Stage[main]//Node[client.wwgp.com]/Php::Module[php-mcrypt]/Package[PhpModule_php-mcrypt]/ensure: change from absent to present failed: Execution of ‘/usr/bin/yum -d 0 -e 0 -y install php-mcrypt’ returned 1: Error: Nothing to do

    err: /Stage[main]//Node[client.wwgp.com]/Php::Module[php-ps]/Package[PhpModule_php-ps]/ensure: change from absent to present failed: Execution of ‘/usr/bin/yum -d 0 -e 0 -y install php-ps’ returned 1: Error: Nothing to do

  17. 我按照你的做,为什么php需要支持的模块都装报错

  18. # [*module_prefix*]
    # If package name prefix isn’t standard.
    #
    # == Examples
    # php::module { ‘gd’: }
    #
    # php::module { ‘gd’:
    # ensure => absent,
    # }
    #
    # This will install php-apc on debian instead of php5-apc
    #
    # php::module { ‘apc’:
    # module_prefix => “php-“,
    }
    #
    #
    define php::module (
    $version = $php::params::version,
    $service_autorestart = $php::params::service_autorestart,
    $service = $php::params::service,
    $module_prefix = $php::params::module_prefix,
    $absent = $php::params::absent
    ) {

    include php

    if $absent {
    $real_version = “absent”
    } else {
    $real_version = $version
    }

    $manage_service_autorestart = $service_autorestart ? {
    true => “Service[$service]”,
    false => undef,
    }

    $real_install_package = “${module_prefix}${name}”

    package { “PhpModule_${name}”:
    ensure => $version,
    name => $real_install_package,
    notify => $manage_service_autorestart,
    require => Package[‘php’],
    }

    }

    我的node.pp没有 include php::apc

    这个我定义个class 还想没有生效,默认是注释的, 这里应该怎么改

  19. @vpsee
    没有考虑用cloudstack来管理vm吗?

  20. @alife
    cloudstack 简单好用,界面也华丽,貌似社区热度不够。

  21. example 24 下载的,里面很多目录里面是空的,不知道咋回事

  22. 你好,如何在site.pp里面引入node.pp呢,并令其生效呢?

  23. @photoshop_wu
    在 site.pp 里 import “node” 即可。

  24. 很多目录都是空的,不能使用,郁闷

  25. 你好!按照文章的配置,在服务器上配置了site.pp 在客户端执行时,可以生成helloworld.txt文件,但在配置完node.pp,在客户端执行时,没什么响应只有一段提示
    [root@web ~]# puppet agent –test –server=master.vpsee.com
    info: Caching catalog for web.vpsee.com
    info: Applying configuration version ‘1369930441’
    notice: Finished catalog run in 0.02 seconds
    不知道怎么回事?

  26. include apache, 如何移除掉这module呢,找了很长时间都不知道怎样移除整个module以及它的配置文件盒依赖的module

  27. 按照文章说明配置,没有任何操作只出现如下提示,请问为什么会这样
    [root@client3 ~]# puppet agent –test –server=master.vpsee.com
    info: Caching catalog for client3.vpsee.com
    info: Applying configuration version ‘1381309216’
    notice: Finished catalog run in 0.02 seconds
    [root@client3 ~]#
    [root@client3 ~]#

  28. 你好 根据你的这个提示 我在客户端上进行操作时,出现错误提示信息:
    Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class apache for c.ilanni.com on node c.ilanni.com
    Warning: Not using cache on failed catalog
    Error: Could not retrieve catalog; skipping run

发表评论