我有一个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
请告诉我这里有什么问题。
答案 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