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

我开始使用木偶来pipe理几台服务器,我不知道如何实现以下function。

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

  1. 在configuration为安装git(不是全部)的服务器上,将(模板化的) .gitconfig放到所有现有用户的主目录中。 显然,pipe理这个模板的变化。
  2. 为所有未来的用户添加.gitconfig 。 但我不觉得这属于users模块 – 我认为它属于git模块。 感觉就像我想知道什么时候添加了任何用户(不仅仅是给定的用户实例),然后能够访问该用户创build的参数(例如主目录,真实姓名和用户名)。

从本质上讲,如果我只是为由users模块创build的所有用户部署了一个模板化的.gitconfig ,那么第2部分将很容易。 但是,如果git没有安装在系统上,我并不想让用户拥有.gitconfig文件。 所以我真正想说的是“对于这个系统上的所有托pipe用户,如果安装了git,请pipe理一个.gitconfig文件”。

谢谢!

哟将需要使用两个程序,首先为已经创build的帐户:

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

另一个为未来的用户:

http://linuxers.org/howto/how-set-default-content-new-users-home-directory-using-etcskel

如果需要使用git的用户和节点由puppetpipe理,那将更容易:

 class git { packakge { "git": ensure => installed, } } class users { user { ... } file { "/home/${user}/.gitconfig": ensure => present, content => template("gitconfig"), require => Class["git"], } } 

然后为每个git节点,包括类git。

对于此系统上的所有受pipe用户,

所以你必须在用户模块上定义它,或者从中导出一个虚拟资源 。 鉴于使用情况,我不认为有办法用虚拟资源做到这一点。

如果安装了git,

严格来说,创build一个自定义事实来检查它是否安装。 例如:

 # 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文件,用户模块可以实现它。 我不认为有可能以参数化(用户的主目录)的方式实现相同的资源。

pipe理.gitconfig文件

那么,你知道该怎么做。

如果你只想确保一个基本文件,使用标签。 虚拟文件资源只有在已经包含git类的情况下才能实现。 你可以用一个模板来设置它,以添加用户名和电子邮件。 这可能会导致问题,如果用户想要自定义他们的Gitconfiguration(木偶会覆盖他们的变化)。

 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 )getparamfunction。

未经testing的代码,不知道这是否工作。 一般来说,我很喜欢标记的虚拟资源。

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