Thứ hai, 03/02/2014 | 00:00 GMT+7

Cách tạo Sách dạy nấu ăn Đầu bếp Đơn giản để Quản lý Cơ sở hạ tầng trên Ubuntu

Chef là một hệ thống quản lý cấu hình được thiết kế để cho phép bạn tự động hóa và kiểm soát rất nhiều máy tính theo cách tự động, tin cậy và có thể mở rộng.


Trong các hướng dẫn trước, ta đã xem xét một số thuật ngữ Chef phổ biến và thảo luận cách cài đặt server Chef, máy trạm và các node (với Chef 12 hoặc Chef 11 ). Trong hướng dẫn này, ta sẽ sử dụng các hướng dẫn này như một điểm khởi đầu để bắt đầu nói về cách tự động hóa môi trường của bạn.

Trong bài viết này, ta sẽ thảo luận về những điều cơ bản để tạo một cuốn sách dạy nấu ăn Chef. Sách dạy nấu ăn là đơn vị cấu hình cho phép ta cấu hình và thực hiện các việc cụ thể trong Chef trên các node từ xa của ta . Ta xây dựng sách nấu ăn và sau đó cho Chef biết những nút nào ta muốn thực hiện các bước được nêu trong sách nấu ăn.

Trong hướng dẫn này, ta sẽ giả định bạn đang bắt đầu với ba máy mà ta đã kết thúc bài học trước. Bạn nên có một server , một máy trạm và ít nhất một nút để đẩy các thay đổi cấu hình lên.

Các khái niệm sách dạy nấu ăn cơ bản


Sách dạy nấu ăn đóng role là đơn vị cơ bản của cấu hình và chi tiết policy mà Chef sử dụng để đưa một nút vào trạng thái cụ thể. Điều này chỉ nghĩa là Chef sử dụng sách nấu ăn để thực hiện công việc và đảm bảo mọi thứ diễn ra như bình thường.

Sách dạy nấu ăn thường được sử dụng để xử lý một dịch vụ, ứng dụng hoặc chức năng cụ thể. Ví dụ, một sách dạy nấu ăn có thể được tạo để sử dụng NTP để đặt và đồng bộ thời gian của nút với một server cụ thể. Nó có thể cài đặt và cấu hình một ứng dụng database . Sách dạy nấu ăn về cơ bản là các gói cho các lựa chọn cơ sở hạ tầng.

Sách dạy nấu ăn được tạo trên máy trạm và sau đó được tải lên server Chef. Từ đó, các công thức và policy được mô tả trong sách nấu ăn có thể được gán cho các node như một phần của “danh sách chạy” của nút. Run-list là danh sách tuần tự các công thức và role được đầu bếp-khách hàng chạy trên một nút để làm cho nút đó tuân theo policy bạn đặt cho nó.

Bằng cách này, các chi tiết cấu hình mà bạn viết trong sách nấu ăn của bạn được áp dụng cho các node bạn muốn tuân theo kịch bản được mô tả trong sách nấu ăn.

Sách dạy nấu ăn được tổ chức theo cấu trúc folder hoàn toàn khép kín. Có nhiều folder và file khác nhau được sử dụng cho các mục đích khác nhau. Bây giờ ta hãy xem xét một số cái quan trọng hơn.

Công thức nấu ăn


Công thức là công thức chính của sách dạy nấu ăn. Sách dạy nấu ăn có thể chứa nhiều hơn một công thức hoặc phụ thuộc vào các công thức nấu ăn bên ngoài. Công thức được sử dụng để khai báo trạng thái của các tài nguyên khác nhau.

Tài nguyên đầu bếp mô tả một phần của hệ thống và trạng thái mong muốn của nó. Ví dụ, một tài nguyên có thể nói “gói x nên được cài đặt”. Một tài nguyên khác có thể nói "dịch vụ x sẽ được chạy".

Công thức là danh sách các tài nguyên liên quan cho Chef biết hệ thống sẽ trông như thế nào nếu nó triển khai công thức. Khi Chef chạy công thức, nó sẽ kiểm tra từng tài nguyên để tuân theo trạng thái đã khai báo.Nếu hệ thống khớp, nó sẽ chuyển sang tài nguyên tiếp theo, ngược lại, nó sẽ cố gắng chuyển tài nguyên đó sang trạng thái nhất định.

