用 Puppet 搭建易管理的服务器基础架构(2)

我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第二部分。

原文地址:http://blog.jobbole.com/87680/

本文由 伯乐在线 - Wing 翻译,黄利民 校稿。未经许可,禁止转载!
英文出处:Manue Kiessling。欢迎加入翻译组

关于

第一部分,我们已经建立了两个Linux系统虚拟机:puppetserver 和 puppetclient。我们已经实现了一个重要的里程碑:在虚拟机上分别安装了Puppet服务器和Puppet客户端软件,并且在Puppet服务器端对Puppet客户端进行了认证。接下来我们要在此基础上,开始通过在puppetserver虚拟机上的Puppet服务器,来配置puppetclient虚拟机系统。

你好,Puppet

我们以一个非常基本的示例开始。在这个示例中,我们为puppetclient虚拟机建立一个非常简单的配置:在puppetclient虚拟机系统的/home/ubuntu目录下创建一个名为helloworld.txt文件,文件的内容是”Hello World!”。

Puppet自带一个功能强大的声明式配置语言。我们使用这种语言来编写的内容被称为清单(manifest。Puppet清单是一个文件,它描述了目标系统中的某些方面应该是什么样的。在这个系列教程中,我们会编写很多不同的清单:其中一些会在目标系统上创建一些文件;一些会创建用户账户;一些会安装软件包。

清单会被应用到目标系统上。对Puppet来说,目标系统被称为节点(node)。我们的puppetclient虚拟机系统就是这样一个节点。我们已经为它做了Puppet服务器认证,这样可以保证Puppet服务器来管理这个节点。但我们的服务器还没有任何信息,可以用来管理这个节点。我们可以通过编写一个清单并将其放在节点上来改变它。

为此,我们会创建一个非常简单的清单定义,这个定义会被放在puppetserver虚拟机系统的主清单文件中,文件的路径是/etc/puppet/manifests/site.pp:

/etc/puppet/manifests/site.pp on puppetserver


1

2

3

4

5

6

7

8

9

10

node "puppetclient" {

  file { "/root/helloworld.txt":

    ensure => file,

    owner  => "root",

    group  => "root",

    mode   => 0644

  }

}

我们稍后会看到,清单可以通过模块化的方式放到任意数目的不同文件中(这样可以帮助我们针对大型复杂的站点建立清单结构)。但是一切都还是从site.pp开始。

我们来仔细分析一下这个最简化的清单,它包含两部分:一个包含file定义的node,因为file部分包含在node部分中,这样file部分的定义产生的结果会应用到名为puppetclient的节点上。

通过在puppetclient虚拟机系统上运行Puppet代理,我们可以很容易理解上面描述的内容。

On the puppetclient VM


1

2

3

4

~# sudo puppet agent --verbose --no-daemonize --onetime

info: Caching catalog for puppetclientinfo: Applying configuration version ‘1395862307‘

notice: /Stage[main]//Node[puppetclient]/File[/home/ubuntu/helloworld.txt]/ensure: created

notice: Finished catalog run in 0.03 seconds

或许这看上去没有什么大惊小怪:puppetclient虚拟机上的Puppet代理联系到puppetserver虚拟机上的Puppet master。然后它接收目录,这个目标就是在master上定义的所有和这个指定客户端有关的清单。如果你感兴趣的话,这个目录被存在一个yaml结构中,它存储在 /var/lib/puppet/client_yaml/catalog/puppetclient.yaml 中,这不仅仅是复制了我们的.pp清单,而是通过对清单进行解析,生成的一个关于目标配置信息的编译版本。

接下来,Puppet代理开始采取行动——当且仅当满足以下条件才会采取行动:Puppet代理会比较清单中期望的状况和目标节点上清单的状况,如果其中有一些不同(如果目标节点上找到的状况并没有同步到期望达到的状况)——那么代理就会做任何必需的操作来移除这些区别,来实现目标状况。

在我们这个特定的示例中,代理知道在目标节点的/home/ubuntu目录下,应该有一个名为helloworld.txt的文件,这个文件的所有者和所在组是ubuntu,用户对该文件的访问权限是0644。然而,当检查本地系统时,发现并没有发现这个文件。代理会采取行动,来创建这个期待中的文件。

我们可以通过再次运行代理来验证这个行为:

On the puppetclient VM


1

2

3

4

~# sudo puppet agent --verbose --no-daemonize --onetime

info: Caching catalog for puppetclient

info: Applying configuration version ‘1395862542‘

notice: Finished catalog run in 0.03 seconds

如我们所见,这次代理并没有做任何事情,这是因为目标节点的状况已经满足了。那如果我们修改目标节点上的状况会怎么样呢?让我们来修改这个文件的访问模式:

在 puppetclient VM 上

~# chmod 0640 /home/ubuntu/helloworld.txt

然后再次运行代理:

在 puppetclient VM 上


1

2

3

4

5

6

~# sudo puppet agent --verbose --no-daemonize --onetime

info: Caching catalog for puppetclient

info: Applying configuration version ‘1395862307‘

notice: /Stage[main]//Node[puppetclient]/File[/home/ubuntu/helloworld.txt]/ensure: created

notice: Finished catalog run in 0.03 seconds

代理注意到了区别,然后通过修改文件访问模式来移除了这个区别。

如果我们修改了文件的内容,会发生什么呢?

在 puppetclient VM 上

~# echo "This is a test" > /home/ubuntu/helloworld.txt

…这时运行代理?

在 puppetclient VM 上


1

2

3

4

5

~# sudo puppet agent --verbose --no-daemonize --onetime

info: Caching catalog for puppetclient

info: Applying configuration version ‘1395862542‘

notice: Finished catalog run in 0.03 seconds

没有发生任何事情。为什么?因为在清单中,我们没有对文件内容进行任何描述。我们所做的是让Puppet来保证这个指定名字的文件是存在的,并且这个文件的一些元数据(拥有者、用户组、访问模式)应该有指定设置。Puppet只会关心那些我们让它去关心的事情。

我们在之前示例中看到的行为,正好表明了Puppet哲学的核心。在我们的清单中,我们不告诉Puppet做什么,我们也不告诉它怎么去做,我们只告诉Puppet最终的结果应该是什么样子

这种哲学带来了巨大的能量,因为它对配置系统所需要的繁重的工作进行了抽象。它抚平了不同的操作系统带来的差别。考虑下面一个场景,你有一个由不同的Linux系统构成的网络:有些运行Red Hat Linux,有些在运行Ubuntu Linux。我们进一步假设你希望在所有的系统上安装htop包。如果我们需要告诉Puppet做什么和怎么做,那么我们不得不编写一个清单,它在Ubuntu上使用apt-get,在Red Hat上使用yum。相反,我们所需要放到清单中的内容如下所示:


1

2

3

package { "htop":

  ensure => installed

}

目标节点中的puppet代理会去搞清楚如何做,才能实现清单中描述的目标场景。Red Hat系统中的代理会使用yum来安装包,而Ubuntu系统中的代理则会使用apt-get

我们在稍后会回来讨论包安装,让我们继续之前的文件示例。通过Puppet来创建一个空文件,通常都不是特别有用——当然我们更喜欢部署一些带内容的文件。Puppet可以很容易做到:我们可以将文件放在puppetserver虚拟机上,然后通过Puppet将其传输到puppetclient虚拟机上。

首先,我们在puppetserver虚拟机上创建源文件:

在 puppetserver VM 上


1

2

3

~# sudo -s

~# mkdir /etc/puppet/files

~# echo "Hello World." > /etc/puppet/files/helloworld.txt

然后,我们需要允许Puppet客户端来访问这个文件,为此,我们需要修改puppetserver虚拟机上的/etc/puppet/fileserver.conf文件,添加一个allow *语句:

/etc/puppet/fileserver.conf on puppetserver


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# This file consists of arbitrarily named sections/modules

# defining where files are served from and to whom

# Define a section ‘files‘

# Adapt the allow/deny settings to your needs. Order

# for allow/deny does not matter, allow always takes precedence

# over deny

[files]

  path /etc/puppet/files

  allow *

#  allow *.example.com

#  deny *.evil.example.com

#  allow 192.168.0.0/24

[plugins]

#  allow *.example.com

#  deny *.evil.example.com

#  allow 192.168.0.0/24

现在我们可以修改/etc/puppet/manifest/site.pp清单文件,扩展其中已有的file块:

/etc/puppet/manifests/site.pp on puppetserver


1

2

3

4

5

6

7

8

9

10

11

node "puppetclient" {

  file { "/root/helloworld.txt":

    ensure => file,

    owner  => "root",

    group  => "root",

    mode   => 0644,

    source => "puppet://puppetserver/files/helloworld.txt"

  }

}

让我们再次运行客户端系统上的代理:

在 puppetclient VM 上


1

2

3

4

5

6

7

8

~# sudo puppet agent --verbose --no-daemonize --onetime

info: Caching catalog for puppetclient

info: Applying configuration version ‘1395878127‘

info: FileBucket adding {md5}ff22941336956098ae9a564289d1bf1b

info: /Stage[main]//Node[puppetclient]/File[/home/ubuntu/helloworld.txt]: Filebucketed /home/ubuntu/helloworld.txt to puppet with sum ff22941336956098ae9a564289d1bf1b

notice: /Stage[main]//Node[puppetclient]/File[/home/ubuntu/helloworld.txt]/content: content changed ‘{md5}ff22941336956098ae9a564289d1bf1b‘ to ‘{md5}770b95bb61d5b0406c135b6e42260580‘

notice: Finished catalog run in 0.09 seconds

现在Puppet代理的确会关心文件的内容,它会使用从puppetserver虚拟机上得到的文件,来覆盖现有文件。

第三部分中,我们会看一个更复杂的清单,以及如何将清单组织成不同的模块。

时间: 2024-10-25 05:45:32

用 Puppet 搭建易管理的服务器基础架构(2)的相关文章

[翻译]用 Puppet 搭建易管理的服务器基础架构(3)

我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加入翻译组. <用 Puppet 搭建易管理的服务器基础架构(1)> <用 Puppet 搭建易管理的服务器基础架构(2)> 关于 在<用 Puppet 搭建易管理的服务器基础架构(2)>中,我们在 Puppet master上编写了第一个非常简单的清单,来对puppetcl

用 Puppet 搭建易管理的服务器基础架构(1)

我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第一部分. 原文地址:http://blog.jobbole.com/87679/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manue Kiessling.欢迎加入翻译组. 关于 Puppet Puppet 是一种 Linux.Unix.Windows 平台的集中配置管理系统,使用自有的 Puppet 描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.Puppet把这些系统

证书服务器CA的搭建和管理

很多时候,我们希望在使用互联网的时候,我们的通信是受到保护的,而在互联网上活动时使用最多的莫过于使用网站了,所以我们就需要考虑如何加密使用网站的过程中所传送的消息,htts加密协议的出现解决了我们的困扰,而htts协议是基于证书的方式实现的,那如何用证书来保护我们在网站上所传送的消息了,要想使用证书,要么向互联上的专业证书机构去申请证书,要么自己搭建证书服务器(CA)来给自己的网络设备颁发证书,以保证相互之间的通信是通过加密协议传输的.当然如果去向专业的证书机构申请证书是需要花费较大代价的,所以

【Hadoop基础教程】1、Hadoop之服务器基础环境搭建

本blog以K-Master服务器基础环境配置为例分别演示用户配置.sudo权限配置.网路配置.关闭防火墙.安装JDK工具等.用户需参照以下步骤完成KVMSlave1~KVMSlave3服务器的基础环境配置. 开发环境 硬件环境:Centos 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1.7.0_45.hadoop-1.2.1 1.安装环境 硬件环境:Centos 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java

Hadoop之服务器基础环境搭建

本文以K-Master服务器基础环境配置为例分别演示用户配置.sudo权限配置.网路配置.关闭防火墙.安装JDK工具等.用户需参照以下步骤完成KVMSlave1~KVMSlave3服务器的基础环境配置. 开发环境 硬件环境:CentOS 6.5 服务器4台(一台为Master节点,三台为Slave节点)  软件环境:Java 1.7.0_45.Hadoop-1.2.1 1.安装环境 硬件环境:CentOS 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1

【Hadoop基础教程】1、Hadoop之服务器基础环境搭建(转)

本blog以K-Master服务器基础环境配置为例分别演示用户配置.sudo权限配置.网路配置.关闭防火墙.安装JDK工具等.用户需参照以下步骤完成KVMSlave1~KVMSlave3服务器的基础环境配置. 开发环境 硬件环境:Centos 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1.7.0_45.hadoop-1.2.1 hadoop1.X和hadoop2.X的文件结构已经完全不一样了,网上很少看到hadoop1.X以上的安装示例教程,我选择的

linux下用puppet搭建lamp和lnmp

puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系. puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互.每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步.每个puppet客户端每半小时(可以设置)连接一次服务器

Linux下的ssh环境搭建与管理

Linux下的ssh环境搭建与管理 实验环境 1:网桥模式 2:安装好vmtoos 3:安装好yum 4:安装好ssh相关软件包 5:服务端:xuegod-63   IP:192.168.1.63 客户端:xuegod-64   IP:192.168.1.64 客户端普通用户:ceshi  密码:123456 6:安装好扫描软件rpm -ivh/mnt/Packages/nmap-5.21-4.el6.x86_64.rpm 实验目标 1:SSHD服务介绍 2:SSHD服务安装配置 3:两Linu

ssh环境搭建与管理(详解)

ssh环境搭建与管理 (详解) 实验环境 服务端:xuegod-63   IP:192.168.1.63 客户端:xuegod-64   IP:192.168.1.64 客户端普通用户:ceshi  密码:123456 安装好扫描软件rpm -ivh /mnt/Packages/nmap-5.21-4.el6.x86_64.rpm 实验目标 1:SSHD服务介绍 2:SSHD服务安装配置 3:两Linux服务器之间数据拷贝 4:SSHD服务作用: 实验步骤 1:搭建环境 1):网桥模式 2):v