作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。
介绍
CFEngine是您的IT基础设施的可扩展配置管理工具。CFEngine允许您使用相同的工具和策略语言来管理您的基础设施中的所有东西:Linux,Mac,Windows,BSD,Solaris,IBM AIX,HP-UX等。您可以在您想要管理的每个机器上安装一个代理(以C(https://en.wikipedia.org/wiki/C_(programming_language))编写。CFEngine支持许多平台,对资源限制的环境,如大型基础设施或小型物联网(https://en.wikipedia.org/wiki/Internet_of_things)设备有用。
在本教程中,您将安装 CFEngine Community Edition 3.21在Ubuntu 20.04上,写样本策略文件,并自动执行策略。
前提条件
要完成本教程,您将需要:
- 一個 Ubuntu 20.04 伺服器與非根「sudo」使用者。 要設定此功能,請遵循我們的指南 Ubuntu 20.04 初始伺服器設定。
- 一種執行壳命令的方式(包括
sudo
),如ssh
。 - 一種文本編輯器. 本教程使用
nano
。
步骤 1 - 安装CFEngine
在此步骤中,您将使用apt
和包库安装 CFEngine. 使用apt
(https://manpages.ubuntu.com/manpages/trusty/en/man8/apt.8.html)进行安装的主要优点是您可以在以后使用apt
更新 CFEngine。
有其他方法可以安装CFEngine用于不同的用例:
cf-remote
是一个灵活的选择,可以处理在多个机器上安装,不同版本的CFEngine,以及夜间构建。quick-install
shell 脚本是单一机器的良好选择。
如果您使用这些选项之一来安装 CFEngine 社区或企业,请在安装后跳过 步骤 2 - 启动 CFEngine或跳过 步骤 3 - 创建您的第一个策略。
添加CFEngine的公共密钥
要使用apt
安装CFEngine,您需要apt
才能访问存储库。 第一步是将CFEngine公共GPG密钥添加到apt
密钥集合中,以便apt
可以信任存储库中的包。
用这个命令下载密钥:
1wget https://cfengine.com/pub/gpg.key -O ~/cfengine-gpg.key
然后使用apt-key
来添加它:
1sudo apt-key add ~/cfengine-gpg.key
添加CFEngine的包存库
接下来,您需要用以下命令将CFEngine存储库作为源添加到apt
:
1sudo sh -c "echo 'deb https://cfengine-package-repos.s3.amazonaws.com/pub/apt/packages stable main' > /etc/apt/sources.list.d/cfengine-community.list"
此命令将CFEngine仓库添加到apt
源列表目录中的文件中。
如果没有sh
参数和-c
选项,这个命令会收到允许拒绝
错误,因为输出的重定向不是由sudo
执行的。
现在,运行更新
命令,以便apt
可以从CFEngine存储库中查看新包:
1sudo apt update
安装apt
的包
有了现在与apt
注册的CFEngine包,您可以使用apt
来安装CFEngine:
1sudo apt install cfengine-community
如果您收到警告称该包正在构建在不同的(较旧)操作系统上,您可以忽略它。
检查安装
当安装完成时,你会看到构成 CFEngine 的组件在 /var/cfengine/bin
. 在所有这些中,代理人(cf-agent
)是你将与大多数时间互动的人。 这种二进制评估你写的策略,对系统进行更改,并记录有关它所做的信息。 默认情况下,代理人将每五分钟醒来,必要时收集新的策略,并执行它。
使用以下命令来检查代理是否已成功安装:
1sudo cf-agent --version
版本号将打印到屏幕上:
1[secondary_label Output]
2CFEngine Core 3.21.0
<$>[注]
注: 本文写作时,当前版本为 3.21.0
. 您的版本号可能有所不同。
如果cf-agent
命令不起作用,请检查/var/cfengine/bin/
是否在您的PATH
变量中,并且cf-agent
是否存在于该目录中。
步骤2 - 开始CFEngine
要启动CFEngine,您需要启动代理,使用以下命令:
1sudo cf-agent --bootstrap 127.0.0.1
这个命令告诉代理启动CFEngine组件,并从这个机器中获取‘127.0.0.1’的策略。
在未来,您将希望多个机器从同一个服务器上获取策略. 在这种情况下,‘127.0.0.1’将被该服务器的IP地址取代。
您现在已经安装了CFEngine并在您的服务器上运行,下一步是开始编写策略。
步骤3 - 创建您的第一个政策
要使用 CFEngine 自动化系统管理任务,您可以创建一个策略文件,该文件是用 CFEngine 自己的 Domain Specific Language (DSL)编写的。
策略文件与脚本不同,因为它们是声明性的:您描述了系统的所需状态,而CFEngine将检查是否已经是这样的情况,并只在必要时进行更改。
- 確保使用者「sammy」存在。
- 保持「curl」包的更新(並安裝)。
- 確保「telnet」沒有安裝。
- 從模板和一些資料中播放脚本檔案。
- 如果正在運行,停止一個過程,例如「httpd」。
- 執行 '/usr/bin' 文件夾的嚴格權限。
在所有这些情况下,你会写政策,并将其放置在你的服务器上(/var/cfengine/masterfiles)。
- 自动部署策略文件,将其转移到您的其他启动主机。
- 定期执行您的要求(默认情况下每五分钟运行策略)。例如,如果有人删除用户「sammy」或更改了在「/usr/bin」上的权限,这些更改将在五分钟内自动恢复。
- 只在必要时进行更改,例如写入文件(即,如果状态尚未达到所需)。
- 处理许多平台差异(例如,用于安装包、创建用户和其他操作的命令取决于操作系统)。
在此步骤中,您将创建一个Hello World
策略,将文本Hello!
输出到终端。
使用nano
或您最喜欢的文本编辑器创建一个新的文件, `~/hello_world.cf:
1nano ~/hello_world.cf
在文件中,添加以下内容:
1[label ~/hello_world.cf]
2bundle agent main
3{
4 reports:
5 "Hello!";
6}
CFEngine 政策是宣言性的,不会从顶部到底部进行评估。
在 CFEngine 策略语言中,您对所管理的内容的每一个陈述都称为 promise。
在本政策中, reports
是 promise type,负责将消息打印到终端的关键字。 在 'bundle' 之后的 'agent' 关键字意味着该组件为 'cf-agent' 组件。该组件的名称是'main'。 bundle sequence 指定要评估的组件。 默认情况下,它包含了'main' 组件,因此您不需要更改它。
使用nano
,按CTRL+X
来退出,Y
来保存,并按ENTER
来确认文件名并关闭文件。
由于CFEngine通常作为 root 用户运行,它试图通过对策略文件要求严格的权限来防止对系统进行未经授权的更改(允许其他用户编辑策略CFEngine 运行将允许他们作为特权用户对系统进行更改)。
1chmod 600 hello_world.cf
要运行该策略,请使用以下命令:
1sudo cf-agent ~/hello_world.cf
CFEngine代理找到您的包裹(由于主要
名称),查看其中的承诺,并评估它们。在评估承诺时,代理检查是否需要对系统进行更改。
您将收到以下输出:
1[secondary_label Output]
2R: Hello!
默认情况下,CFEngine 会跟踪最近(在最后一分钟内)进行评估的所作所作所为并跳过的承诺。如果您尝试重新启动策略,它将不会打印任何东西。
1sudo cf-agent --no-lock hello_world.cf
您已创建并运行您的第一个策略. 虽然能够输出到控制台是有用的,但此策略实际上不会改变系统。
步骤 4 — 撰写策略来管理文本文件的内容
在之前的步骤中,您创建了一个策略来打印到终端的消息,但是,一个更现实的使用案例是确保在您的基础设施中的所有主机上存在某些特定内容的文件。
打开一个新的策略文件, ~/file_management.cf
:
1nano ~/file_management.cf
添加以下内容:
1[label ~/file_management.cf]
2bundle agent manage_my_file
3{
4 files:
5 "/tmp/my_file.txt"
6 content => "Hello, CFEngine!$(const.n)";
7}
包的名称是manage_my_file
而不是main
。当你写出更多策略时,你应该给每个包一个独特的描述性名称。
由于此策略管理文件,所以承诺类型为 files
。 用于文件
承诺的内容
属性,表示该文件的内容应该是什么。
保存并关闭文件。
如前所述,在策略文件中设置严格的权限:
1chmod 600 file_management.cf
现在,使用一些额外的命令行选项来运行文件:
1sudo cf-agent --no-lock --info ~/file_management.cf --bundle manage_my_file
指定--bundle manage_my_file
的包是必要的,因为不再有主
包。
--info
选项使CFEngine打印有关它正在对系统进行的更改的信息信息。
此命令的输出将包含有关这些更改的信息:
1[secondary_label Output]
2info: Using command line specified bundlesequence
3info: Created file '/tmp/my_file.txt', mode 0600
4info: Updated file '/tmp/my_file.txt' with content 'Hello, CFEngine!
此输出表明,CFEngine在/tmp
目录中创建了一个名为my_file.txt
的文本文件,内容为Hello, CFEngine!
。
如果您再次运行相同的命令,有关创建和更新文件的消息将不再显示。
<$>[note]
注: --no-lock
和 --info
通常在撰写和测试策略文件时一起使用。
现在您有一个工作系统策略,您可能希望在没有您的监督的情况下运行它。
步骤5:自动化政策运行
您可能不希望始终从命令行手动运行策略. CFEngine 包含自动化功能来处理此问题。
在此步骤中,您将自动执行策略,将策略文件放在预期位置并更新 JSON 文件。
使用以下命令将您在上一个步骤中创建的策略文件复制到推荐的位置:
1sudo cp file_management.cf /var/cfengine/masterfiles/services/
所有 CFEngine 策略都在 /var/cfengine/masterfiles/
中。这包括你没有写的策略,它和 CFEngine 一起来。 为了将你的自定义策略与默认策略分开,建议将你的策略文件放入 services/
子目录中。
当CFEngine代理人收集新的策略文件时,他们会将它们从这个目录复制到中心.即使你只是使用一个机器,代理仍然以同样的方式工作:它会搜索 /var/cfengine/masterfiles
中的文件,并将它们复制到 /var/cfengine/inputs
。
接下来,创建 a augments JSON file来指定策略文件的位置和应该运行哪个包:
1sudo nano /var/cfengine/masterfiles/def.json
将以下内容添加到该文件中:
1[label /var/cfengine/masterfiles/def.json]
2{
3 "inputs": [ "services/file_management.cf" ],
4 "vars": {
5 "control_common_bundlesequence_end": [ "manage_my_file" ]
6 }
7}
要让策略定期运行,需要两步(每五分钟一次):确保代理找到并阅读文件,并确保代理运行您的包。
def.json
中的输入
键告诉代理读取哪些策略文件,在这种情况下,代理将读取您在最后一步中创建的策略,即file_management.cf
。
vars
键可以用来定义变量. control_common_bundlesequence_end
变量被用在默认策略中,所以你在那里放置的任何包名将被添加到bundlesequence
的末尾,并在所有默认包之后进行评估。
在这一点上,你正在编辑/var/cfengine/masterfiles/
内部的策略,自动化会照顾其余的部分。更具体地说,cf-agent
会定期醒来并收集你所编写的新策略文件。
根据您在本教程中编写的策略,每次代理运行时,它将确保 /tmp/my_file.txt
与您在策略文件中指定的内容存在。
保存并关闭文件。
若要确认自动化工作,请删除您第一次运行文件管理策略时创建的文本文件:
1sudo rm /tmp/my_file.txt
五分钟后,您可以确认CFEngine是否在背景中重新创建了my_file.txt
:
1cat /tmp/my_file.txt
1[secondary_label Output]
2Hello, CFEngine.
或者,你也可以强迫文件创建发生更早:
1sudo rm /tmp/my_file.txt ; sudo cf-agent -Kf update.cf ; sudo cf-agent -KI
rm
命令会删除该文件,因此CFEngine会看到更改是必要的。
第一个cf-agent
命令更新了策略文件,将其从/var/cfengine/masterfiles
复制到/var/cfengine/inputs
。
最后一个cf-agent
命令执行您的策略,使其搜索/tmp/my_file.txt
文件,并在需要时创建和编辑它。
在这种情况下,您在删除文件后立即运行代理,所以cf-agent
应该打印它创建了文件(在这些命令之间发生代理运行的可能性很小)。
<$>[注]
注: 命令 sudo cf-agent -Kf update.cf ; sudo cf-agent -KI
与命令 CFEngine 默认运行每五分钟一次相似。因此,运行此命令应有等待五分钟的结果,如果 CFEngine 运行正确。
在此步骤中,您已经使用 CFEngine 自动化了您的第一个系统管理任务. 虽然本示例专注于创建和编辑文件,但另一个任务的过程将是相同的:写下策略,将其放入正确的目录,并相应地更新 def.json
文件。
结论
您现在已经在单个服务器上安装并启动了 CFEngine. 您写下了您的第一个策略,并将其设置为自动运行。
作为下一步,请查看CFEngine的官方文档,例如有关管理文件的本教程: 创建,修改和删除文件。
如果您有任何问题或需要帮助,请在CFEngine的GitHub讨论的Q&A部分(https://github.com/cfengine/core/discussions/categories/q-a)发布。