2017-02-28 1 views
1

요리사 요리 책 요리법을 사용하여 파일을 편집하고 싶습니다. 내가 좋아하는 그것을 변경할요리사 조리법 FileEdit insert_line_after_match 및 insert_line_if_no_match

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

로 이제 파일이 나타납니다 :

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

을 그러니까 기본적으로, 나는 그것이 파일에 존재하지 않는 경우 행을 추가 할 내가 추가 할 그 파일의 특정 줄 뒤에.

여기서 Class: Chef::Util::FileEdit 아래의 두 옵션이 있는데, 유용 할 수 있습니다. insert_line_after_matchinsert_line_if_no_match입니다. 하지만 두 가지 작업을 모두 수행 할 수있는 옵션이 필요합니다. insert_line_after_match을 사용하면 처음 실행될 때 작동하지만 다음 실행에서는 줄이 이미 파일에 있더라도 줄을 계속 추가합니다. 그리고 insert_line_if_no_match은 파일에 line이 없으면 해당 파일의 끝에 줄을 추가하지만 해당 줄에 특정 줄 다음에 줄을 추가하려고합니다.

나는 요리사 조리법에 조금 새로운입니다. 위의 문제를 해결할 수있는 솔루션이 있습니까?

답변

1

파일을 편집하지 말고 파일을 덮어 쓰는 것이 좋습니다. 요리 책 안에 템플릿이나 파일을 만든 다음 template 또는 cookbook_file 리소스를 사용하여 컴퓨터의 파일을 요리 책의 파일로 덮어 씁니다.

설정 파일은 toml과 유사합니다, 그래서 당신은 JSON (데이터 가방)에서이 파일을 생성 toml-rb 보석을 사용하거나 같은 속성 수

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 리소스 또는 이와 유사한 것을 사용하는 것입니다.