强制创建后,Chef,File不存在

时间:2015-07-14 14:34:02

标签: ruby chef

我在配方中有以下逻辑,如果文件丢失,则会创建一个文件,然后尝试在其中插入一些行。

file "/root/myfile" do
  owner 'root'
  group 'root'
  mode '400'
  action :create_if_missing
end

file = Chef::Util::FileEdit.new('/root/myfile') 

data_bag('my_databag').each do |user|

  # ... lines using Chef resources like user, group, etc.

  if node.chef_environment != "my_env"
    line = "something to write in myfile"
    Chef::Log.info("-----> #{line}") 
    file.insert_line_if_no_match(/#{line}/, line)
  end
end

file.write_file

尽管我在导致异常的指令之前强制创建文件,但myfile不存在的情况下配方失败。所以这是错误:

ArgumentError
-------------
File '/root/.testfile' does not exist

Relevant File Content:
----------------------
 18:
 19>> file = Chef::Util::FileEdit.new('/root/.testfile')
 20:

任何人都可以帮助我理解为什么这不起作用?对此有任何帮助将非常感激。

更新:我尝试先触摸该文件,但仍然在同一行中失败:

 26:  FileUtils.touch('/root/myfile')
 27>> file = Chef::Util::FileEdit.new('/root/.testfile')

1 个答案:

答案 0 :(得分:3)

这是厨师两阶段性质的另一个问题。纯ruby代码在第一遍中运行。这是“编译”或“资源收集”阶段。 Chef资源的ruby代码只是将资源定义添加到资源列表中。在完成之后,然后发生第二个“执行”阶段。这个阶段实际上将执行资源。因此,在您的FileUtils代码失败之前,您的file声明实际上并没有做任何事情。

你可以做的两件事:

首先,如果可能的话,你真的应该避免在你的食谱中使用FileUtils。如果可以的话,用模板创建文件要好得多。

其次,如果稍微更改文件声明,可以在第一阶段修改它: XZ

file "/root/myfile" do
  owner 'root'
  group 'root'
  mode '400'
  action :nothing
end.run_action(:create_if_missing)