Chef 中的组资源不是幂等的

Group resource in chef is not being idempotent

作为某些要求的一部分,我被要求创建 2 个具有特定 GID 的组 'group1' 和 'group2'。还有 'user1' 具有特定 UID 的用户。 我在属性中指定了组的名称和它们的 ID,如下所示:

default['abc']['groups'] = {'group1' => 45xxx, 'group2' => 45xxx}

我在我的食谱中这样称呼它。我在这里要做的是首先创建两个组。然后创建用户。然后修改组添加用户。

#Create Groups
node['abc']['groups'].each_key do |group|
  group group do
    gid node['abc']['groups'][group]
  end
end

# Create the user.
user 'user1' do
  uid 45xxx
end

# Configure the user.
# Make it a member of the appropriate supplementary groups, and
# ensure its environment will be set up properly upon login.
node['abc']['groups'].each_key do |grp|
  group grp do
    members ['user1']
    append true
    action :modify
  end
end

它在第一个 运行 上运行良好。然后当我再次 运行 时,会发生以下情况:

Recipe: abc::recipename
  * group[group1] action create
    - alter group group1
    - replace group members with new list of members
  * group[group2] action create
    - alter group group2
    - replace group members with new list of members
  * user[user1] action create (up to date)
  * group[group1] action modify
    - modify group group1
    - add missing member(s): user1
  * group[group2] action modify
    - modify group group2
    - add missing member(s): user1

它所做的是,在 re运行 到达第一个块时,它正在更改组以删除所有用户。在第二个块中,它再次修改组以添加用户。 现在第一个组块仅用于创建组。如果该组已经存在,那么为什么要修改它,即使我们没有在第一个块中提及任何有关成员的信息?它应该只是将其视为最新的并继续前进。请帮助我理解为什么它表现得像。我不明白我是否遗漏了什么

members 默认为 [] 所以不指定它就是告诉它把成员设置为空。如果您在第一个组资源上设置 append truemembers [],它将不会尝试管理我认为您想要的成员列表。 Chef 通常在对象级建模方面进行操作,而您正试图以更程序化的方式使用它,所以事情看起来有点奇怪。