Làm thế nào để đầu bếp những thứ chưa tồn tại


9

Hãy để chúng tôi nói rằng tôi có một số mã Chef như:

require 'mixlib/shellout'
yum_package 'somepackage'
myvar =  Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip

Trường hợp /bin/somecommandchưa tồn tại bởi vì nó được cài đặt bởi somepackage. Điều này sẽ thất bại tại thời gian biên dịch công thức vì lý do đó, nhưng rõ ràng sẽ hoạt động vào thời điểm hội tụ cung cấp gói cài đặt thành công (và nếu không thì rõ ràng công thức đã thất bại). Điều này cũng thất bại nếu gói được cài đặt là một công thức trước đó trong danh sách chạy vì tất cả chúng được biên dịch cùng nhau trả trước. Làm cách nào để bao gồm những thứ trong công thức Chef mà công thức hoặc danh sách đó tự cài đặt?


Điều này không phải là vấn đề trong CFEngine
Gaius

1
Không có cái nhìn sâu sắc về việc sử dụng myvarkhông có câu trả lời thực sự, thông thường tôi tránh sử dụng đánh giá mã từ các lệnh bên ngoài vào thời gian biên dịch trừ khi rất cần thiết để xác định các tài nguyên khác. Nói tóm lại, tôi sẽ làm mộtruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Tensibai

@Tensibai node.run_statechính xác là những gì tôi đang tìm kiếm - cảm ơn. Làm cho nó một câu trả lời và tôi sẽ chấp nhận nó!
Gaius

Điều đó sẽ phải đợi đến ngày mai :) quá khó để viết một câu trả lời chính xác trên điện thoại
Tensibai

Câu trả lời:


4

Tôi sẽ đi cùng node.run_stateđể lưu trữ một biến tạm thời trong một lần chạy và xác định nó trong một biến ruby_blockđể nó xảy ra tại thời điểm hội tụ, đại loại như thế này:

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

Theo như tôi biết yêu cầu 'mixlib / shellout' là không cần thiết.


2

Các chi tiết cụ thể phụ thuộc vào trường hợp sử dụng chính xác. Nếu giá trị chỉ được sử dụng làm tài sản trên tài nguyên khác, bạn sẽ sử dụng lazyphương thức trợ giúp. Nếu bạn không cần đầu ra, bạn sẽ sử dụng executetài nguyên. Trong một số trường hợp phức tạp hơn, bạn có thể sử dụng ruby_blocktài nguyên hoặc viết tài nguyên tùy chỉnh của riêng bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.