如何使用 Puppet 和 Augeas 管理 Linux 中的配置
尽管 Puppet 是一个非常独特且有用的工具,但在某些情况下您可以使用一些不同的方法。诸如修改配置文件之类的情况,这些配置文件已经存在于您的多台服务器上,并且同时在每台服务器上都是唯一的。 Puppet 实验室的人们也意识到了这一点,并集成了一个名为 Augeas 的出色工具,该工具正是为此用途而设计的。
Augeas 最好被认为是填补 Puppet 功能中的空白,其中对象特定的资源类型(例如用于操作 /etc/hosts
条目的主机资源)尚不可用。在本指南中,您将学习如何使用 Augeas 来简化配置文件管理。
奥吉亚斯是什么?
Augeas 基本上是一个配置编辑工具。它以本机格式解析配置文件并将其转换为树。配置更改是通过操作此树并将其保存回本机配置文件来进行的。
在本教程中我们要实现什么目标?
我们将安装和配置 Augeas 工具,以便与我们之前构建的 Puppet 服务器一起使用。我们将使用此工具创建和测试几种不同的配置,并学习如何正确使用它来管理我们的系统配置。
先决条件
我们需要一个有效的 Puppet 服务器和客户端设置。如果您没有,请按照我之前的教程进行操作。
Augeas 软件包可以在我们的标准 CentOS/RHEL 存储库中找到。不幸的是,Puppet 使用 Augeas ruby 包装器,该包装器仅在 puppetlabs
存储库(或 EPEL)中可用。如果您的系统中还没有此存储库,请使用以下命令添加它:
在 CentOS/RHEL 6.5 上:
# rpm -ivh https://yum.puppetlabs.com/el/6.5/products/x86_64/puppetlabsrelease610.noarch.rpm
在 CentOS/RHEL 7 上:
# rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabsrelease710.noarch.rpm
# yum install rubyaugeas
或者,如果您继续学习我的上一个教程,请使用 Puppet 方式安装此包。修改 /etc/puppet/manifests/site.pp
中的 custom_utils 类,以在包数组中包含 rubyaugeas
:
class custom_utils {
package { ["nmap","telnet","vimenhanced","traceroute","rubyaugeas"]:
ensure => latest,
allow_virtual => false,
}
}
没有傀儡的奥吉阿斯
正如一开始所说,Augeas 最初并非来自 Puppet Labs,这意味着即使没有 Puppet 本身,我们仍然可以使用它。此方法对于在将修改和想法应用到 Puppet 环境之前验证它们非常有用。为了实现这一点,您需要在系统中安装一个额外的软件包。为此,请执行以下命令:
# yum install augeas
傀儡奥吉亚斯示例
为了进行演示,这里有一些 Augeas 用例示例。
1.管理/etc/sudoers
文件
此示例将向您展示如何在 GNU/Linux 系统中为组 %wheel 添加简单的 sudo
权限。
# Install sudo package
package { 'sudo':
ensure => installed, # ensure sudo package installed
}
# Allow users belonging to wheel group to use sudo
augeas { 'sudo_wheel':
context => '/files/etc/sudoers', # The target file is /etc/sudoers
changes => [
# allow wheel users to use sudo
'set spec[user = "%wheel"]/user %wheel',
'set spec[user = "%wheel"]/host_group/host ALL',
'set spec[user = "%wheel"]/host_group/command ALL',
'set spec[user = "%wheel"]/host_group/command/runas_user ALL',
]
}
现在让我们解释一下代码的作用: spec
定义 /etc/sudoers
中的用户部分,[user]
定义数组中的给定用户,斜杠 ( /
) 后面的所有定义都是该用户的子部分。因此,在典型配置中,这将表示为:
user host_group/host host_group/command host_group/command/runas_user
它被翻译成这行 /etc/sudoers
:
%wheel ALL = (ALL) ALL
2. 添加命令别名
以下部分将向您展示如何定义可以在 sudoers 文件中使用的命令别名。
# Create new alias SERVICES which contains some basic privileged commands
augeas { 'sudo_cmdalias':
context => '/files/etc/sudoers', # The target file is /etc/sudoers
changes => [
"set Cmnd_Alias[alias/name = 'SERVICES']/alias/name SERVICES",
"set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[1] /sbin/service",
"set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[2] /sbin/chkconfig",
"set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[3] /bin/hostname",
"set Cmnd_Alias[alias/name = 'SERVICES']/alias/command[4] /sbin/shutdown",
]
}
sudo
命令别名的语法非常简单:Cmnd_Alias 定义命令别名部分,[alias/name]
将所有命令绑定到给定别名,/alias/name SERVICES
定义实际别名,alias/command 是应属于此别名一部分的所有命令的数组。该命令的输出如下:
Cmnd_Alias SERVICES = /sbin/service , /sbin/chkconfig , /bin/hostname , /sbin/shutdown
3. 将用户添加到组中
要使用 Augeas 将用户添加到组中,您可能需要在 gid 字段之后或最后一个用户之后添加新用户。在本示例中,我们将使用组 SVN。这可以通过使用以下命令来实现:
在木偶中:
augeas { 'augeas_mod_group:
context => '/files/etc/group', # The target file is /etc/group
changes => [
"ins user after svn/*[self::gid or self::user][last()]",
"set svn/user[last()] john",
]
}
使用augtool:
augtool> ins user after /files/etc/group/svn/*[self::gid or self::user][last()] augtool> set /files/etc/group/svn/user[last()] john
概括
到目前为止,您应该对如何在 Puppet 项目中使用 Augeas 有一个很好的了解。请随意尝试并一定要阅读 Augeas 官方文档。它将帮助您了解如何在自己的项目中正确使用 Augeas,并向您展示使用它实际上可以节省多少时间。
如果您有任何问题,请随时在评论中提出,我会尽力回答并为您提供建议。