如何将文件添加到所有现有和未来用户的主目录中

如何将文件添加到所有现有和未来用户的主目录中

我开始使用 puppet 来管理几个服务器,但我不确定如何实现以下目标。

我有一个users模块,用于在所有服务器上创建通用用户。我有一个git模块,用于安装 git 并在 中设置系统范围的配置/etc/gitconfig。我想要做的是:

  1. 在配置为安装 git 的服务器上(不是全部),将一个(模板).gitconfig放入所有现有用户. 并且显然要对模板的更改进行管理。
  2. 为所有未来用户添加.gitconfig。但我觉得这不属于模块users- 我认为它属于git模块。感觉我想知道何时添加了任何用户(而不仅仅是给定的用户实例),然后能够访问该用户创建的参数(例如主目录、真实姓名和用户名)。

本质上,如果我只是将模板部署.gitconfig到模块创建的所有用户,那么第 2 部分会很容易users。但如果系统上未安装 git,我并不希望用户拥有.gitconfig文件。所以我真正想说的是“对于此系统上的所有托管用户,如果安装了 git,则管理一个.gitconfig文件”。

谢谢!

答案1

您需要使用两个程序,首先针对已经创建的帐户:

http://www.cyberciti.biz/tips/linux-unix-shell-batch-copy.html

另一个是针对未来用户的:

http://linuxers.org/howto/如何设置默认内容-新用户主页目录-使用etcskel

答案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"],
    }
  }

相关内容