《Puppet实战手册》——1.7 使用cron运行Puppet

1.7 使用cron运行Puppet

通过已有的配置,已经可以做很多事情,包括在团队中管理Puppet清单,通过GitHub同步变更,使用papply脚本在机器上手动应用配置变更。

然而,截至目前还是需要手动登录到每台机器上更新Git仓库并重新运行Puppet。如果每台机器可以自动更新并应用变更,就更方便了。这样,只需要将修改推送至仓库,所有机器就会在一定时间范围内自动完成配置的变更。

做到这一点最简单的方法就是使用cron作业,定期从仓库更新配置文件并在有变更时运行Puppet。

准备工作
首先,需要在前面的1.4节和1.5节中设置的Git仓库以及1.6节中的papply脚本。

然后,还需要创建一个SSH秘钥,每台机器使用它进行认证,从Git仓库拉取变更。创建SSH秘钥可参考如下步骤。

1. 运行以下命令,创建密钥文件。

ubuntu@cookbook:~/puppet$ ssh-keygen -f ubuntu
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ubuntu.
Your public key has been saved in ubuntu.pub.
The key fingerprint is:
ae:80:48:1c:14:51:d6:b1:73:4f:60:e2:cf:3d:ce:f1 ubuntu@cookbook
The key's randomart image is:
+--[ RSA 2048]----+
| ++o.o.o      |
|   +        |
|   +        |
|   = +       |
| o   oS=      |
|    o +      |
|     o E      |
|          |
|          |
+-----------------+

2. 打印ubuntu.pub文件的内容。

ubuntu@cookbook:~/puppet$ cat ubuntu.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8EsdLAZHIg1nnMzJuIQ5jEcFL1W 
I5AVhml6Z3Gw4zc4xw6F1Citomc+3DexcaD+y3VrD3WEOGcXweCsxJF0EGyJoc4RbP 
AJaP3D4V/+9FQVZcH90GukasvtIrfJYy2KFfRBROKtrfckMbBlWF7U2U+FwaalMOtg 
LzZeECSDU4eYuheN3UVcyg9Zx87zrLYU5EK1JH2WVoZd3UmdH73/rwPJWtSEQ3xs9A 
2wMr0lJsCF4CcFCVwrAIoEf5WzIoHbhWyZaVyPR4gHUHd3wNIzC0rmoRiYwE5uYvVB 
ObLN10uZhn7zGPWHEc5tYU7DMbz61iTe4NLtauwJkZxmXUiPJh ubuntu@cookbook

复制上面的内容并将其作为部署密钥添加至GitHub仓库(参考GitHub关于这部分内容的操作指南)。这样,会授权这个密钥可以从GitHub中克隆Puppet仓库。

操作步骤
具体步骤如下。

1. 移动公钥文件到puppet模块。

ubuntu@cookbook:~/puppet$ mv ubuntu.pub
 modules/puppet/files/ubuntu.pub

2. 不要将私钥放进Puppet仓库(需要通过其他通道来分发私钥到那些需要检出仓库的机器中)。

3. 参照下面的内容,创建modules/puppet/files/pull-updates.sh文件。

#!/bin/sh
cd /home/ubuntu/puppet
git pull && /usr/local/bin/papply

4. 参照下面的内容,修改modules/puppet/manifests/init.pp文件。

class puppet { 
 file { '/usr/local/bin/papply':
   source => 'puppet:///modules/puppet/papply.sh',
   mode  => '0755',
 }

 file { '/usr/local/bin/pull-updates':
   source => 'puppet:///modules/puppet/pull-updates.sh',
   mode  => '0755',
 }

 file { '/home/ubuntu/.ssh/id_rsa':
   source => 'puppet:///modules/puppet/ubuntu.priv',
   owner  => 'ubuntu',
   mode  => '0600',
 }

 cron { 'run-puppet':
   ensure => present,
   user   => 'ubuntu',
   command => '/usr/local/bin/pull-updates',
   minute => '*/10',
   hour   => '*',
 }
}

5. 运行Puppet。

ubuntu@cookbook:~/puppet$ papply
Notice: /Stage[main]/Puppet/Cron[run-puppet]/ensure: created
Notice: /Stage[main]/Puppet/File[/usr/local/bin/pull-updates]/ensure: 
  defined content as'{md5}20cfc6cf2a40155d4055d475a109137d'
