仅当所述组存在时才将用户添加到 Unix 组(puppet)

仅当所述组存在时才将用户添加到 Unix 组(puppet)

我尝试使用‘user’ 资源的 ‘group’ 属性像这样:

user {
"user":
    group  => ["docker", "www-data"]
}

如果客户端上存在组“docker”和“www-data”,则用户将被添加到这些组中,而不会出现问题。但是,如果其中一个组不存在,puppet 客户端将出错,并且不会将用户添加到数组中的任何组中。

如果某个组不存在,我该如何确保 Puppet 忽略它,并将该用户添加到其他组中?

答案1

从根本上来说,这并不是 Puppet(以及大多数配置管理框架)的设计使用方式。

一个很好的记忆方法是,声明式语言的目的是宣布您希望系统处于的状态。声明应该是“唯一的事实来源”,相当于说“我希望这条装配线生产的所有汽车都是红色的、有四个门和四个轮子”。

考虑到这一点,Puppet 将不知道这些组不存在,并且无论如何都会尝试强制执行您声明的状态。

解决这个问题的方法是创建组,并强制执行显式依赖关系,以便在创建用户之前创建它们。需要明确的是,Puppet 确实绘制了隐式资源之间的依赖关系,但我一直觉得更有帮助的是明确的在引用其他资源时,为了增加可读性并减少歧义。

group { ['docker', 'www-data']:
  ensure => present,
}

user { 'user':
  group   => ['docker', 'www-data'],
  require => Group['docker', 'www-data'],
}

笔记:

  • 除非字符串包含变量,否则应始终使用单引号
  • 资源名称应与资源类型在同一行
  • 当引用其他资源的依赖关系时,资源类型的第一个字符大写

答案2

一般来说,puppet 只直接关心关心。Craig 在那个答案中给出了很好的解释。

话虽如此,很可能(并且建议)使用 puppet 来管理提供 docker 服务(使用 docker 组)和 web 服务器(使用 www-data 组)的堆栈。

例如,在安装 docker 和 apache 的代码中的某个地方,明确声明您需要的组:

group { 'docker':
  ensure => present,
  system => true,
}
group { 'www-data':
  ensure => present,
  system => true,
}

现在,您可以使用收集器来修改资源,而不管上述代码是否实际部署到每台服务器。这将有条件的如果 Puppet 正在管理正在部署的服务器上的特定组,则将用户添加到组中。

Group <| title == 'docker' |> {
  members +> 'user'
}

上述意思是,搜索任何group资源title 码头工人,如果找到,添加用户members属性

https://www.puppet.com/docs/puppet/8/lang_resources.html#lang_resource_syntax-adding-or-modifying-attributes

相关内容