2017-02-28 144 views
1

我想使用廚師食譜配方編輯文件。 如,廚師食譜FileEdit insert_line_after_match和insert_line_if_no_match

[attribute1] 
foo=bar 
[attribute2] 
.... 

我想改變它像現在,該文件顯示:

[attribute1] 
foo=bar 
newfoo=newbar 
[attribute2] 
.... 

所以基本上,我想添加一個行,如果它沒有在文件中存在的,我要添加它在該文件中的特定行之後。

我找到2個選項,在Class: Chef::Util::FileEdit可能有用,在這裏可以輸入insert_line_after_matchinsert_line_if_no_match。但我想要一個可以執行這兩個操作的選項。如果我使用insert_line_after_match,它適用於第一次運行,但對於下一次運行,即使線已經存在於文件中,它也會繼續添加行。並且insert_line_if_no_match如果文件中不存在行,則在文件末尾添加行,但是我想要在該文件中的特定行之後添加行。

我對廚師食譜有點新鮮。有沒有解決上述問題的方法?

回答

1

我會建議不編輯文件,而是覆蓋它們。您應該在食譜內創建一個模板或文件,然後使用templatecookbook_file資源使用cookbook中的文件覆蓋機器上的文件。

您的配置文件類似於toml,所以你也可以使用toml-rb寶石生成JSON(數據包),此文件或文件屬性,如認爲:

chef_gem 'toml-rb' do 
    compile_time false 
end 

file '/path/to/file.conf' do 
    content(lazy do 
    require 'toml' 
    "# This file is managed by Chef\n" + 
    TOML.dump(my_json) 
    end) 
end 
1

漂亮請不要使用FileEdit。這是一個內部API和而不是打算供公衆使用。你想要的是line食譜,特別是replace_or_add自定義資源。確保你非常小心地製作你的正則表達式。

一般來說,我們不推薦這種管理風格,因爲它非常脆弱,容易被無關的變更破壞。更好的選擇是使用template資源或類似的方式來以收斂的方式管理整個文件。