Notice: /Stage[main]/Puppet/File[/home/ubuntu/.ssh/id_rsa]/ensure:
   defined content as '{md5}db19f750104d3bf4e2603136553c6f3e'
Notice: Finished catalog run in 0.27 seconds

6. 测试新的SSH密钥是否已经正确获得GitHub授权。

ubuntu@cookbook:~/puppet$ ssh git@github.com
PTY allocation request failed on channel 0
Hi bitfield/cookbook! You've successfully authenticated, but
 GitHub does not provide shell access.
Connection to github.com closed.

7. 检查pull-updates脚本是否正常工作。

ubuntu@cookbook:~/puppet$ pull-updates
Already up-to-date.
Notice: Finished catalog run in 0.16 seconds

工作原理
到现在为止,已经实现了从被管理的服务器上通过SSH认证访问GitHub(使用SSH代理转发),但是如果不登录到服务器并执行相关命令,服务器就不能自动拉取更新。所以,此处创建了一个新的SSH密钥对,将公钥作为部署密钥添加到GitHub,使拥有密钥文件的服务器可以访问仓库。

将这个私钥作为ubuntu用户默认的SSH密钥。

file { '/home/ubuntu/.ssh/id_rsa':
  source => 'puppet:///modules/puppet/ubuntu.priv',
  owner  => 'ubuntu',
  mode  => '0600',
}

这使得用户ubuntu可以在puppet目录运行git pull命令。此外,还增加了pull-updates脚本来执行这条命令,并在有任何配置更改时运行Puppet。

#!/bin/sh
cd /home/ubuntu/puppet
git pull && papply

将这个脚本部署到所有的Puppet主机上:

file { '/usr/local/bin/pull-updates':
  source => 'puppet:///modules/puppet/pull-updates.sh',
  mode  => '0755',
}

最后,创建一个定期运行pull-updates的cron作业(每10分钟一次,但是可以根据自己的需求去修改)。

cron { 'run-puppet':
  ensure  => present,
  command => '/usr/local/bin/pull-updates',
  minute  => '*/10',
  hour   => '*',
}

更多参考
恭喜,你现在拥有了一个全自动化的Puppet基础设施!只要在一台新机器上检出仓库代码并应用了配置清单,这台机器就会自动的定期拉取新的变化并应用这些变更。

举一个例子,如果需要在所有机器上添加一个新用户,需要做的就是将用户添加到配置清单的工作副本中,提交并推送到GitHub。等待10分钟,它就会自动应用到所有Puppet机器上。

这是非常方便的,但是,有时人们希望能够将变更立刻应用到特定的机器,而无须等待cron作业的执行。此时,可以使用Rake工作实现这个功能。在下一节中,本书将介绍如何来实现这些。

时间: 2024-08-13 20:50:04

《Puppet实战手册》——1.7 使用cron运行Puppet的相关文章

《Puppet实战手册》——第1章 Puppet基础设施 1.1 简介

第1章 Puppet基础设施 未来计算机可能只有1000个真空管,而且只有1.5吨重. --<大众机械>(Popular Mechanics),1949 本章内容包括: 安装Puppet创建一个配置清单利用Git管理配置清单创建去中心化Puppet架构编写papply脚本使用cron运行Puppet利用Rake部署变更利用Rake引导Puppet运行利用Git钩子自动进行语法检查 1.1 简介 本书包含一些代表着Puppet社区认同的最佳实践的实例,一些可以帮助读者在工作中更容易使用Puppe

《Puppet实战手册》——导读

** 前言 **IT运维领域正在进行一场革命.新一代的配置管理工具可以在几秒内完成大量服务器的构建(配置)和整个网络自动化.为了充分利用云计算的强大功能,并且建立可靠.可扩展.安全.高性能的系统,拥有Puppet这样的工具是必不可少的.本书不仅讲解了Puppet的基础知识,而且深入探讨了Puppet的所有强大功能,详细展示了如何解决现实中的各种问题和应用场景.每一步操作都完整地展示了需要录入的命令,并且每一个技巧都有完整的代码示例. 本书带领读者从Puppet的基本知识开始,完整.专业地讲解Pu

