我开始使用 puppet 来管理几个服务器,但我不确定如何实现以下目标。
我有一个users
模块,用于在所有服务器上创建通用用户。我有一个git
模块,用于安装 git 并在 中设置系统范围的配置/etc/gitconfig
。我想要做的是:
- 在配置为安装 git 的服务器上(不是全部),将一个(模板)
.gitconfig
放入所有现有用户. 并且显然要对模板的更改进行管理。 - 为所有未来用户添加
.gitconfig
。但我觉得这不属于模块users
- 我认为它属于git
模块。感觉我想知道何时添加了任何用户(而不仅仅是给定的用户实例),然后能够访问该用户创建的参数(例如主目录、真实姓名和用户名)。
本质上,如果我只是将模板部署.gitconfig
到模块创建的所有用户,那么第 2 部分会很容易users
。但如果系统上未安装 git,我并不希望用户拥有.gitconfig
文件。所以我真正想说的是“对于此系统上的所有托管用户,如果安装了 git,则管理一个.gitconfig
文件”。
谢谢!
答案1
答案2
如果需要有git的用户和节点用puppet来管理的话会简单很多:
class git {
packakge { "git":
ensure => installed,
}
}
class users {
user { ... }
file { "/home/${user}/.gitconfig":
ensure => present,
content => template("gitconfig"),
require => Class["git"],
}
}
然后对于每个 git 节点,包含类 git。
答案3
对于此系统上的所有管理用户,
因此,您要么必须在用户模块上定义它,要么导出一个虚拟资源从中。考虑到用法,我看不出有什么办法可以用虚拟资源来实现这一点。
如果安装了 git,
严格来说,创建一个定制事实检查是否已安装。例如:
# git.rb
Facter.add("git") do
setcode do
%x{/usr/bin/test -x /usr/bin/git && /bin/echo yes || /bin/echo no}.chomp
end
end
另一方面,git
模块可以导出虚拟资源,例如文件.gitconfig
,用户模块可以实现它。我认为不可能以参数化(用户的主目录)的方式实现相同的资源。
管理 .gitconfig 文件
嗯,你知道该怎么做。
答案4
如果您只想确保一个基本文件,请使用标签。只有包含 git 类后,虚拟文件资源才会实现。您可以使用模板来设置它,以添加用户名和电子邮件。但如果用户想要自定义他们的 git 配置,这可能会导致问题(puppet 将覆盖他们的更改)。
class git {
@file { 'git_user_config':
tag => 'git_user_config',
path => '/tmp/.gitconfig',
content => template("git/gitconfig.erb"),
require => Package["git"],
}
}
class user {
# user defs here
File <| tag == 'git_user_config' |> {
path => "/home/${user}/.gitconfig",
}
}
您还可以利用 puppet-stdlib (https://forge.puppetlabs.com/puppetlabs/stdlib) getparam 功能。
未经测试的代码,不确定这是否会起作用。总的来说,我非常喜欢标记的虚拟资源。
class users {
user {...}
if ( (defined(Package['git']) && (getparam(Package['git'],'ensure') == 'present') ) {
file {
"/home/${user}/.gitconfig":
ensure => present,
content => template("git/gitconfig.erb"),
require => Class["git"],
}
}