Tài nguyên có thể có nhiều loại khác nhau. Bạn có thể tìm hiểu về các loại tài nguyên khác nhau tại đây. Một số phổ biến là:

  • gói : Được sử dụng để quản lý các gói trên một nút
  • dịch vụ : Được sử dụng để quản lý các dịch vụ trên một nút
  • user : Quản lý user trên nút
  • group : Quản lý group
  • mẫu : Quản lý file với các mẫu ruby được nhúng
  • cookbook_file : Chuyển file từ folder con file trong sách nấu ăn đến một vị trí trên nút
  • tệp : Quản lý nội dung của file trên nút
  • thư mục : Quản lý folder trên nút
  • thực thi : Thực thi một lệnh trên nút
  • cron : Chỉnh sửa file cron hiện có trên nút

Thuộc tính


Các thuộc tính trong Chef về cơ bản là cài đặt. Hãy coi chúng như những cặp key-value đơn giản cho bất kỳ thứ gì bạn có thể cần sử dụng trong sách nấu ăn của bạn .

Có thể áp dụng một số loại thuộc tính khác nhau, mỗi loại có mức độ ưu tiên khác nhau so với cài đặt cuối cùng mà một nút hoạt động. Ở cấp sách dạy nấu ăn, ta thường xác định các thuộc tính mặc định của dịch vụ hoặc hệ thống mà ta đang cấu hình . Các giá trị này có thể được overrides sau này bởi các giá trị cụ thể hơn cho một nút cụ thể.

Khi tạo sách nấu ăn, ta có thể đặt các thuộc tính cho dịch vụ của bạn trong folder con thuộc tính của sách nấu ăn. Sau đó, ta có thể tham khảo các giá trị này trong các phần khác của sách dạy nấu ăn của ta .

Các file


Thư mục con file trong sách nấu ăn chứa các file tĩnh nào mà ta sẽ đặt trên các node sử dụng sách nấu ăn.

Ví dụ, các file cấu hình đơn giản nào mà ta không có khả năng sửa đổi đều có thể được đặt toàn bộ trong folder con file . Sau đó, một công thức có thể khai báo một tài nguyên để di chuyển các file từ folder đó vào vị trí cuối cùng của chúng trên nút.

Mẫu


Các mẫu tương tự như các file , nhưng chúng không tĩnh. Các file mẫu kết thúc bằng phần mở rộng .erb , nghĩa là chúng chứa Ruby được nhúng.

Chúng chủ yếu được sử dụng để thay thế các giá trị thuộc tính vào file để tạo version file cuối cùng sẽ được đặt trên nút.

Ví dụ: nếu ta có một thuộc tính xác định cổng mặc định cho một dịch vụ, file mẫu có thể gọi để chèn thuộc tính tại điểm trong file nơi cổng được khai báo. Sử dụng kỹ thuật này, bạn có thể dễ dàng tạo file cấu hình, trong khi vẫn giữ các biến thực tế mà bạn muốn thay đổi ở nơi khác.

Metadata.rb


Không có gì ngạc nhiên khi file metadata.rb được sử dụng để quản lý metadata về một gói. Điều này bao gồm những thứ như tên của gói, mô tả, v.v.

Nó cũng bao gồm những thứ như thông tin phụ thuộc, nơi bạn có thể chỉ định sách nấu ăn nào mà sách nấu ăn này cần để hoạt động. Điều này sẽ cho phép server Chef xây dựng danh sách chạy cho các node một cách chính xác và đảm bảo tất cả các phần được chuyển một cách chính xác.

Tạo một Sách dạy nấu ăn Đơn giản


Để chứng minh một số quy trình làm việc với sách nấu ăn, ta sẽ tạo một cuốn sách nấu ăn của riêng mình. Đây sẽ là một sách dạy nấu ăn rất đơn giản cài đặt và cấu hình web server Nginx trên nút của ta .

Để bắt đầu, ta cần vào folder ~/chef-repo trên máy trạm của ta :

cd ~/chef-repo 

