为了便于我们的学习和管理,建议大家把puppet的代码纳入版本控制系统,SVN或者GIT都可以,使用都很方便,上手也比较简单,在此就不多说了。
模块是puppet清单的结构化集合,默认情况下,puppet会搜索模块路径来寻找模块并载入他们,这个路径默认是/etc/puppet/modules和/var/lib/puppet/modules,它有modulepath选项所控制,这一特性意味着我们不需要载入任何一个模块文件到puppet中,所有的一切都是自动进行的。
下面开始创建我们的第一个模块管理SSH
1、首先创建一个正确的模块结构,我们将在puppet master的/etc/puppet/module/目录下做这件事
-
$cd /etc/puppet/module
-
$mkdir -p ssh/{files,manifests,templates}
-
$touch ssh/manifests/init.pp #######默认puppet没有init.pp的初始文件,服务是无法启动的,即使是空文件;
接下来,我们在init.pp文件中创建一些类和初始化资源
-
class ssh::install {
-
package { "openssh":
-
ensure => present,
-
}
-
}
-
class ssh::config {
-
file { "/etc/ssh/sshd_config":
-
ensure => present,
-
owner => root,
-
group => root,
-
mode => 600,
-
source => "puppet:///modules/ssh/sshd_config",
-
require => Class["ssh::install"],
-
motify => Class["ssh::service"],
-
}
-
}
-
class ssh::service {
-
service { "sshd":
-
ensure => running,
-
hasstatus => true,
-
hasrestart => true,
-
enable => true,
-
require => Class["ssh::config"].
-
}
-
}
-
class ssh {
-
include ssh::install,ssh::config,ssh::service
-
}
我们创建了四个类:ssh,ssh::install,ssh::config,ssh::service,我们用::命名空间语法作为模块中创建结构和组织的一种方法,ssh前缀告诉puppet每一个类都属于ssh模块,那些后缀则是类名。
如此在init.pp文件中越来越多的类和资源意味着这个文件将很快变得混乱和难以管理,还好puppet有一个比较方便的方式来管理这些类,每一个类都可以放在manifests目录中的一个独立文件中,比如ssh/manifests/install.pp文件就可以包含ssh::install类
-
class ssh::install {
package { "openssh":
ensure => present,
}
}
这样我们的init.pp文件就只包含class ssh 这一个类了,那看看我们现在的目录结构吧
ssh
ssh/files/sshd_config
ssh/manifests/init.pp
ssh/manifests/install.pp
ssh/manifests/config.pp
ssh/manifests/service.pp
ssh/templates
很简洁吧,还方便理解和管理
2、让我们的agent实现一下吧
首先要在master上定义我们的节点需要做的事情
编译 /etc/puppet/manifests/node.pp
-
node 'slave.puppet.com' {
-
include ssh
-
}
OK
去客户端上执行puppet --test就会实现我们这篇的目的了。
阅读(1457) | 评论(0) | 转发(0) |