《Puppet实战手册》——1.9 利用Rake引导Puppet运行

1.9 利用Rake引导Puppet运行 如果希望让新的服务器成为Puppet基础设施的一部分,只需要在服务器上面运行几条命令就可以实现,但现在通过为Rakefile添加新引导任务的方式使这一过程更加简单. 准备工作 参考如下步骤,为这个方面做一些准备. 1. 将下面这行添加至Rakefile文件顶部. REPO = 'git@github.com:bitfield/cookbook.git' 2. 将下面的任务添加至Rakefile文件的任意位置. desc "Bootstrap Puppet

《Puppet实战手册》——2.4 使用模块

2.4 使用模块 能够使Puppet配置清单清晰并且易于维护的最重要的方式之一就是将它们组织成模块. 模块是将相关的事物进行组合的一种简单方式.例如,一个webserver模块应该包括让一台机器作为Web服务器所必需的一切:Apache的配置文件.虚拟主机模板和一些必要的用来部署它们(Apache的配置文件.虚拟主机模板)的Puppet代码. 把代码拆分成不同的模块可以使它们更易于复用和共享,这也是组织配置清单的最合理的方式.下例将创建一个模块来管理memcached(一款在Web应用程序中非常

《Puppet实战手册》——1.4 利用Git管理配置清单

1.4 利用Git管理配置清单 把Puppet配置清单存放在版本控制系统Git或Subversion中管理(推荐Git),所有Puppet管理的机器都从仓库取出配置,这是一个非常好的想法.它有以下几个优点. 可以取消对配置清单的更改并回滚至以前任意一个版本. 可以使用新的分支(branch)来测试新功能. 如果有多人需要修改配置清单,可以分别独立在自己的工作副本上进行,然后再合并所有的修改. 可以使用git log功能查看谁在什么时候做了什么修改. 准备工作 本节将导入现有的清单文件到Git仓库

《Puppet实战手册》——1.5 创建去中心化Puppet架构

1.5 创建去中心化Puppet架构 有些系统分散管理时会工作得更好. 使用Puppet最常见的方法就是运行一台Puppet Master服务器,Puppet客户端连接到Puppet Master并接收各自的配置清单.然而,Puppet Master并不是必需的,可以直接在配置清单文件上运行puppet apply命令来应用变更. ubuntu@cookbook:~/puppet$ puppet apply manifests/site.pp Notice: Finished catalog r

《Puppet实战手册》——1.6 编写papply脚本

1.6 编写papply脚本 人们希望可以尽量简单和简单地将Puppet配置应用到主机上,因此,通常会写一个脚本,它包含puppet apply命令和所需要的参数.要部署这个脚本到需要它的地方,除了Puppet,还有什么更好的工具吗? 操作步骤具体步骤如下. 1. 在Puppet仓库目录中创建puppet模块必需的目录. ubuntu@cookbook:~/puppet$ mkdir modules ubuntu@cookbook:~/puppet$ mkdir modules/puppet u

《Puppet实战手册》——2.12 使用正则表达式进行替换

2.12 使用正则表达式进行替换 Puppet通过regsubst函数提供了一种简单的方式来处理文本,在字符串中进行搜索和替换,或者从字符串中提取所需模式(子串).人们经常需要用它来处理来自fact或来自外部程序的数据. 在这个例子中,读者将看到如何使用regsubst提取IPv4地址的前三位(网络部分,假设它是一个C类地址). 操作步骤按照下面的步骤来完成示例. 1. 在配置清单中添加下面的代码: $class_c = regsubst($::ipaddress, '(.*)\..*', '\

《Puppet实战手册》——2.11 使用in运算符

2.11 使用in运算符 in运算符可以用来测试一个字符串中是否包含另一个字符串,下面是一个例子. if 'spring' in 'springfield'如果字符串spring是springfield的子字符串(事实上是这样的),则上面表达式的值为true.in运算符也可以用于数组的包含关系测试,如下: if $crewmember in ['Frank', 'Dave', 'HAL' ]当in运算符同散列一起使用时,它会测试当前字符串是否是散列的键. $interfaces = { 'lo'