Khi đó, ta có thể tạo một cuốn sách dạy nấu ăn bằng cách sử dụng dao. Như ta đã đề cập trong các hướng dẫn trước, dao là một công cụ được sử dụng để cấu hình hầu hết các tương tác với hệ thống Chef. Ta có thể sử dụng nó để thực hiện công việc trên máy trạm của bạn và cũng để kết nối với server Chef hoặc các node riêng lẻ.

Cú pháp chung để tạo sách dạy nấu ăn là:

<pre>
sách nấu ăn dao tạo <span class = “highlight”> cookbook_name </span>
</pre>

Vì sách dạy nấu ăn của ta sẽ xử lý việc cài đặt và cấu hình Nginx, ta sẽ đặt tên sách nấu ăn của bạn một cách thích hợp:

knife cookbook create nginx 

** Creating cookbook nginx ** Creating README for cookbook: nginx ** Creating CHANGELOG for cookbook: nginx ** Creating metadata for cookbook: nginx 

Những gì con dao làm ở đây là xây dựng một cấu trúc đơn giản trong folder sách nấu ăn cho sách nấu ăn mới của ta . Ta có thể xem cấu trúc sách nấu ăn của bạn bằng cách chuyển vào folder sách nấu ăn và vào folder có tên sách nấu ăn.

cd cookbooks/nginx ls 

attributes  CHANGELOG.md  definitions  files  libraries  metadata.rb  providers  README.md  recipes  resources  templates 

Như bạn thấy , điều này đã tạo ra một cấu trúc folder và file mà ta có thể sử dụng để xây dựng sách dạy nấu ăn của bạn . Hãy bắt đầu với phần lớn nhất của cấu hình, công thức.

Tạo một công thức đơn giản


Nếu ta đi vào folder con của recipes , ta có thể thấy rằng đã có một file tên là default.rb bên trong:

cd recipes ls 

default.rb 

Đây là công thức sẽ được chạy nếu bạn tham khảo công thức "nginx". Đây là nơi ta sẽ thêm mã của bạn .

Mở file bằng editor của bạn:

nano default.rb 

# # Cookbook Name:: nginx # Recipe:: default # # Copyright 2014, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # 

Điều duy nhất trong file này hiện tại là một tiêu đề comment .

Ta có thể bắt đầu bằng cách lập kế hoạch những điều cần xảy ra để web server Nginx của ta bắt đầu và chạy theo cách ta muốn. Ta thực hiện điều này bằng cách cấu hình "tài nguyên". Các nguồn lực không mô tả cách thực hiện điều gì đó; chúng chỉ đơn giản là mô tả một phần của hệ thống sẽ trông như thế nào khi nó hoàn thành.

Trước hết, ta cần chắc chắn rằng phần mềm đã được cài đặt. Ta có thể làm điều này bằng cách tạo tài nguyên “gói” trước.

package 'nginx' do   action :install end 

Đoạn mã nhỏ này xác định tài nguyên gói cho Nginx. Dòng đầu tiên bắt đầu bằng loại tài nguyên (gói) và tên của tài nguyên ('nginx'). Phần còn lại là một group các hành động và tham số khai báo những gì ta muốn xảy ra với tài nguyên.

Trong tài nguyên này, ta thấy action :install . Dòng này cho Chef biết rằng tài nguyên mà ta đang mô tả nên được cài đặt. Nút chạy công thức này sẽ kiểm tra xem Nginx đã được cài đặt chưa. Nếu đúng, nó sẽ đánh dấu vào danh sách những việc cần làm. Nếu không, nó sẽ cài đặt chương trình bằng các phương pháp có sẵn trên hệ thống client và sau đó kiểm tra nó.

Sau khi ta cài đặt dịch vụ, ta có thể cần điều chỉnh trạng thái hiện tại của nó trên nút. Theo mặc định, Ubuntu không khởi động Nginx sau khi cài đặt, vì vậy ta sẽ muốn thay đổi điều đó:

service 'nginx' do   action [ :enable, :start ] end 

Ở đây, ta thấy một tài nguyên thuộc loại "dịch vụ". Điều này tuyên bố rằng đối với thành phần dịch vụ Nginx (phần cho phép ta quản lý server bằng init hoặc mới khởi động), ta muốn khởi động dịch vụ ngay bây giờ và cũng cho phép nó tự động khởi động khi máy được khởi động lại.

