【问题标题】:Is there a way to only edit the GID on /etc/passwd file using chef?有没有办法只使用厨师编辑 /etc/passwd 文件上的 GID?
【发布时间】:2020-07-28 00:47:13
【问题描述】:

我们可以使用 Chef 资源在 /etc/passwd 文件中将 GID 从 101 更改为 100(或任何其他数字)吗?libuuid:x:100:101::/var/lib/libuuid:

对于 /etc/passwd 中所有带有 101 的 GID,如果需要更改 GID,使用 Chef 资源的方法是什么?

【问题讨论】:

    标签: bash chef-infra chef-recipe passwd


    【解决方案1】:

    在提出解决方案之前,我想指出两点:

    1. 最好避免手动/脚本编辑/etc/passwd 文件,因为这可能会导致问题。
    2. Chef 不是编辑文件的工具。 Chef 资源在它们运行的​​节点上聚合,并将资源的状态带到配方中定义的状态。

    如果您仍想使用 Chef,可以在 ruby_block 资源中使用 Ruby 代码。

    但是,处理此问题的最简洁方法是(单独)识别用户并使用用户资源。

    例子:

    # This will set gid as 1001 for user1, user2, user3
    %w(
      user1
      user2
      user3
    ).each do |u|
      user u do
        # add any other properties as required
        gid '1001'
      end
    end
    

    更新

    一个示例文件/tmp/userlist,内容如下:

    john:x:100:101::/bin/bash:
    david:x:207:100::/bin/bash:
    joe:x:100:101::/bin/nologin:
    mike:x:101:100::/bin/bash:
    rich:x:103:207::/bin/bash:
    fred:x:105:111::/bin/nologin:
    

    不是 Ruby 方面的专家,但它就是这样。以下ruby_block 将从文件中读取行,并创建一个新文件,替换 GID 101 的行:

    ruby_block "Write file" do
      block do
        puts
        userlist = File.readlines('/tmp/userlist')
        fp = File.open('/tmp/newuserlist', mode='w')
        userlist.each do |line|
          gid = line.split(':')[3]
          if gid == '101'
            fp.write line.sub(/.*\K101/, '1001')
          else
            fp.write line
          end
        end
        fp.close
      end
    end
    

    注意:使用 Ruby 或使用其他语言甚至是 Shell 脚本可能有一种更简洁、更简单的方法。请考虑相同。

    【讨论】:

    • 谢谢@Seshadri C。我试图为所有用户或 /etc/passwd 中 GID 为 101 的任何用户查找如何使用 Chef 资源将其更改为 100?只有当我事先知道 GID 为 101 的用户的具体列表时,我才能使用“用户”资源。
    • 正如我所提到的,按照您想要的方式编辑文件更像是一种“脚本”操作,而不是 Chef 资源的设计目的。如果您仍想使用 Chef 来实现它,则必须编写一些 Ruby 代码来查找和替换 ruby_block 资源中文件中的行。我会用一个示例更新我的答案。
    【解决方案2】:

    使用user resource

    user 'a user' do
      comment 'A random user'
      uid 1234
      gid 'groupname'
      home '/home/random'
      shell '/bin/bash'
      password '$1$JJsvHslasdfjVEroftprNn4JHtDi'
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多