Chef là một nền tảng quản lý cấu hình khai báo và tự động hóa được sử dụng để dịch cơ sở hạ tầng thành mã. Điều này cho phép quá trình phát triển và triển khai với thử nghiệm tốt hơn, triển khai hiệu quả và có thể dự đoán, quản lý phiên bản tập trung và môi trường có thể tái tạo trên tất cả các máy chủ.

Chef hoạt động dựa trên ba thành phần cốt lõi:
- Máy chủ Chef: Là trung tâm hoạt động, máy chủ Chef lưu trữ, quản lý và cung cấp dữ liệu cấu hình cho tất cả các thành phần Chef khác.
- Chef Workstations: Trạm làm việc là máy tính cá nhân hoặc máy chủ ảo nơi mã cấu hình cho Chef được tạo, kiểm tra và thay đổi. Có thể có nhiều trạm làm việc tùy theo nhu cầu, cho dù là một trạm cho mỗi người hay không.
- Chef Nodes: Nodes là máy chủ mà Chef đẩy các thay đổi đến, thường là một đội gồm nhiều máy tính cần lợi ích của tự động hóa. Chef có thể quản lý các nút là máy chủ ảo, container, thiết bị mạng và thiết bị lưu trữ. Một máy khách Chef được cài đặt trên mọi nút do Chef quản lý.