Tài nguyên cuối cùng mà ta sẽ khai báo là file thực tế mà ta sẽ phục vụ. Vì đây chỉ là một file đơn giản mà ta sẽ không sửa đổi, ta có thể chỉ cần khai báo vị trí mà ta muốn file và cho nó biết vị trí trong sách nấu ăn để lấy file :

cookbook_file "/usr/share/nginx/www/index.html" do   source "index.html"   mode "0644" end 

Ta sử dụng loại tài nguyên “cookbook_file” để cho Chef biết rằng file này có sẵn trong policy nấu ăn và có thể được truyền nguyên trạng đến vị trí. Trong ví dụ của ta , ta đang chuyển một file vào root tài liệu của Nginx.

Trong trường hợp của ta , ta chỉ định tên file mà ta đang cố gắng tạo ở dòng đầu tiên. Trong dòng "nguồn", ta cho nó biết tên của file cần tìm trong sách nấu ăn. Chef tìm kiếm file này trong folder con "tệp / mặc định" trong sách nấu ăn.

Dòng "chế độ" đặt quyền trên file ta đang tạo. Trong trường hợp này, ta đang cho phép user root quyền đọc và ghi và những người khác có quyền đọc.

Lưu file này khi bạn hoàn tất.

Tạo file index


Như bạn đã thấy ở trên, ta đã xác định tài nguyên “cookbook_file” sẽ di chuyển file có tên “index.html” vào root tài liệu trên nút. Ta cần tạo file này.

Ta nên đặt file này vào folder con “tệp / mặc định” trong sách dạy nấu ăn của bạn . Tới đó ngay bây giờ bằng lệnh :

cd ~/chef-repo/cookbooks/nginx/files/default 

Bên trong folder này, ta sẽ tạo file mà ta đã tham chiếu:

nano index.html 

Tệp này sẽ chỉ là một trang HTML thực sự đơn giản nhằm chứng minh rằng các tài nguyên của ta đã hoạt động theo cách ta muốn.

Dán cái này vào file :

<html>   <head>     <title>Hello there</title>   </head>   <body>     <h1>This is a test</h1>     <p>Please work!</p>   </body> </html> 

Lưu file khi bạn hoàn tất.

Tạo Sách nấu ăn cho Người trợ giúp


Trước khi đi xa hơn, ta hãy giải quyết trước một vấn đề nhỏ. Khi nút của ta cố gắng chạy sách dạy nấu ăn mà ta đã tạo như hiện tại, rất có thể, nó sẽ bị lỗi.

Đó là bởi vì nó sẽ cố gắng cài đặt Nginx từ repository Ubuntu và database gói trên nút của ta rất có thể đã lỗi thời. Thông thường, ta chạy “sudo apt-get update” trước khi chạy các lệnh gói.

Để giải quyết vấn đề này, ta có thể tạo một sách dạy nấu ăn đơn giản với mục đích duy nhất là đảm bảo database gói được cập nhật.

Ta có thể làm điều này bằng cách sử dụng cùng một cú pháp dao mà ta đã sử dụng trước đây. Hãy gọi cuốn sách nấu ăn này là “apt”:

knife cookbook create apt 

Điều này sẽ tạo ra cùng một loại cấu trúc folder mà ta đã có khi bắt đầu với sách dạy nấu ăn Nginx của bạn .

Hãy đi thẳng vào cuộc đuổi bắt và chỉnh sửa công thức mặc định cho cuốn sách nấu ăn mới của ta .

nano ~/chef-repo/cookbooks/apt/recipes/default.rb 

Trong file này, ta sẽ khai báo một tài nguyên "thực thi". Đây chỉ đơn giản là một cách xác định một lệnh mà ta muốn chạy trên nút.

Tài nguyên của ta trông như thế này:

execute "apt-get update" do   command "apt-get update" end 

Dòng đầu tiên cung cấp tên cho tài nguyên của ta . Trong trường hợp của ta , ta gọi tài nguyên này là vì lợi ích đơn giản. Nếu thuộc tính "command" được xác định (như ta đã làm), thì đây là lệnh thực sự được thực thi.

Vì chúng hoàn toàn giống nhau, nên dù sao thì cũng không thành vấn đề.

Lưu và đóng file .

