2013-01-05 23 views
5

Tôi muốn có thể xác định một tài nguyên nhẹ với 3 tham số, hai tham số là các tham số cơ bản/tiểu học và thứ ba là sự kết hợp của hai tham số này. Tôi cũng muốn cung cấp khả năng tùy chỉnh tham số thứ ba. Ví dụ:Làm thế nào để thực hiện một thuộc tính động mặc định trong định nghĩa đầu bếp LWRP

Làm thế nào để sửa đổi mã sau đây để đạt được trên hành vi cho full_name thuộc tính: định nghĩa

tài nguyên:

actions :install 

attribute :name, :kind_of => String, :name_attribute => true 
attribute :version, :kind_of => String 
attribute :full_name, :kind_of => String 

nhà cung cấp định nghĩa:

action :install do 
    Chef::Log.info "#{new_resource.full_name}" 
end 

tôi muốn xem các kết quả đầu ra khác nhau chỉ thị nguồn ent, ví dụ .:

resource "abc" do 
    version "1.0.1" 
end 

sẽ dẫn đến abc-1.0.1, nhưng:

resource "def" do 
    version "0.1.3" 
    full_name "completely_irrelevant" 
end 

sẽ dẫn đến completely_irrelevant.

Có khả năng xác định hành vi này trong định nghĩa tài nguyên (có thể thông qua tham số default) hoặc tôi có thể làm điều đó trong định nghĩa nhà cung cấp không? Nếu thứ hai là đúng, thì tôi có thể lưu trữ giá trị được tính trong thuộc tính full_name của đối tượng hay không (lớp có vẻ thiếu định nghĩa phương thức full_name=) hoặc tôi phải lưu trữ giá trị đó trong biến cục bộ?

Cập nhật

Nhờ gợi ý của Draco, tôi nhận ra rằng tôi có thể tạo ra một phương pháp accessor trong tập tin tài nguyên và tính giá trị full_name on the fly khi được yêu cầu. Tôi muốn một giải pháp sạch hơn nhưng nó tốt hơn nhiều so với tính toán nó trong thực hiện hành động.

Chef phiên bản Chef: 10.16.4

Trả lời

3

Setting @full_name trong constructor, tương tự như việc cung cấp hành động mặc định trong đầu bếp < 0.10.10, như written in wiki, không hoạt động, vì @version không được thiết lập tại điểm đó.

def initialize(name, run_context=nil) 
    super 
    @full_name ||= "%s-%s" % [name, version] 
end 

Vì vậy, chúng ta phải ghi đè lên phương pháp FULL_NAME trong tài nguyên bằng cách thêm

def full_name(arg=nil) 
    if arg.nil? and @full_name.nil? 
    "%s-%s" % [name, version] 
    else 
    set_or_return(:full_name, arg, :kind_of => String) 
    end 
end 

vào định nghĩa tài nguyên. Điều đó hoạt động. Thử nghiệm.

+0

Thật không may có vẻ như biến thành viên 'phiên bản' là' nil' vào thời điểm này ngay cả khi được chỉ định trong chỉ thị tài nguyên. Dường như giá trị thuộc tính được chỉ định trong một công thức không được gán cho thành viên, nhưng (khi tôi đăng nhập giá trị của nó trong trình xử lý hành động nó có một giá trị thích hợp). –

+1

@DariuszWalczak Tôi đã sửa câu trả lời. Bây giờ nên làm việc. –

1
attribute :full_name, :kind_of => String, default => lazy {|r| "#{r.name}-#{r.version}" } 
Các vấn đề liên quan