厨师的团队资源并不是幂等的

时间:2016-04-19 14:51:53

标签: chef

作为某些要求的一部分,我被要求创建具有特定GID的2组“group1”和“group2”。还有具有特定UID的“user1”用户。 我在属性中指定了组的名称及其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

它正在做的是,当它击中第一个块时重新运行,它正在改变组以删除所有用户。在第二个块中,它再次修改组以添加用户。 现在,第一个组块仅用于创建组。如果该组已经存在,那么为什么要修改它,即使我们没有提到第一个区块中的成员?它应该只是看到它是最新的并继续前进。请帮助我理解为什么它会像。我不明白我是否遗漏了一些东西

1 个答案:

答案 0 :(得分:2)

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