Bây giờ ta đã có sách dạy nấu ăn mới, có một số cách để ta có thể đảm bảo ta thực hiện điều này trước sách dạy nấu ăn Nginx của ta . Ta có thể thêm nó vào danh sách chạy của nút trước sách dạy nấu ăn Nginx, nhưng ta cũng có thể buộc nó vào policy dạy nấu ăn Nginx.

Đây có lẽ là lựa chọn tốt hơn vì ta sẽ không phải nhớ thêm sách nấu ăn “apt” trước sách dạy nấu ăn “nginx” trên mọi nút mà ta muốn cấu hình cho Nginx.

Ta cần điều chỉnh một số điều trong sách dạy nấu ăn Nginx để biến điều này thành hiện thực. Đầu tiên, hãy mở lại file công thức Nginx:

nano ~/chef-repo/cookbooks/nginx/recipes/default.rb 

Ở đầu sách dạy nấu ăn này, trước các tài nguyên khác mà ta đã xác định, ta có thể đọc trong công thức mặc định “apt” bằng lệnh :

<pre>
<span class = “highlight”> include_recipe “apt” </span>

gói 'nginx' làm
action: cài đặt
kết thúc

dịch vụ 'nginx' làm
action [: enable,: start]
kết thúc

cookbook_file “/usr/share/nginx/www/index.html” làm
nguồn “index.html”
chế độ “0644”
kết thúc
</pre>

Lưu và đóng file .

Tệp khác mà ta cần chỉnh sửa là file metadata.rb . Tệp này được kiểm tra khi server Chef gửi danh sách chạy đến nút, để xem công thức nấu ăn nào khác sẽ được thêm vào danh sách chạy.

Mở file ngay bây giờ:

nano ~/chef-repo/cookbooks/nginx/metadata.rb 

Ở cuối file , bạn có thể thêm dòng này:

<pre>
tên 'nginx'
người bảo trì 'TÊN CÔNG TY CỦA BẠN'
email của người bảo trì ' EMAIL CỦA BẠN '
giấy phép 'Mọi quyền được bảo lưu'
mô tả 'Cài đặt / Cấu hình nginx'
mô tả dài IO.read (File.join (File.dirname ( FILE _), 'README.md'))
version '0.1.0'

<span class = “highlight”> phụ thuộc vào “apt” </span>
</pre>

Sau khi hoàn thành, sách dạy nấu ăn Nginx của ta hiện dựa vào sách dạy nấu ăn apt của ta để chăm sóc cập nhật database gói.

Thêm Cookbook vào Node của bạn


Như vậy, sách dạy nấu ăn cơ bản của ta đã hoàn thành, ta có thể tải chúng lên server đầu bếp của bạn .

Ta có thể làm điều đó riêng lẻ bằng lệnh :

knife cookbook upload apt knife cookbook upload nginx 

Hoặc, ta có thể tải lên mọi thứ bằng lệnh :

knife cookbook upload -a 

Dù bằng cách nào, công thức nấu ăn của ta sẽ được tải lên server Chef.

Bây giờ, ta có thể sửa đổi danh sách các node của ta . Ta có thể làm điều này một cách dễ dàng bằng lệnh :

<pre>
chỉnh sửa nút dao <span class = “highlight”> tên của nút </span>
</pre>

Nếu bạn cần tìm tên của các node có sẵn, có thể chạy lệnh:

knife node list 

client1 

Theo mục đích của ta , khi ta nhập file này, ta nhận được một file trông giống như sau:

knife node edit client1 

{   "name": "client1",   "chef_environment": "_default",   "normal": {     "tags": [      ]   },   "run_list": [    ] } 

Bạn có thể cần đặt biến môi trường EDITOR của bạn trước khi biến này hoạt động. Bạn có thể thực hiện việc này bằng lệnh :

<pre>
export EDITOR = <span class = “highlight”> tên người chỉnh sửa </span>
</pre>

Như bạn thấy , đây là một tài liệu JSON đơn giản mô tả một số khía cạnh của nút của ta . Ta có thể thấy một mảng "run_list", hiện đang trống.

Ta có thể thêm sách dạy nấu ăn Nginx của bạn vào mảng đó bằng định dạng:

