扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在上一篇文章中向大家介绍了在linux服务器如何安装cfengine(配置引擎),下面笔者开始配置cfengine管理Linux服务器。
一、创建基本的配置文件
这些配置文件需要放置在配置服务器上的主配置目录中。这些文件都是公共文件并以最初形式在网络中的每台服务器上使用。
(1) cfservd.conf示例
下面是cfservd守护进程的配置文件。它允许客户机传送主配置文件集合,还允许通过cfrun
远程执行cfagent。显然,只有一个系统允许访问中心配置文件(服务器),但是,允许cfservd访问这些文件不会损害其他系统上的任何文件(因为它们不复制这些文件)。但是,所有系统都可以从远程执行cfagent中获益,因为它允许从远程系统中按需执行cfagent。因此,可以在所有系统中使用下列cfservd.conf,这正是我们所需要的功能:
control:
domain=(mydomain.com)
AllowUsers=(root)
cfrunCommand=("/var/cfagent/bin/cfagent")
admit:
/usr/local/var/cfengine/inputs*.mydomain.com
/var/cfagent/bin/cfagent*.mydomain.com
Cfrun Command设置指定在接收到来自cfrun的连接时,要执行的cfagent二进制文件的位
置。admit段非常重要,因为它指定哪个主机访问哪个文件。您必须授予对中心配置目录和cfagent二进制文件的访问权。您还需要对客户机需要从此服务器传送的任何其他文件授予访问权。
(2)基本update.conf
update.conf文件必须尽可能地简单并应进行较少的更改。此文件在cfagent.conf之前由
cfagent分析和执行。如果cfagent.conf文件已受损,则在下次客户机执行cfagent时,它们会获得新版本,因为其update.conf文件仍然有效。损坏的update.conf文件会带来麻烦,因此建议在将文件放入中心配置目录时,对任何更改都要进行彻底的测试。另外,此文件在每台主机(包括服务器)上运行。cfagent命令很巧妙,在配置服务器上运行时在本地复制文件(而非通过网络)。control段定义一些变量,然后在copy段使用。可以通过$(var)或${var}序列来完成变量替代。
1 control:
2 actionsequence = ( copy tidy )
3 domain = ( mydomain.com )
4 workdir = ( /var/cfengine )
5 policyhost = ( server.mydomain.com )
6 master_cfinput = ( /usr/local/var/cfengine/inputs )
7 cf_install_dir = ( /usr/local/sbin )
8
9 copy:
10 $(cf_install_dir)/cfagent dest=$(workdir)/bin/cfagent
11 mode=755
12 type=checksum
13
14 $(cf_install_dir)/cfservd dest=$(workdir)/bin/cfservd
15 mode=755
16 type=checksum
17
18 $(cf_install_dir)/cfexecd dest=$(workdir)/bin/cfexecd
19 mode=755
20 type=checksum
21
22 $(master_cfinput) dest=$(workdir)/inputs
23 r=inf
24 mode=644
25 type=binary
26 exclude=*.lst
27 exclude=*~
28 exclude=#*
29 server=$(policyhost)
30 tidy:
31 $(workdir)/outputs pattern=* age=7
注意行号是笔者添加的便于解释参数:
第5行:字符串server.mydomain.com应替换为配置你自己服务器的主机名。
第6行:包含主配置文件的主配置服务器目录。
第7行:每个服务器保存cfengine二进制文件的位置。
第11行:指定了源目录应递归复制到目标目录,递归深度无限制。
第13行:此选项最初会令人误解。它指定任何本地文件应与主副本进行字节比较,以确定
是否需要更新。
第17行:此选项指出从指定的服务器中检索文件。
第31行:位于tidy段的此命令删除outputs/目录中在最后7天尚未访问的所有文件。
每个文件的权限(模式)在每次运行时都要进行检查,即使文件已经存在也是如此。
(3)cfagent.conf的框架
这是cfengine配置的实质。对系统执行的任何更改都有希望通过此文件来完成。这里的示例cfagent.conf非常简单,只用于测试。如果从cfengine调用脚本并且这些脚本生成任何输出,则输出结果将显示出来(交互式执行时),被记录或通过电子邮件发送(从cfexecd执行时)。因为通常情况下每个小时执行cfagent,所以如果出现问题或有些内容被更改且需要向管理员发送通知,则任何脚本都应产生输出。
1. control:
2. actionsequence=(filesdirectoriestidydisableprocesses)98
3. domain=(mydomain.com)
4. timezone=(EDTEST)
5. access=(root)
6. #Wherecfexecdsendsreports
7. smtpserver=(mail.mydomain.com)
8. sysadm=(root@mydomain.com)
9. files:
10. /etc/passwdmode=644owner=rootaction=fixall
11. /etc/shadowmode=600owner=rootaction=fixall
12. /etc/groupmode=644owner=rootaction=fixall
13. directories:
14. /tmpmode=1777owner=rootgroup=root
15. tidy:
16. /tmprecurse=infage=7rmdirs=sub
17. disable:
18. /root/.rhosts
19. /etc/hosts.equiv
20. processes:
21. "cfservd"restart"/var/cfengine/bin/cfservd"
22. "cfexecd"restart"/var/cfengine/bin/cfexecd"
第2行:actionsequence命令非常重要,但容易忽略。必须在此变量中列出要处理的每个代码段。如果编写了一个新的代码段,但忘记将其添加到此列表中,则命令不会执行。
第4行:cfengine将确保系统使用此列表中的一个时区进行配置。
第10行:此代码段检查一些重要文件的所有权和权限并更正它发现的任何问题。
第14行:此代码段检查/tmp/目录中的权限并在需要时更正这些权限。如果需要,它还创
建目录。
第16行:此代码段从/tmp/目录中删除过去7天中尚未访问的所有文件。还删除/tmp/的子
目录而非此目录本身。
第17行:出于安全原因,禁用这些文件。如果发现这些文件,则这些文件被重命名。如果
这些文件是可执行文件,则可执行的位被取消设置。
第20行:本段验证cfservd和cfexecd守护进程是否正在运行,如果没有运行,则启动它们。
二、创建配置服务器
配置服务器包含cfengine配置文件的主副本。它还像所有客户机系统一样,定期处理此配置文件。服务器必须运行经过正确配置的cfservd,以便客户机系统可以从系统中检索主配置文件。配置服务器需要特殊位置来保存cfengine主配置文件。在本例中,此位置是/usr/local/var/cfengine/inputs/。此位置可以是除/var/cfengine/inputs/之外的任何目录,因为重要主机在执行时与其他主机一样,将文件复制到此目录中。
与所有系统相似,此服务器也应作为守护进程或从cron(最好是两者)运行cfexecd。
下面生成服务器密钥,需要在服务器系统上运行cfkey来创建公钥和私钥文件。这些文件位于/var/cfengine/ppkeys/目录中并将被命名为localhost.priv和localhost.pub。然后需要将localhost.pub复制到同一目录中的新文件中。此文件应称为root-10.1.1.1.pub,假定您的IP地址为10.1.1.1。只需让cfrun命令连接到本身即可,但无论如何执行此操作会很有用。
根据下节描述的客户机的IP地址,服务器还需要在适当文件中保存的每个客户机的公钥。
三、准备客户机系统
客户机系统的配置相对简单。一旦安装了实际的cfengine二进制文件,则需要生成和复制适当的公钥(如本节所述)。还需要从主服务器手动复制update.conf文件,并放在/var/cfengine/inputs/中。在正确的位置保存此文件后,则应手动运行cfagent以下载其余的配置文件并完成系统配置。每个客户机都应以守护进程的方式或从cron运行cfexecd。可能要在每个客户机上运行cfservd并允许使用cfrun远程执行cfagent。假定已经在服务器上的cfagent.conf文件中完成了配置,则这些守护进程将在第一次手动执行cfagent时启动。
下面生成客户机密钥,需要在每个客户机系统上运行cfkey。此操作将在/var/cfengine/ppkeys/中创建localhost.priv和localhost.pub。然后,需要将中心服务器的公钥复制到客户机。如果服务器的IP地址是10.1.1.1,则应将其公钥复制到客户机上/var/cfengine/ppkeys/目录中的root-10.1.1.1.pub。最后,需要将客户机的公钥(localhost.pub)复制到服务器的/var/cfengine/ppkeys/目录中。此外,此文件应按照客户机的IP地址进行命名(如果其IP地址是10.2.2.2,则此文件应在服务器上被命名为root-10.2.2.2.pub)。这可以手动完成,也可以在初始系统配置脚本中自动完成。
四、使用cfrun
cfrun命令允许在网络上任何数量的系统中执行cfagent。它需要在当前目录中包含名为
cfrun.hosts的配置文件(或通过-f选项指定的文件)。文件的内容应如下所示:
domain=mydomain.com
server.mydomain.com
client1.mydomain.com
client2.mydomain.com
除域设置外,此文件仅是包含每台主机(包括服务器)的一个列表。通过将下列选项添加到
文件顶部,还可以将输出记录到一系列文件中(而非显示在屏幕上):
outputdir=/tmp/cfrun_output
maxchild=10106
上述代码告诉cfrun生成10个进程,并将每台主机的输出保存在指定目录的不同文件中。
通常运行cfrun可以不带参数。如果确实要指定参数,格式如下所示:
cfrunCFRUN_OPTIONSHOSTS--CFAGENT_OPTIONS-CLASSES
CFRUN_OPTIONS是可选的。可为cfrun命令包含任何数量的选项。接着,可以指定主机
名的可选列表。如果已指定了某些主机,则只联系这些主机。如果未指定任何主机,则联系
cfrun.hosts文件中的每个主机。
第一个--之后是在每个远程系统上运行的要传送给实际cfagent命令的任何选项。第二个--
之后是类的可选列表。如果指定了某些类,那么只有与其中某个类匹配的主机将实际执行
cfagent(尽管已联系了每个主机,因为每个主机必须决定它是否匹配其中一个类)。
五、 应用实例:使用cfengine备份数据
如果您已经阅读本文之前的大部分内容,就会知道cfengine非常棒。一旦安装并运行了cfengine,它就可以为您做任何事,包括备份数据。
1、使用cfengine执行本地备份
首先,可以使用cfengine完成文件和目录的复制。cfengine可以执行完美的复制--包括
特殊文件、符号链接以及目录的复制。它还可以保留文件的宿主和权限。下面是一个基本的配置,可以将其放入cfagent.conf文件中(如果已经有了一个copy段,可以在现有的copy段后面直接添加内容):
copy:
/etcdest=/usr/local/backup/etcpurge=truer=inf
这样可以让网络中的每台主机都递归地将/etc/目录精确地复制到/usr/local/backup/目录中。purge=true选项可以让复制操作删除那些源目录中没有而目标目录中存在的文件。
每次执行cfagent时都会执行这个复制过程,通常来说这过于频繁了。可以限制每天只执行一次这种操作:
copy:
Hr06.OnTheHour::
/etcdest=/usr/local/backup/etcpurge=truer=inf
现在只有在每天06:00运行cfagent时才会执行复制操作。此处假设您在整点时运行cfagent,而且每小时运行一次。如果不这样做,就应该适当调节示例中的时间设置。此例的问题是每天的备份都会覆盖前一天的备份。因此,您用来判断系统/etc/目录中可能出现的问题的时间只有不到24个小时。不必担心,我可以增强备份系统的功能,让它保留一周中有价值的备份。
control:
day_of_week=(ExecResult(/bin/date+%a))
copy:
Hr06.OnTheHour::
/etcdest=/usr/local/backup/${day_of_week}/etc
purge=truer=inf
现在您可以把有价值的备份数据保留7天,这些备份位于/usr/local/backup/Mon/etc、
/usr/local/backup/Tue/etc等目录中。
2、 在备份时排除文件
如果想在备份时包括或者排除一些文件,可以在copy段中使用3个可选参数。第一个是
ignore参数。可以指定任意多个这种参数,每个参数都提供了一种模式,任何匹配的文件和目录都将被忽略。这是防止对特定目录执行递归操作的惟一方法。
第二个参数是include。可以使用这个参数来指定在复制时应该包括的所有文件列表。可以
指定任意多个include参数,但是即使只有一个include参数,也会导致不匹配的文件在默认情况下被排除在复制操作之外。
最后一个参数是exclude选项。任何匹配这种模式的文件都会被排除在复制操作之外。下
面是一个例子:
copy:
Hr06.OnTheHour::
/homedest=/usr/local/backup/homepurge=truer=inf
ignore=cache#Netscapecachedirectory
ignore=Cache#Mozillacachedirectory
exclude=*.tmp
上面的例子表示tmp文件会被排除在备份文件之外。
总结:cfengine 是一种独特的系统管理工具。即使您没有决定使用它,但其概念和执行将对您的工作产生帮助。如果您决定使用它,您将发现 cfengine 无限的灵活性和惊人的用处。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者