2011-12-05 21 views
25

Tôi không chắc mình hiểu Chef thực hiện có điều kiện hay không.Hiểu Chef only_if not_if

Tôi muốn làm một số điều kiện thực hiện dựa trên việc hoặc không phải là một cơ sở dữ liệu tồn tại trong PostgreSQL

Vì vậy, đây là ví dụ của tôi

execute "add_db" do 
    cwd "/tmp" 
    user "dbuser" 
    command "createdb -T template_postgis mydb" 
    not_if 'psql --list|grep mydb' 
end 

Chạy psql --list|grep mydb trả lại những gì bạn mong đợi nếu db tồn tại (dòng với mục nhập dbname) và không có gì cả nếu nó không.

Vậy làm thế nào để not_if chỉ đánh giá điều đó? Đúng hay sai? 1 hoặc 0? Không phải tất cả các quy trình đều trả về 0 nếu chúng thành công?

Anywho lời khuyên nào sẽ được đánh giá cao!

Trả lời

21

Tôi vừa gặp sự cố này. Vấn đề của tôi là lệnh not_if đã được chạy như 'root', không phải là 'dbuser'. Nếu bạn thay đổi nó thành

not_if 'psql --list|grep mydb', :user => 'dbuser' 

thì bạn có thể nhận được kết quả bạn đang tìm kiếm.

http://tickets.opscode.com/browse/CHEF-438

+5

Tình huống của tôi có một chút khác biệt, vì vậy tôi sẽ để lại một lưu ý ở đây cho những người dùng tương lai trong một tình huống tương tự đã hạ cánh ở đây. Giả sử bạn có thuộc tính 'node ['myattr'] = true', thì nếu bạn viết' only_if node ['myattr'] ', đầu bếp sẽ phàn nàn. Tôi phát hiện ra rằng bạn cần phải kèm theo các tuyên bố trong dấu ngoặc nhọn, tức là. 'only_if {node ['myattr']}' – apatrick

19

Chạy thử nghiệm cho chính mình, từ dòng lệnh và xem giá trị trả lại mặc định (a.k.a., "$?"). Bạn sẽ nhận được một cái gì đó như thế này:

% psql --list|grep mydb 
    mydb-is-here 
    % echo $? 
    0 

Nếu bạn cố gắng một cái gì đó mà không phải là ở đó, bạn sẽ nhận được một cái gì đó như thế này:

% psql --list|grep mydb-not-here 
    % echo $? 
    1 

đầu bếp gì đang xảy ra để được xem xét là các giá trị số đó sẽ được nhồi vào $ ?, tức là "0" hoặc "1". Nói cách khác, ví dụ bạn hiển thị cho cú pháp "not_if" là chính xác.

+0

Giống như cách bạn cung cấp cho họ một ví dụ về cách tìm hiểu chính nó! –

+6

Tôi thường thêm một -q vào lời kêu gọi grep khi đặt nó vào một công thức để đầu ra của đầu bếp-khách hàng không bị lộn xộn với bất kỳ trận đấu nào được tạo ra bởi grep. –