2012-08-27 5 views
23

Tôi đang sử dụng opscode nginx cookbook để định cấu hình máy chủ nginx trên các nút của tôi. Sách nấu ăn nginx có một số thuộc tính mặc định tôi muốn ghi đè trong vai trò của mình ("web_server").Chef: Làm thế nào để ghi đè lên các thuộc tính mặc định trong các vai trò?

Đây là những thuộc tính tôi muốn ghi đè lên:

default['nginx']['version'] = "1.2.2" # in cookbooks/nginx/attributes/default.rb 
default['nginx']['source']['prefix'] = "/opt/nginx-#{node['nginx']['version']}" # in cookbooks/nginx/attributes/source.rb 

Trong vai trò của tôi/file web_server.rb Tôi có một cái gì đó như thế này:

name "web_server" 
description "Setup a web server" 
run_list "role[base]", "recipe[nginx]" 
override_attributes 'nginx' => { 
    'install_method' => "source", 
    'version' => "1.2.3", 
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil } 
} 

Tuy nhiên, khi chạy chef- khách hàng công thức nginx bỏ qua phần ghi đè của tôi và sử dụng các giá trị mặc định.

Tôi đang làm gì sai ở đây?

Cảm ơn!

+0

Bạn chưa quên tải vai trò lên đầu bếp-máy chủ (nếu bạn đang sử dụng nó)? –

+6

Bạn có đang chạy đầu bếp-khách hàng có hoặc không có danh sách chạy tùy chỉnh (-o) không? Hôm nay tôi đã học được (sau 2-3 giờ gỡ lỗi) các thuộc tính được đặt trong vai trò/nút không được sử dụng khi ghi đè danh sách chạy. –

+2

Tôi gặp phải vấn đề tương tự:/Tôi khá chắc chắn rằng tôi thiết lập override_attributes trong vai trò, và tôi chỉ sử dụng mặc định trong tập tin thuộc tính của tôi. Tôi cá là đây là loại đầu bếp hay cái gì đó. –

Trả lời

1

Vấn đề duy nhất tôi có thể đoán là các thuộc tính này phải được ghi đè bởi thuộc tính force1overridden . Đồng thời đảm bảo rằng các thuộc tính bạn đã vượt quá có sẵn cho danh sách chạy (vì tôi hoài nghi về cách bạn đã sắp xếp tệp vai trò của mình)

0

Bạn đã thử với dấu ngoặc đơn chưa? Tôi đã thử ví dụ của bạn với dấu ngoặc đơn và đã ghi đè các thuộc tính mặc định.

# your roles/web_server.rb file 

override_attributes(
    'nginx' => { 
    'install_method' => "source", 
    'version' => "1.2.3", 
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil } 
    } 
) 
4

Biểu đồ ưu tiên thuộc tính [1] cho thấy bốn tùy chọn xếp hạng trên vai trò của bạn:

12. An override attribute located in an environment 
13. A force_override attribute located in a cookbook attribute file 
14. A force_override attribute located in a recipe 
15. An automatic attribute identified by Ohai at the start of the chef-client run 

Nếu những dường như không thể là nguyên nhân thì có lẽ thay đổi định dạng của bạn có thể giúp đỡ. Tôi sẽ viết nó thích:

override_attributes(
    nginx: { 
    install_method: 'source', 
    version: '1.2.3', 
    source: { 
     prefix: '/opt/nginx', 
     checksum: [ ], 
    }, 
    } 
) 

[1] https://docs.chef.io/attributes.html#attribute-precedence

1

Bạn cũng có thể sử dụng ghi đè các thuộc tính trong trình soạn thảo vai trò (trong web hoặc vai trò dao chỉnh sửa)

{ 
    "name": "web_server", 
    "description": "nginx version", 
    "json_class": "Chef::Role", 
    "default_attributes": { 

    }, 
    "override_attributes": { 
    "nginx": { 
     "version": "1.2.2" 
    } 
    }, 
    "chef_type": "role", 
    "run_list": [ 
    "recipe[]", 
    "recipe[]" 
    ], 
    "env_run_lists": { 

    } 
} 
3

Theo tài liệu Chef Attribute Preference , điều này sẽ hoạt động:

name "web_server" 
description "Setup a web server" 
run_list "role[base]", "recipe[nginx]" 
default_attributes 'nginx' => { 
    'install_method' => "source", 
    'version' => "1.2.3", 
    'source' => { "prefix" => "/opt/nginx", "checksum" => nil } 
} 

Bạn sh không sử dụng override_attributes trong vai trò. Khi bạn bắt đầu sử dụng ghi đè thay vì giá trị mặc định, bạn sẽ nhanh chóng kết thúc việc tìm thấy bạn đã sử dụng ghi đè có thể mạnh nhất và không còn cách nào khác để ghi đè lên. Sử dụng default_overrides để thay thế.

Các quy tắc ưu tiên xung quanh thuộc tính, chỉ sử dụng mức default là thực sự khá giống nhau:

  1. Nếu có một, thuộc tính từ vai trò được sử dụng, ví dụ, require_two_factor_auth buộc phải đúng với default_overrides trong role[single_sign_on], ngay cả trong QA
  2. Nếu có một, thuộc tính từ môi trường được sử dụng, ví dụ, require_two_factor_auth buộc phải đúng trong production
  3. Nếu có một, thuộc tính từ công thức được sử dụng, ví dụ, require_two_factor_auth được thiết lập là true trong auth::two_factor
  4. Cuối cùng, các thuộc tính mặc định lành mạnh từ các tập tin thuộc tính mặc định được sử dụng, ví dụ, require_two_factor_auth = false

Tuy nhiên, nó là vô cùng bất thường đối với thứ cùng một thuộc tính được đặt trong cả bốn địa điểm đó. Nếu giá trị đúng của thuộc tính thực sự phụ thuộc vào công thức và vai trò và môi trường, thì thường giá trị kết quả kết hợp các tính năng của cả ba, và một thuộc tính khác được đặt ở mỗi cấp và kết hợp trong công thức.


Nếu đây không phải đang làm việc, hai khả năng là:

  • Sửa vai trò không được tải lên máy chủ
  • Overriding danh sách thực thi với chef-client -o "recipe[nginx]" thay vì chef-client -o role[web_server] hoặc đồng bằng chef-client

Nếu không phải như vậy, vui lòng cung cấp thêm chi tiết. Tôi luôn luôn sử dụng nó và nó luôn luôn hoạt động, và tôi lo lắng nếu có những trường hợp cạnh mà điều này không hoạt động như được ghi chép.