<pre>
“Công thức [<span class =" nổi bật”> tên của công thức </ span>]"
</pre>

Khi ta hoàn thành, file của ta sẽ trông như thế này:

{   "name": "client1",   "chef_environment": "_default",   "normal": {     "tags": [      ]   },   "run_list": [     "recipe[nginx]"   ] } 

Lưu file để triển khai cài đặt mới.

Bây giờ, ta có thể SSH vào nút của bạn và chạy phần mềm client Chef. Điều này sẽ khiến khách hàng đăng ký vào server Chef. Sau khi thực hiện điều này, nó sẽ thấy danh sách chạy mới đã được chỉ định.

SSH vào nút của bạn và sau đó chạy điều này:

sudo chef-client 

Starting Chef Client, version 11.8.2 resolving cookbooks for run list: ["nginx"] Synchronizing Cookbooks:   - apt   - nginx Compiling Cookbooks... Converging 4 resources Recipe: apt::default   * execute[apt-get update] action run     - execute apt-get update  Recipe: nginx::default   * package[nginx] action install (up to date)   * service[nginx] action enable     - enable service service[nginx]    * service[nginx] action start (up to date)   * cookbook_file[/usr/share/nginx/www/index.html] action create (up to date) Chef Client finished, 2 resources updated 

Như bạn thấy , sách dạy nấu ăn apt của ta cũng đã được gửi và chạy, mặc dù nó không có trong danh sách chạy mà ta đã tạo. Đó là vì Chef đã giải quyết các phụ thuộc một cách thông minh và sửa đổi danh sách chạy thực tế trước khi thực thi nó trên nút.

Lưu ý : Có nhiều phương pháp khác nhau đảm bảo rằng một cuốn sách nấu ăn hoặc công thức nấu ăn được chạy trước cuốn sách khác. Thêm một phụ thuộc chỉ là một lựa chọn và các phương pháp khác có thể được ưu tiên hơn.

Ta có thể xác minh điều này hoạt động bằng cách truy cập địa chỉ IP hoặc domain của nút của ta :

<pre>
http: // <span class = "highlight"> tên domain nút hoặc_IP </span>
</pre>

Bạn sẽ thấy một cái gì đó giống như sau:

Nút đầu bếp Nginx

Xin chúc mừng, bạn đã cấu hình nút đầu tiên của bạn bằng sách dạy nấu ăn Chef!

Kết luận


Mặc dù đây là một ví dụ rất đơn giản có thể không giúp bạn tiết kiệm nhiều thời gian trong việc cấu hình server của bạn theo cách thủ công, nhưng hy vọng bạn có thể bắt đầu thấy các khả năng của phương pháp xây dựng cơ sở hạ tầng này.

Nó không chỉ cho phép triển khai nhanh chóng và cấu hình các loại server khác nhau mà còn đảm bảo bạn biết chính xác cấu hình của tất cả các máy của bạn . Điều này cho phép bạn xác thực và kiểm tra cơ sở hạ tầng của bạn , đồng thời cung cấp cho bạn khuôn khổ mà bạn cần để nhanh chóng triển khai lại cơ sở hạ tầng của bạn theo ý thích.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin liên quan

Cách cài đặt MariaDB từ Binary Tarballs trên Ubuntu 13.10
2014-01-28
Cách thiết lập một cụm Serf trên một số VPS Ubuntu
2014-01-23
Cách cấu hình Cụm Galera với MariaDB trên server Ubuntu 12.04
2014-01-20
Cách cài đặt Neo4J trên VPS Ubuntu
2014-01-15
Cách sử dụng PM2 để thiết lập môi trường sản xuất Node.js trên VPS Ubuntu
2014-01-10
Cách sử dụng psad để phát hiện nỗ lực xâm nhập mạng trên VPS Ubuntu
2014-01-10
Cách sử dụng Makefiles để tự động hóa các tác vụ lặp đi lặp lại trên Ubuntu VPS
2014-01-07
Cách thiết lập CouchDB với ElasticSearch trên VPS Ubuntu 13.10
2013-12-30
Cách sử dụng Celery với RabbitMQ để xếp hàng các tác vụ trên Ubuntu VPS
2013-12-19
Cách thiết lập một Honeypot Pháo binh trên VPS Ubuntu
2013-12-04