Ba thành phần này cho phép Chef giao tiếp theo cách chủ yếu là tuyến tính, với bất kỳ thay đổi nào được đẩy từ máy trạm đến máy chủ Chef, sau đó được kéo từ máy chủ đến các nút và được triển khai trên mỗi nút thông qua máy khách Chef. Đổi lại, thông tin về nút được chuyển đến máy chủ để xác định tệp nào khác với cài đặt hiện tại và cần được cập nhật.
Sau khi đọc hướng dẫn này, nếu bạn muốn tìm hiểu thêm về cách triển khai Chef, hãy xem Thiết lập máy chủ, máy trạm và nút Chef trên Ubuntu 18.04 và Tạo sách dạy nấu ăn Chef đầu tiên của bạn .
The Chef Server
Máy chủ Chef cung cấp một đường dẫn truyền thông giữa các máy trạm nơi mã hóa cơ sở hạ tầng diễn ra và các nút được cấu hình bởi các máy trạm đó. Tất cả các tệp cấu hình, sổ tay hướng dẫn, siêu dữ liệu và thông tin khác được tạo trên các máy trạm và được lưu trữ trên máy chủ Chef. Máy chủ Chef cũng lưu giữ bản ghi trạng thái của tất cả các nút tại thời điểm chạy chef-client cuối cùng .
Máy trạm giao tiếp với máy chủ Chef bằng các công cụ dòng lệnh Knife và Chef, trong khi các nút giao tiếp với máy chủ Chef bằng ứng dụng khách Chef .
Bất kỳ thay đổi nào được thực hiện đối với mã cơ sở hạ tầng của bạn phải đi qua máy chủ Chef để được áp dụng cho các nút. Trước khi chấp nhận hoặc đẩy các thay đổi, máy chủ Chef xác thực mọi giao tiếp thông qua REST API của nó bằng cách sử dụng mã hóa khóa công khai.
Các thành phần của một Chef Server
Chef Server bao gồm một số thành phần giúp giao tiếp hiệu quả với các máy trạm và nút. Mỗi máy chủ Chef có một bộ cân bằng tải NGINX front-end để định tuyến tất cả các yêu cầu đến API, một cơ sở dữ liệu PostgreSQL, một phiên bản Apache Solr (được đóng gói bởi chef-solr) để lập chỉ mục và tìm kiếm, và một giao diện web doanh nghiệp (được gọi là Chef automate) cho các tác vụ quản lý máy chủ Chef phổ biến và phân tích dữ liệu tổng hợp. Tất cả các thành phần này góp phần vào khả năng xử lý các yêu cầu của máy chủ Chef đối với hàng nghìn nút và có thể biến máy chủ Chef thành một ứng dụng sử dụng nhiều tài nguyên, do đó, yêu cầu hệ thống tối thiểu của máy chủ Chef là Linode có 8 GB RAM và bốn lõi CPU. Để biết thêm thông số kỹ thuật, hãy xem trang tài liệu Yêu cầu hệ thống Chef .
Bookshelf
Chef Server sử dụng Bookshelf để lưu trữ các sách dạy nấu ăn (và các tệp và mẫu liên quan). Bookshelf là kho lưu trữ có phiên bản (thường nằm tại /var/opt/opscode/bookshelf
; cần có quyền truy cập gốc đầy đủ để truy cập). Khi một sách dạy nấu ăn được tải lên máy chủ Chef, phiên bản mới sẽ được so sánh với phiên bản đã lưu trữ. Nếu có thay đổi, phiên bản mới sẽ được lưu trữ. Máy chủ Chef chỉ lưu trữ một bản sao của tệp hoặc mẫu, nghĩa là nếu tài nguyên được chia sẻ giữa các sách dạy nấu ăn và các phiên bản sách dạy nấu ăn, chúng sẽ không được lưu trữ nhiều lần.
The Chef Workstation
Chef workstation là nơi người dùng tạo, kiểm tra và duy trì sổ tay nấu ăn và chính sách được đẩy lên máy chủ Chef và được kéo bởi các nút Chef. Chức năng trạm làm việc có sẵn bằng cách tải xuống gói Chef Workstation , cung cấp các công cụ dòng lệnh chef và knife, các công cụ kiểm tra (Test Kitchen, ChefSpec, Cookstyle và Foodcritic) và InSpec . Inspec là một công cụ để viết các bài kiểm tra tự động cho các yêu cầu về tuân thủ, bảo mật và chính sách. Ngoài ra, Berkshelf , trình quản lý phụ thuộc cho sổ tay nấu ăn Chef, được cài đặt.
Máy trạm Chef có thể được cài đặt trên máy chủ ảo hoặc máy tính cá nhân. Máy trạm Chef sẽ tương tác với một máy chủ Chef duy nhất và hầu hết công việc được thực hiện trong thư chef-repo
mục nằm trên máy trạm.
Sách dạy nấu ăn được tạo trên máy trạm Chef có thể được một tổ chức sử dụng riêng hoặc tải lên Chef Supermarket để những người khác sử dụng. Tương tự như vậy, máy trạm Chef có thể tải xuống sách dạy nấu ăn có trong Supermarket.
Xem tài liệu chính thức của Chef để biết thêm thông tin chi tiết về Chef Workstation và các công cụ của nó.
chef-repo
Thư mục của máy trạm Chef chef-repo
là nơi các sách hướng dẫn nấu ăn được biên soạn và duy trì. Bất kỳ tài nguyên hỗ trợ nào (như vai trò, túi dữ liệu và môi trường) cũng được lưu trữ tại đó. Nên chef-repo
được kiểm soát phiên bản bằng hệ thống kiểm soát phiên bản từ xa (như Git). Chef có thể giao tiếp với máy chủ từ chef-repo
và đẩy bất kỳ thay đổi nào thông qua việc sử dụng knife
lệnh.
Bạn có thể tạo kho lưu trữ Chef bằng lệnh sau: chef generate repo repo-name
.
Knife
Công cụ dòng lệnh Knife là cách chính mà một máy trạm giao tiếp nội dung của chef-repo
thư mục với máy chủ Chef. Nó cũng cung cấp giao diện để quản lý các nút, sổ tay nấu ăn, vai trò, môi trường và túi dữ liệu.
- Lệnh Knife được thực thi từ máy trạm sử dụng định dạng sau:
knife subcommand [ARGUMENT] (options)
- Ví dụ, để xem thông tin chi tiết về người dùng Chef, hãy thực hiện lệnh sau:
knife user show USER_NAME
Công cụ dòng lệnh Knife được cấu hình bằng knife.rb
tệp:
log_level :info
log_location STDOUT
node_name 'username'
client_key '~/chef-repo/.chef/username.pem'
validation_client_name 'shortname-validator'
validation_key '~/chef-repo/.chef/shortname.pem'
chef_server_url 'https://123.45.67.89/organizations/shortname'
syntax_check_cache_path '~/chef-repo/.chef/syntax_check_cache'
cookbook_path [ '~/chef-repo/cookbooks' ]
Tệp mặc định knife.rb
được định nghĩa với các thuộc tính sau:
- log_level: Lượng nhật ký được lưu trữ trong tệp nhật ký. Giá trị mặc định,
:info
, lưu ý rằng bất kỳ thông báo thông tin nào cũng sẽ được ghi lại. Các giá trị khác bao gồm:debug
,:warn
,:error
, và:fatal
. - log_location: Vị trí của tệp nhật ký. Giá trị mặc định
STOUT
là dành cho ghi nhật ký đầu ra chuẩn . Nếu đặt thành giá trị khác thì ghi nhật ký đầu ra chuẩn vẫn sẽ được thực hiện. - node_name: Tên người dùng của người sử dụng máy trạm. Người dùng này cần có khóa ủy quyền hợp lệ nằm trên máy trạm.
- client_key: Vị trí khóa ủy quyền của người dùng.
- validation_client_name: Tên của khóa xác thực máy chủ xác định xem một nút có được đăng ký với máy chủ Chef hay không. Các giá trị này phải khớp trong quá trình chạy chef-client.
- validation_key: Đường dẫn đến khóa xác thực của tổ chức bạn.
- chef_server_url: URL của máy chủ Chef, là
shortname
tên viết tắt được xác định của tổ chức của bạn (cũng có thể là địa chỉ IP)./organizations/shortname
phải được bao gồm trong URL. - syntax_check_cache_path: Vị trí
knife
lưu trữ thông tin về các tệp được kiểm tra cú pháp Ruby phù hợp. - cookbook_path: Đường dẫn đến thư mục sách dạy nấu ăn.
Knife cho phép thực hiện nhiều thao tác hữu ích khác trên máy chủ và nút Chef. Xem tài liệu Knife của Chef để biết danh sách đầy đủ tất cả các lệnh khả dụng.
Test Kitchen
Test Kitchen cung cấp môi trường phát triển trên máy trạm để tạo, kiểm tra và lặp lại trên sổ tay nấu ăn trước khi phân phối nội dung của nó cho các nút sản xuất. Công cụ dòng lệnh Kitchen có thể được sử dụng để chạy các bài kiểm tra tích hợp trên các nền tảng khác nhau cho phép kiểm tra trên nhiều nút đang chạy trong môi trường sản xuất. Tham khảo tài liệu Kitchen CI để biết thông tin về cách bắt đầu với Test Kitchen.
The Chef Node
Node Chef là bất kỳ máy nào được quản lý bởi máy chủ Chef. Chef có thể quản lý máy chủ ảo, container, thiết bị mạng và thiết bị lưu trữ dưới dạng nút. Mỗi nút phải có một máy khách Chef tương ứng được cài đặt để thực hiện các bước cần thiết để đưa nó đến trạng thái bắt buộc được xác định bởi một sổ tay nấu ăn.
Các nút được xác thực thông qua validator.pem
và client.pem
các chứng chỉ được tạo trên nút khi nó được khởi động. Tất cả các nút phải được khởi động qua SSH với tư cách là người dùng gốc hoặc người dùng có quyền nâng cao.
Các nút được cập nhật thông qua chef-client, chạy sự hội tụ giữa nút và máy chủ Chef. Các cookbook và vai trò mà nút đảm nhiệm phụ thuộc vào danh sách chạy và môi trường được thiết lập cho nút đó.
chef-client
Trên một nút, chef-client kiểm tra cấu hình hiện tại của nút so với các công thức và chính sách được lưu trữ trên máy chủ Chef và cập nhật nút. Quá trình bắt đầu bằng việc chef-client kiểm tra danh sách chạy của nút , tải các sổ tay nấu ăn cần thiết, sau đó kiểm tra và đồng bộ các sổ tay nấu ăn với cấu hình hiện tại của nút.
Chef-client phải được chạy với các đặc quyền nâng cao để cấu hình nút đúng cách. Nó phải chạy định kỳ để đảm bảo máy chủ luôn được cập nhật (thường là với một công việc cron hoặc bằng cách thiết lập chef-client để chạy như một dịch vụ).
Danh sách chạy
Danh sách chạy xác định công thức nào mà nút Chef sẽ sử dụng. Danh sách chạy là danh sách có thứ tự của tất cả các vai trò và công thức mà chef-client cần kéo từ máy chủ Chef. Vai trò xác định các mẫu và thuộc tính trên các nút.
Ohai
Ohai thu thập dữ liệu cấu hình hệ thống để sử dụng trong sách hướng dẫn nấu ăn và phải có trên mọi nút Chef. Dữ liệu này được cài đặt như một phần của quy trình khởi động.
Ohai thu thập dữ liệu về việc sử dụng mạng và bộ nhớ, dữ liệu CPU, dữ liệu hạt nhân, tên máy chủ, FQDN và các thuộc tính tự động khác. Dữ liệu này giúp máy khách Chef xác định trạng thái của nút trước khi áp dụng danh sách chạy của nút đó.
Môi trường
Môi trường đầu bếp mô phỏng quy trình làm việc thực tế, cho phép các nút được tổ chức thành các nhóm khác nhau xác định vai trò của nút trong đội tàu. Điều này cho phép người dùng kết hợp các môi trường và sổ tay nấu ăn có phiên bản để có các thuộc tính khác nhau cho các nút khác nhau. Ví dụ: nếu thử nghiệm giỏ hàng, bạn có thể không muốn thử nghiệm bất kỳ thay đổi nào trên trang web trực tiếp, nhưng với một tập hợp các nút đang phát triển.
Môi trường được định nghĩa chef-repo/environments
và lưu dưới dạng tệp Ruby hoặc JSON.
Dưới dạng tệp Ruby:
name "environmentname"
description "environment_description"
cookbook_versions "cookbook" => "cookbook_version"
default_attributes "node" => { "attribute" => [ "value", "value", "etc." ] }
override_attributes "node" => { "attribute" => [ "value", "value", "etc." ] }
Dưới dạng JSON:
{
"name": "environmentname",
"description": "a description of the environment",
"cookbook_versions": {
},
"json_class": "Chef::Environment",
"chef_type": "environment",
"default_attributes": {
},
"override_attributes": {
}
Tất cả các nút được đặt thành môi trường “mặc định” khi khởi động. Để thay đổi môi trường của một nút, hãy chỉnh sửa /etc/chef/client.rb
trên các nút.
Sách dạy nấu ăn
Cookbook là cơ sở để quản lý cấu hình trên bất kỳ nút nào. Cookbook chứa các giá trị và thông tin về trạng thái mong muốn của một nút. Sử dụng cookbook, máy chủ Chef và máy khách Chef đảm bảo đạt được trạng thái đã xác định.
Sách dạy nấu ăn bao gồm các công thức nấu ăn, siêu dữ liệu, thuộc tính, tài nguyên, mẫu, thư viện và bất kỳ thứ gì khác được sử dụng để tạo ra một hệ thống hoạt động (thuộc tính và công thức nấu ăn là hai phần cốt lõi). Các thành phần của sách dạy nấu ăn phải là mô-đun, với các công thức nấu ăn nhỏ và có liên quan.
Sách dạy nấu ăn nên được kiểm soát phiên bản. Các phiên bản có thể hữu ích khi sử dụng các môi trường Chef khác nhau, cho phép phân phối và cộng tác với các thành viên khác trong nhóm.
Công thức nấu ăn
Recipes được viết bằng Ruby và chứa thông tin về mọi thứ cần chạy, thay đổi hoặc tạo trên một nút. Recipes hoạt động như một tập hợp các tài nguyên xác định cấu hình hoặc chính sách của một nút (với các tài nguyên là một phần tử cấu hình của recipe). Để một nút chạy recipe, nó phải nằm trong danh sách chạy của nút đó.
Công thức ví dụ bên dưới là một phần của sách hướng dẫn nấu ăn Vim của Chef . Sách này chỉ ra gói Vim cần thiết dựa trên bản phân phối Linux của một nút:
...
vim_base_pkgs = value_for_platform_family(
%w(debian arch) => ['vim'],
%w(rhel fedora) => ['vim-minimal', 'vim-enhanced'],
'default' => ['vim']
)
package vim_base_pkgs
package node['vim']['extra_packages'] unless node['vim']['extra_packages'].empty?
huộc tính
Thuộc tính xác định các giá trị cụ thể về một nút và cấu hình của nó. Thuộc tính thường được sử dụng kết hợp với các mẫu và công thức để xác định cài đặt và được áp dụng thông qua danh sách thuộc tính của máy khách Chef. Máy khách Chef có thể nhận các thuộc tính từ các nút, tệp thuộc tính, công thức, môi trường và vai trò. Để tìm hiểu thêm về các thuộc tính, hãy tham khảo tài liệu của Chef .
Tập tin
Trong chef, files
hãy tham khảo các tệp tĩnh được tải lên các nút. Tệp có thể là tệp cấu hình và thiết lập, tập lệnh, tệp trang web, v.v. Ví dụ: bạn có thể có một công thức sử dụng một index.php
tệp. Bạn có thể sử dụng cookbook_file
khối tài nguyên trong công thức để tạo tệp trên một nút. Tất cả các tệp tĩnh phải được lưu trữ trong thư mục “tệp” của sổ tay nấu ăn.
Thư viện
Mặc dù Chef đi kèm với các thư viện tích hợp, nhưng bạn có thể định nghĩa thêm các thư viện khác. Thư viện cho phép bạn viết mã Ruby để đưa vào sách dạy nấu ăn. Thư viện là cách thuận tiện để đưa mã trợ giúp vào các công thức hiện có của bạn. Thư viện cung cấp một cách mạnh mẽ để mở rộng các tài nguyên được tạo ra bởi các công thức của bạn.
Tài nguyên
Tài nguyên được viết bằng Ruby và được định nghĩa trong các tệp công thức. Tài nguyên phải chứa một loại, một tên, một hoặc nhiều thuộc tính và một hoặc nhiều hành động. Tài nguyên là các thành phần chính tạo nên bất kỳ công thức nào. Để tìm hiểu thêm, hãy truy cập tài liệu chính thức của Chef .
Mẫu
Mẫu là các tệp Ruby nhúng ( .erb
) được sử dụng để tạo động các tệp văn bản tĩnh. Để sử dụng mẫu trong sách dạy nấu ăn Chef, tài nguyên mẫu phải được khai báo trong công thức và bao gồm tệp tương ứng .erb
trong template
thư mục con. Tài nguyên mẫu của bạn có thể chứa các biến được mẫu sử dụng để cung cấp động các giá trị đó dựa trên ngữ cảnh cụ thể của một nút.
Hỏi & Đáp dành cho người mới bắt đầu làm đầu bếp
Tại sao nên sử dụng Chef?
Ngoài việc tự động triển khai, Chef còn cho phép phân phối liên tục bằng phương pháp “Cơ sở hạ tầng dưới dạng Mã” , đây có thể là chìa khóa cho bất kỳ tổ chức nào áp dụng các nguyên tắc DevOps .
Nhược điểm của Chef là gì?
Người dùng Chef không quen với mã hóa (cụ thể là Ruby) có thể gặp phải khó khăn khi học.
Tôi có thể tìm hiểu sâu hơn về Chef ở đâu?
Bạn có thể tìm thấy khóa đào tạo đầu bếp chuyên sâu (và miễn phí) trên trang giáo dục của Chef tại learn.chef.io .
Thông tin thêm
Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.
- Đầu bếp
- Thiết lập Chef Server, Workstation và Node trên Ubuntu 18.04
- Tạo sách dạy nấu ăn đầu tiên của bạn
Nguồn: https://www.linode.com/docs/guides/beginners-guide-chef/