我想使用 puppet 创建邮箱。基本上,我只需要在有新用户到达时创建一个目录。但是,用户列表非常庞大,为每个用户创建一个文件节是不可能的。我找到了一种使用这个节传递数组的方法:
file { [ "user1", "user2", ... ]:
ensure => directory,
owner => $user,
group => 'mail',
mode => 0660,
}
这样做有两个问题:首先,无法从外部资源(例如 CSV 文件)检索用户列表。其次,我看不出如何实例化所有者值。
我曾想过定义函数,但同样的问题仍然存在。有人找到解决这个问题的方法吗?
答案1
定义的类型应该可以很好地解决这个问题owner
。
define usermailbox {
# creates dir /path/to/username:
file { "/path/to/$title":
ensure => directory,
owner => $title,
group => 'mail',
mode => 0660,
}
}
要从外部来源填充,希拉是一个不错的选择 - 它在 3.0 之后集成在 Puppet 中,但如果您仍在使用 2.7,则需要在主系统上单独安装它。如果您要使用它,您可能还会考虑将其转移到它,作为进行节点定义的更灵活方法。
放置用户列表的位置取决于这是否需要仅适用于一个系统,还是适用于多个系统。但是现在,假设我们希望它特定于此系统。
因此在您的/etc/puppet/hiera.yaml
(Hiera 如何查找数据的配置)中,您将看到如下内容:
:backends:
- yaml
:hierarchy:
- %{::clientcert}
- common
:yaml:
:datadir: '/etc/puppet/hieradata'
对于node.example.com
,它将查找一个文件/etc/puppet/hieradata/node.example.com.yaml
(或common.yaml
优先级较低,因此如果您希望此列表可用于多个服务器的目录,则可以使用它)。创建该文件,我们将以 YAML 格式为其提供用户列表:
mailbox_users:
- user1
- user2
- user3
然后,我们可以使用调用来获取该列表,将其作为变量拉入,并使用它为列表中的每个用户从上面hiera
设置一次。define
usermailbox { hiera(mailbox_users): }