在Chef中读取文件并创建用户

时间:2015-02-20 13:19:27

标签: ruby chef

我有一个IP地址列表和我一起。在那些IP面前我有一个用户名。我想要做的是让Chef读取具有IP和用户名的文件,一旦遇到IP,它应该创建该名称的用户。 但当我这样做时,我得到一个用户,但用户的名字出来是一个数字。

这是我的食谱

File.open("/tmp/users.txt", "r") do |file|
    file.readlines.each_with_index do |ip,user|
      if ip = node[:ipaddress]
            user ip[user] do
                action :create
                supports :manage_home => true
                comment 'Test User'
                home '/home/ip[user]'
                shell '/bin/bash'
                password 'password'
            end
      end
   end

我的users.txt文件

231.27.59.232, test1
272.27.59.15, tes2
985.54.25.22, test3

现在,当我运行食谱时,这就是我得到的

Recipe: repo_update::users
   * cookbook_file[/tmp/users.txt] action create (up to date)
   * user[1] action create
     - create user 1
   * user[7] action create
     - create user 7
   * user[2] action create
     - create user 2

请告诉我这里有什么问题。

2 个答案:

答案 0 :(得分:1)

这里有很多问题...... Tejay的答案是要走的路,我只是试着解释为什么你的代码不能正常工作以及如何修复它以便它可以有所帮助后来:)

File.open("/tmp/users.txt", "r") do |file|
  file.readlines.each_with_index do |ip,user|
    puts "values are #{ip} and #{user}"
  end
end

给出:

values are 231.27.59.232, test1
 and 0
values are 272.27.59.15, tes2
 and 1
values are 985.54.25.22, test3
 and 2

each_with_index不会将你的行神奇地分成两部分,它只是将最后一个参数分配给迭代中的实际索引。

您的代码的固定版本将是:

File.open("/tmp/users.txt", "r") do |file|
  file.readlines.each do |line| # just iterate and get line
    ip,myuser=line.gsub("\n",'').split(',') # set ip and myuser variable with values comma separated, using myuser to avoid conflict with the resource name. Using gsub to remove traling carriage return in user name
    if ip == node[:ipaddress] # test equality, a single = will assign ip a value and always be true.
      user myuser do # create the user using the variable, no need to interpolate here
        action :create
        supports :manage_home => true
        comment 'Test User'
        home "/home/#{myuser}" # use interpolation here inside double quotes (won't work in single quotes)
        shell '/bin/bash'
        password 'password'
      end
    end
  end
end

答案 1 :(得分:0)

问题在于这一行:

user ip[user] do

您正在[]字符串上调用ip方法。此外,您将在资源user和块变量之间获得名称冲突。最后,您为每个用户提供了“/ home / ip [user]”的主页。您需要将字符串放在"中并将变量包装在#{}中试试这个:

File.open("/tmp/users.txt", "r") do |file|
  file.readlines.each do |line|
    entries = line.split(',')
    ip = entries[0].strip
    username = entries[1].strip
    if ip = node[:ipaddress]
      user username do
        action :create
        supports :manage_home => true
        comment 'Test User'
        home "/home/#{username}"
        shell '/bin/bash'
        password 'password'
      end
    end
 end

此外,从文件中读取这一切是非常不容易做的事情。使用存储在环境变量中的数据字节或哈希,这也可以使您无需循环:

userhash = node['my_users'][node['ipadddress']]
user userhash['username']
  action :create
  supports :manage_home => true
  comment 'test user'
  home userhash['home'] || "/home/#{userhash['username']"
  shell userhash['shell'] || '/bin/bash'
  password userhash['password'] || 'password'
end