我开始使用木偶来pipe理几台服务器,我不知道如何实现以下function。
我有一个users模块,用于在所有服务器上创build普通用户。 我有一个git模块,用于安装git并在/etc/gitconfig设置系统范围的configuration。 我想要做的是:
.gitconfig放到所有现有用户的主目录中。 显然,pipe理这个模板的变化。 .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"], } }