介绍
在代理/主配置中设置Puppet后,您可能需要一些帮助编写Puppet清单和模块。 为了有效地使用Puppet,您必须了解如何构建清单和模块。 本教程涵盖Puppet代码基础知识,并将向您展示如何构建清单和模块,这将有助于您开始使用Puppet来管理服务器环境。 我们将展示三种不同的方式来使用Puppet在Ubuntu 14.04 VPS上配置LAMP。
先决条件
在开始本教程之前,您必须有一个工作代理/主Puppet设置。 如果你还没有,请按照本教程: 如何安装Puppet来管理服务器基础设施 。
您还需要能够创建至少一个新的VPS作为Puppet主节点将管理的Puppet代理节点。
创建新的代理节点
创建一个新的Ubuntu 14.04 VPS称为“灯1”, 将其添加为Puppet代理节点 ,并签署Puppet师的证书请求。
Puppet代码基础
在写入将配置我们的系统的Puppet代码之前,让我们退后一步,回顾一些相关的Puppet术语和概念。
资源
Puppet代码是由主要的资源声明 。 资源描述了系统状态,例如某个用户或文件应该存在,或者应该安装一个包。 这里是一个用户资源声明的例子:
user { 'mitchell':
ensure => present,
uid => '1000',
gid => '1000',
shell => '/bin/bash',
home => '/home/mitchell'
}
资源声明的格式如下:
resource_type { 'resource_name'
attribute => value
...
}
因此,先前的资源声明描述了具有指定属性的名为“mitchell”的用户资源。
要列出Puppet可用的所有默认资源类型,请输入以下命令:
puppet resource --types
在本教程中,我们将讨论更多的资源类型。
清单
Puppet程序称为清单。 舱单组成的Puppet代码,并且文件名使用.pp
扩展。 通过apt安装在Puppet默认的主清单是/etc/puppet/manifests/site.pp
。
如果您已遵循先决条件Puppet教程,那么您已经编写了一个创建文件并安装Apache的清单。 我们还将在本教程中再写几个。
类
在Puppet中,类是可以在别处的代码中调用的代码块。 使用类允许您重用Puppet代码,并且可以使读取清单更容易。
类定义
类定义是组成类的代码所在的地方。 定义类使得类可用于清单,但实际上不评估任何内容。
这里是一个类定义的格式化方式:
class example_class {
...
code
...
}
上面定义了一个名为“example_class”的类,Puppet代码将放在花括号之间。
类声明
当在清单中调用类时,会发生类声明。 类声明告诉Puppet来评估类中的代码。 类声明有两种不同的类型:normal和resource-like。
当发生正常类声明 include
关键字的Puppet代码中使用,就像这样:
include example_class
这将导致Puppet以评价example_class的代码。
当一个类被声明像资源,像这样发生的资源类类的声明 :
class { 'example_class': }
使用资源类类声明允许你指定类的参数 ,用于覆盖类属性的默认值。 如果你遵循的前提教程中,你已经使用的资源类类声明(“Apache”类),当您使用的PuppetLabs Apache模块host2上安装Apache:
node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
既然你知道资源,清单和类,你将需要了解模块。
模块
模块是清单和数据(如事实,文件和模板)的集合,它们具有特定的目录结构。 模块对于组织Puppet代码非常有用,因为它们允许您将代码拆分为多个清单。 最好的做法是使用模块来组织几乎所有的Puppet清单。
要添加一个模块Puppet,将其放置在/etc/puppet/modules
目录中。
我们将介绍编写自己的基本模块所需的细节。 如果您想了解更多详情,请查看PuppetLabs模块基础参考指南。
开发清单
为了演示如何编写一个Puppet体现,类和模块,我们将用Puppet来设置在Ubuntu的LAMP(类似于设置在本教程 )。 如果以前从未设置过LAMP,您将需要运行链接教程,以熟悉如何手动设置它。
从LAMP堆叠教程中,我们知道,我们希望与以下资源一个Ubuntu 14.04服务器:
- Apache包(apache2)安装
- Apache服务(apache2)运行
- MySQL服务器包(mysql-server)安装
- MySQL Server服务(mysql)运行
- PHP5包(php5)安装
- 测试PHP脚本文件(info.php)
- 在安装软件包之前更新apt
以下三个部分将显示使用Puppet实现类似结果的不同方法,一个工作的LAMP服务器。 第一个例子将显示如何写一个基本的清单,所有在一个文件。 第二个例子将展示如何构建和使用一个基于第一个例子中开发的清单的类和模块。 最后,第三个例子将显示如何使用预先存在的,公开可用的模块来快速和容易地建立类似的LAMP。 如果你想尝试所有三个例子,学习之用,我们建议开始用新鲜的VPS(如描述的先决条件的每一次)。
示例1:使用单个清单安装灯泡
如果你以前没有写过Puppet清单,这个例子是一个很好的开始。 清单将在Puppet代理节点上进行开发,并通过执行puppet apply
,因此不需要代理/主设置。
您将学习如何编写一个将使用以下类型的资源声明的清单:
- 高管 :要执行的命令,如
apt-get
- 包装 :要通过apt安装软件包
- 服务 :要确保服务正在运行
- 文件 :要确保存在某些文件
创建清单
在一个新的灯1 VPS,创建一个新的清单:
sudo vi /etc/puppet/manifests/lamp.pp
添加以下行以声明我们刚才确定我们想要的资源。 内联注释详述每个资源声明:
# execute 'apt-get update'
exec { 'apt-update': # exec resource named 'apt-update'
command => '/usr/bin/apt-get update' # command this resource will run
}
# install apache2 package
package { 'apache2':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure apache2 service is running
service { 'apache2':
ensure => running,
}
# install mysql-server package
package { 'mysql-server':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure mysql service is running
service { 'mysql':
ensure => running,
}
# install php5 package
package { 'php5':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure info.php file exists
file { '/var/www/html/info.php':
ensure => file,
content => '<?php phpinfo(); ?>', # phpinfo code
require => Package['apache2'], # require 'apache2' package before creating
}
保存并退出。
应用清单
现在,您将要使用的puppet apply
要执行的命令清单。 在灯1,运行如下命令:
sudo puppet apply --test
您将看到多行输出,显示您的服务器的状态如何更改,以匹配清单中的资源声明。 如果没有错误,您应该能够访问公共IP地址(或域名,如果你设置),并看到PHP信息页面,表明Apache和PHP工作。 您还可以验证MySQL是否已安装在您的服务器上(它尚未安全,但我们现在不必担心)。 恭喜! 你用Puppet设置了一个LAMP。
这个特定的设置不是太令人兴奋,因为我们没有利用我们的代理/主设置。 清单当前不可用于其他代理节点,并且Puppet不会连续检查(每30分钟)我们的服务器处于清单所描述的状态。
现在我们想将我们刚刚开发的清单转换成一个模块,所以它可以被其他Puppet节点使用。
示例2:通过创建新模块安装灯泡
现在让我们创建一个基本模块的基础上,LAMP清单的开发实例1中,我们将做到这一点的Puppet主节点上这个时候。 要创建一个模块,你必须创建一个目录(他的名字相匹配的模块名称)在Puppet的modules
目录中,且必须包含一个名为目录manifests
,以及目录必须包含一个init.pp
文件。 该init.pp
文件必须只包含模块名称匹配的Puppet类。
创建模块
在Puppet大师 ,创建一个名为模块的目录结构lamp
:
cd /etc/puppet/modules
sudo mkdir -p lamp/manifests
现在创建和编辑模块的init.pp
文件:
sudo vi lamp/manifests/init.pp
在此文件中,通过添加以下行为“lamp”类添加一个块:
class lamp {
}
复制先前创建(或从上述示例1的复制)LAMP清单的内容,并将其粘贴到灯类块。 在此文件中,您为“灯”类创建了类定义。 类中的代码此时将不进行求值,但可以声明。 此外,因为它符合用于定义模块的Puppet约定,所以该类可以作为模块被其他清单访问。
保存并退出。
在主显示中使用模块
现在,我们有一个基本的灯模块设置,让我们来配置我们的表现主要用它来对灯1安装LAMP。
在Puppet大师 ,编辑的主要表现:
sudo vi /etc/puppet/manifests/site.pp
假设该文件是空的,添加以下节点块(替换“灯1”要安装LAMPPuppet代理的主机名):
node default { }
node 'lamp-1' {
}
节点块允许您指定仅应用于某些代理节点的Puppet代码。 默认的节点适用于没有指定的节点区域内每个代理节点-我们将其留空。 该灯1个节点模块将应用到你的灯1Puppet代理节点。
在灯1个节点块,添加以下代码使用我们刚创建的“灯”模块:
include lamp
现在保存并退出。
你的灯-1Puppet代理节点从主拉其配置下一次,它会评估的主要表现,并应用指定LAMP设置模块。 如果你想马上尝试一下,运行灯1剂节点上下面的命令:
sudo puppet agent --test
一旦它完成,你会看到一个基本的LAMP设置,酷似例如1.要验证Apache和PHP正在努力,去在Web浏览器中的灯1的公网IP地址:
http://lamp_1_public_IP/info.php
您应该看到您的PHP安装的信息页。
请注意,您可以通过在其他节点块中声明它来重用您创建的“灯”模块。 使用模块是促进Puppet代码重用的最好方法,它有助于以逻辑方式组织代码。
现在我们将向您展示如何使用预先存在的模块来实现类似的设置。
示例3:使用预先存在的模块安装灯泡
还有就是公开可用的模块库,在日伪锻造 ,努力发展自己的基础架构时会非常有用。 Puppet锻造模块可以与内置的快速安装puppet module
命令。 它只是这样发生,安装和维护Apache和MySQL的模块可用在这里。 我们将演示如何使用它们来帮助我们设置我们的LAMP。
安装Apache和MySQL模块
在您的Puppet大师 ,安装puppetlabs-apache
模块:
sudo puppet module install puppetlabs-apache
您将看到以下输出,表示模块安装正确:
Notice: Preparing to install into /etc/puppetlabs/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apache (v1.0.1)
├── puppetlabs-concat (v1.0.0) [/etc/puppet/modules]
└── puppetlabs-stdlib (v3.2.0) [/etc/puppet/modules]
此外,安装puppetlabs-mysql
模块:
sudo puppet module install puppetlabs-mysql
现在,Apache和MySQL模块可供使用!
编辑主清单
现在让我们编辑我们的主清单,使它使用新的模块来安装我们的LAMP。
在Puppet大师 ,编辑的主要表现:
sudo vi /etc/puppet/manifests/site.pp
假设该文件是空的,添加以下节点块(如果你按照实例2,只是删除灯1个节点块的内容):
node default { }
node 'lamp-1' {
}
内的灯1个节点块,使用资源类类声明中使用Apache模块(在该行注释解释每行):
class { 'apache': # use the "apache" module
default_vhost => false, # don't use the default vhost
default_mods => false, # don't load default mods
mpm_module => 'prefork', # use the "prefork" mpm_module
}
include apache::mod::php # include mod php
apache::vhost { 'example.com': # create a vhost called "example.com"
port => '80', # use port 80
docroot => '/var/www/html', # set the docroot to the /var/www/html
}
使用Apache模块都可以通过重写模块的默认行为参数。 我们传递一些基本设置,禁用模块创建的默认虚拟主机,并确保我们创建一个可以使用PHP的虚拟主机。 对于PuppetLabs-Apache模块的完整文档,看看它的自述 。
使用MySQL模块类似于使用Apache模块。 我们将保持简单,因为我们目前还没有使用数据库。 在节点块中添加以下行:
class { 'mysql::server':
root_password => 'password',
}
像Apache模块,MySQL的模块可以通过传递参数(配置这里的完整文档 。
现在让我们添加确保info.php被复制到正确位置的文件资源。 这一次,我们将使用source参数指定的文件进行复制。 在节点块中添加以下行:
file { 'info.php': # file resource name
path => '/var/www/html/info.php', # destination path
ensure => file,
require => Class['apache'], # require apache class be used
source => 'puppet:///modules/apache/info.php', # specify location of file to be copied
}
这个文件资源声明与以前略有不同。 主要的区别是,我们指定源参数,而不是内容的参数。 消息人士告诉Puppet过度复制而不是简单地指定文件的内容的文件。 指定源, puppet:///modules/apache/info.php
得到由Puppet演绎成/etc/puppet/modules/apache/files/info.php
,所以我们必须先创建源文件,该资源声明好好工作。
保存并退出site.pp
。
创建info.php
使用以下命令文件中:
sudo sh -c 'echo "<?php phpinfo(); ?>" > /etc/puppet/modules/apache/files/info.php'
你的灯-1Puppet代理节点从主拉其配置下一次,它会评估的主要表现,并应用指定LAMP设置模块。 如果你想马上尝试一下,运行灯1剂节点上下面的命令:
sudo puppet agent --test
一旦它完成,你会看到一个基本的LAMP设置,酷似例如1.要验证Apache和PHP正在努力,去在Web浏览器中的灯1的公网IP地址:
http://lamp_1_public_IP/info.php
您应该看到您的PHP安装的信息页。
结论
恭喜! 你已经使用Puppet设置一个Ubuntu 14.04 LAMP。
现在,您已经熟悉Puppet代码的基础知识,并且能够编写基本清单和模块,您应该尝试使用Puppet配置环境的其他方面。
一个好的开始是使用Puppet来管理系统用户和应用程序配置文件。 请记住,如果您使用Puppet来管理资源,那么您必须对Puppet主服务器上的这些特定资源进行更改,否则下次您的代理节点执行其周期性目录提取请求时,这些资源将被覆盖。
祝你好运!