Chef - Hướng dẫn nhanh

Chef là một công nghệ mã nguồn mở được phát triển bởi Opscode. Adam Jacob, đồng sáng lập Opscode được biết đến là người sáng lập ra Chef. Công nghệ này sử dụng mã hóa Ruby để phát triển các khối xây dựng cơ bản như công thức và sách nấu ăn. Chef được sử dụng trong tự động hóa cơ sở hạ tầng và giúp giảm bớt các công việc thủ công và lặp đi lặp lại để quản lý cơ sở hạ tầng.

Chef đã có quy ước riêng cho các khối xây dựng khác nhau, được yêu cầu để quản lý và tự động hóa cơ sở hạ tầng.

Tại sao lại là Chef?

Chef là một công nghệ quản lý cấu hình được sử dụng để tự động hóa việc cung cấp cơ sở hạ tầng. Nó được phát triển dựa trên ngôn ngữ Ruby DSL. Nó được sử dụng để sắp xếp hợp lý nhiệm vụ cấu hình và quản lý máy chủ của công ty. Nó có khả năng được tích hợp với bất kỳ công nghệ đám mây nào.

Trong DevOps, chúng tôi sử dụng Chef để triển khai và quản lý các máy chủ cũng như ứng dụng trong nhà và trên đám mây.

Đặc điểm của Chef

Sau đây là những đặc điểm nổi bật nhất của Chef -

  • Chef sử dụng ngôn ngữ Ruby phổ biến để tạo ngôn ngữ dành riêng cho miền.

  • Chef không đưa ra giả định về trạng thái hiện tại của một nút. Nó sử dụng các cơ chế của nó để có được trạng thái hiện tại của máy.

  • Chef lý tưởng để triển khai và quản lý máy chủ đám mây, lưu trữ và phần mềm.

Ưu điểm của Chef

Chef cung cấp những lợi thế sau:

  • Lower barrier for entry - Vì Chef sử dụng ngôn ngữ Ruby bản địa để cấu hình, một ngôn ngữ cấu hình tiêu chuẩn nên bất kỳ ai có kinh nghiệm phát triển đều có thể dễ dàng chọn được ngôn ngữ này.

  • Excellent integration with cloud- Sử dụng tiện ích dao, nó có thể dễ dàng tích hợp với bất kỳ công nghệ đám mây nào. Đây là công cụ tốt nhất cho một tổ chức muốn phân phối cơ sở hạ tầng của mình trên môi trường đa đám mây.

Nhược điểm của đầu bếp

Một số nhược điểm chính của Chef như sau:

  • Một trong những nhược điểm rất lớn của Chef là cách kiểm soát sách dạy nấu ăn. Nó cần được nói lảm nhảm liên tục để những người đang làm việc không nên lộn xộn với những cuốn sách nấu ăn của người khác.

  • Chỉ có đầu bếp solo.

  • Trong tình hình hiện tại, nó chỉ phù hợp với đám mây AWS.

  • Nó không phải là rất dễ học nếu người đó không quen thuộc với Ruby.

  • Tài liệu vẫn còn thiếu.

Các khối xây dựng chính của đầu bếp

Công thức

Nó có thể được định nghĩa là một tập hợp các thuộc tính được sử dụng để quản lý cơ sở hạ tầng. Các thuộc tính có trong công thức này được sử dụng để thay đổi trạng thái hiện có hoặc thiết lập một nút cơ sở hạ tầng cụ thể. Chúng được tải trong quá trình chạy máy khách Chef và được so sánh với thuộc tính hiện có của nút (máy). Sau đó, nó chuyển đến trạng thái được xác định trong tài nguyên nút của công thức. Nó là workhorse chính của sách nấu ăn.

Sách dạy nấu ăn

Sách dạy nấu ăn là một tập hợp các công thức nấu ăn. Chúng là các khối xây dựng cơ bản được tải lên máy chủ Chef. Khi Chef run diễn ra, nó đảm bảo rằng các công thức nấu ăn có bên trong nó sẽ nhận được một cơ sở hạ tầng nhất định đến trạng thái mong muốn như được liệt kê trong công thức.

Nguồn

Nó là thành phần cơ bản của một công thức được sử dụng để quản lý cơ sở hạ tầng với các loại trạng thái khác nhau. Có thể có nhiều tài nguyên trong một công thức, điều này sẽ giúp định cấu hình và quản lý cơ sở hạ tầng. Ví dụ -

  • package - Quản lý các gói trên một nút

  • service - Quản lý các dịch vụ trên một nút

  • user - Quản lý người dùng trên nút

  • group - Quản lý nhóm

  • template - Quản lý các tệp với mẫu Ruby nhúng

  • cookbook_file - Chuyển các tệp từ thư mục con tệp trong sách dạy nấu ăn đến một vị trí trên nút

  • file - Quản lý nội dung của tệp trên nút

  • directory - Quản lý các thư mục trên nút

  • execute - Thực hiện một lệnh trên nút

  • cron - Chỉnh sửa tệp cron hiện có trên nút

Thuộc tính

Về cơ bản chúng là cài đặt. Chúng có thể được coi như một cặp giá trị quan trọng của bất kỳ thứ gì mà người ta muốn sử dụng trong sách dạy nấu ăn. Có một số loại thuộc tính khác nhau có thể được áp dụng, với mức độ ưu tiên khác so với cài đặt cuối cùng mà nút hoạt động.

Tập tin

Đó là một thư mục con trong sách nấu ăn chứa bất kỳ tệp tĩnh nào sẽ được đặt trên các nút sử dụng sách nấu ăn. Sau đó, một công thức có thể được khai báo như một tài nguyên di chuyển các tệp từ thư mục đó đến nút cuối cùng.

Mẫu

Chúng tương tự như các tệp, nhưng chúng không tĩnh. Các tệp mẫu kết thúc bằng phần mở rộng .ebr, có nghĩa là chúng chứa Ruby được nhúng. Chúng chủ yếu được sử dụng để thay thế một giá trị thuộc tính vào các tệp để tạo ra phiên bản tệp cuối cùng sẽ được đặt trên nút.

Metadata.rb

Nó được sử dụng để quản lý siêu dữ liệu về gói. Điều này bao gồm các chi tiết như tên và chi tiết của gói. Nó cũng bao gồm những thứ như thông tin phụ thuộc cho biết sách nấu ăn này cần hoạt động. Điều này cho phép máy chủ Chef xây dựng danh sách chạy của nút một cách chính xác và đảm bảo rằng tất cả các phần được chuyển đúng cách.

Cấu trúc sách nấu ăn mặc định

C:\chef\cookbooks\nginx>tree 
Folder PATH listing for volume Local Disk 
Volume serial number is BE8B-6427 
C: ├───attributes 
├───definitions 
├───files 
│   └───default 
├───libraries 
├───providers 
├───recipes 
├───resources 
└───templates 
    └───default

Chef - Công nghệ liên quan

Sau đây là danh sách các công nghệ liên quan đến Chef.

Con rối

Puppet cung cấp một cách tiêu chuẩn để phân phối và vận hành phần mềm, bất kể nó chạy ở đâu. Nó là một công cụ quản trị tự động cho hệ thống Linux, Unix và Windows thực hiện các tác vụ quản trị dựa trên đặc điểm kỹ thuật tập trung.

Điều thiết yếu features of Puppet như sau -

  • Triển khai các hệ thống mới với cấu hình đồng nhất.
  • Cập nhật hệ thống và nâng cấp các gói phần mềm và bảo mật.
  • Kết hợp các tính năng mới và thêm các khả năng khéo léo.
  • Tùy chỉnh cấu hình để đảm bảo tính khả dụng của các nguồn dữ liệu.
  • Tối ưu hóa các nguồn lực sẵn có và giảm thiểu chi phí.
  • Đơn giản hóa các vai trò và cho phép nhóm tập trung vào các vấn đề cốt lõi và hiệu quả.
  • Nhìn toàn cảnh về cơ sở hạ tầng sẵn có.

Ansible

Ansible là một nền tảng tự động hóa CNTT hoàn toàn đơn giản giúp triển khai các ứng dụng và hệ thống của bạn dễ dàng hơn. Tránh viết tập lệnh hoặc mã tùy chỉnh để triển khai và cập nhật ứng dụng của bạn - tự động hóa bằng ngôn ngữ tiếp cận tiếng Anh thuần túy, sử dụng SSH, không có tác nhân để cài đặt trên các hệ thống từ xa.

Điều thiết yếu features of Ansible như sau -

  • Đơn giản và dễ học
  • Được viết bằng Python
  • Agentless
  • Playbooks dựa trên YAML
  • Thiên hà Ansible

SaltStack

SaltStack được sử dụng cho cấu hình theo hướng dữ liệu. Đây là một cách tiếp cận mới của quản lý cơ sở hạ tầng được xây dựng trên xe buýt truyền thông động. Nó được sử dụng để điều phối theo hướng dữ liệu, thực thi từ xa cho bất kỳ cơ sở hạ tầng nào và quản lý cấu hình cho bất kỳ ngăn xếp ứng dụng nào.

Sợi vải

Fabric là ngôn ngữ lập trình dựa trên Python, được phát triển dưới dạng API của Python cần được nhập bằng mã Python để định cấu hình và quản lý cơ sở hạ tầng.

Chef hoạt động trên mô hình máy chủ khách ba tầng, trong đó các đơn vị làm việc như sách nấu ăn được phát triển trên máy trạm Chef. Từ các tiện ích dòng lệnh như dao, chúng được tải lên máy chủ Chef và tất cả các nút hiện diện trong kiến ​​trúc đều được đăng ký với máy chủ Chef.

Để có được cơ sở hạ tầng Chef hoạt động tại chỗ, chúng ta cần thiết lập nhiều thứ theo trình tự.

Trong thiết lập trên, chúng ta có các thành phần sau.

Đầu bếp Workstation

Đây là vị trí mà tất cả các cấu hình được phát triển. Máy trạm đầu bếp được cài đặt trên máy cục bộ. Cấu trúc cấu hình chi tiết được thảo luận trong các chương sau của hướng dẫn này.

Máy chủ Chef

Điều này hoạt động như một đơn vị làm việc tập trung của thiết lập Chef, nơi tất cả các tệp cấu hình được tải lên sau khi phát triển. Có nhiều loại máy chủ Chef khác nhau, một số là máy chủ Chef được lưu trữ trong khi một số là tiền đề tích hợp sẵn.

Nút đầu bếp

Chúng là những cỗ máy thực tế sẽ được quản lý bởi Chef server. Tất cả các nút có thể có các kiểu thiết lập khác nhau theo yêu cầu. Máy khách Chef là thành phần quan trọng của tất cả các nút, giúp thiết lập giao tiếp giữa máy chủ Chef và nút Chef. Các thành phần khác của nút Chef là Ohai, giúp đạt được trạng thái hiện tại của bất kỳ nút nào tại một thời điểm nhất định.

Sử dụng hệ thống Kiểm soát Phiên bản là một phần cơ bản của tự động hóa cơ sở hạ tầng. Có nhiều loại hệ thống kiểm soát phiên bản như SVN, CVS và GIT. Do sự phổ biến của GIT trong cộng đồng Đầu bếp, chúng tôi sẽ sử dụng thiết lập GIT.

Note - Đừng nghĩ đến việc xây dựng cơ sở hạ tầng như một đoạn mã mà không có hệ thống kiểm soát phiên bản.

Trên Windows

Step 1- Tải xuống trình cài đặt Windows từ www.git-scm.org và làm theo các bước cài đặt.

Step 2 - Đăng ký kho lưu trữ trung tâm trên GitHub.

Step 3- Tải khóa ssh lên tài khoản GitHub để người dùng có thể tương tác với nó một cách dễ dàng. Để biết chi tiết về khóa ssh, hãy truy cập liên kết sauhttps://help.github.com/articles/generatingssh-keys.

Step 4 - Cuối cùng tạo repo trên tài khoản github bằng cách truy cập https://github.com/new với tên của Chef-repo.

Trước khi thực sự bắt đầu viết sách dạy nấu ăn, người ta có thể thiết lập một kho lưu trữ GIT ban đầu trên hộp phát triển và sao chép kho lưu trữ trống do Opscode cung cấp.

Step 1 - Tải cấu trúc kho Opscode Chef trống.

$ wget https://github.com/opscode/chef-repo/tarball/master

Step 2 - Giải nén bóng dầu.

$ tar –xvf master

Step 3 - Đổi tên thư mục.

$ mv opscode-chef-repo-2c42c6a/ chef-repo

Step 4 - Thay đổi thư mục làm việc hiện tại thành Chef repo.

$ cd chef-repo

Step 5 - Khởi tạo một repo nhận mới.

$ git init.

Step 6 - Kết nối với kho của bạn trên git hub.

$ git remote add origin [email protected]:vipin022/chef-

Step 7 - Đẩy repo cục bộ sang github.

$ git add. $ git commit –m “empty repo structure added” 
$ git push –u origin maste

Bằng cách sử dụng quy trình trên, bạn sẽ nhận được một repo đầu bếp trống tại chỗ. Sau đó, bạn có thể bắt tay vào phát triển các công thức nấu ăn và sách nấu ăn. Sau khi hoàn tất, bạn có thể đẩy các thay đổi lên GitHub.

Chef tuân theo khái niệm kiến ​​trúc client-server, do đó để bắt đầu làm việc với Chef, người ta cần thiết lập Chef trên máy trạm và phát triển cấu hình cục bộ. Sau đó, nó có thể được tải lên máy chủ Chef để làm cho chúng hoạt động trên các nút Chef, cần được cấu hình.

Opscode cung cấp một phiên bản được đóng gói đầy đủ, không có bất kỳ điều kiện tiên quyết nào bên ngoài. Đầu bếp đóng gói đầy đủ này được gọi làomnibus installer.

Trên máy Windows

Step 1 - Tải file .msi setup của cookDK trên máy.

Step 2 - Thực hiện theo các bước cài đặt và cài đặt nó vào vị trí mục tiêu.

Thiết lập sẽ giống như trong ảnh chụp màn hình sau.

Biến đường dẫn ChefDK

$ echo $PATH 
/c/opscode/chef/bin:/c/opscode/chefdk/bin:

Trên máy Linux

Để thiết lập trên máy Linux, trước tiên chúng ta cần phải làm quen với máy.

Step 1 - Sau khi cài đặt curl vào máy, chúng ta cần cài đặt Chef trên máy trạm bằng trình cài đặt Omnibus Chef của Opscode.

$ curl –L https://www.opscode.com/chef/install.sh | sudo bash

Step 2 - Cài đặt Ruby vào máy.

Step 3 - Thêm Ruby vào biến đường dẫn.

$ echo ‘export PATH = ”/opt/chef/embedded/bin:$PATH”’ ≫ ~/.bash_profile && 
source ~/.bash_profile

Omnibus Chef sẽ cài đặt Ruby và tất cả các viên ngọc Ruby cần thiết vào /opt/chef/embedded bằng cách thêm /opt/chef/embedded/bin đến tệp .bash_profile.

Nếu Ruby đã được cài đặt, hãy cài đặt viên ngọc Chef Ruby trên máy bằng cách chạy lệnh sau.

$ gem install chef

Để làm cho nút Chef giao tiếp với máy chủ Chef, bạn cần thiết lập máy khách Chef trên nút.

Khách hàng đầu bếp

Đây là một trong những thành phần quan trọng của nút Chef, nó lấy các sách nấu ăn từ máy chủ Chef và thực thi chúng trên nút. Nó còn được gọi là Chef provisioner.

Ở đây, chúng ta sẽ sử dụng Vagrant để quản lý VM. Vagrant cũng có thể được cấu hình với trình cung cấp như Shell script, Chef và Puppet để đưa VM vào trạng thái mong muốn. Trong trường hợp của chúng tôi, chúng tôi sẽ sử dụng Vagrant để quản lý các máy ảo bằng VirtualBox và ứng dụng khách Chef như một người cung cấp.

Step 1 - Tải xuống và cài đặt VirtualBox từ https://www.virtualbox.org/wiki/downlod

Step 2 - Tải xuống và cài đặt Vagrant tại http://downloads.vagrantup.com

Step 3 - Cài đặt plugin Vagrant Omnibus để cho phép Vagrant cài đặt ứng dụng khách Chef trên máy ảo.

$ vagrant plugin install vagrant-omnibus

Tạo và khởi động máy ảo

Step 1- Chúng tôi có thể tải xuống hộp Vagrant được yêu cầu từ repo Opscode vagrant. Tải xuống hộp opscode-ubuntu-12.04 từ URL sauhttps://opscode-vmbento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box

Step 2 - Sau khi bạn có tệp Vagrant, hãy tải xuống đường dẫn bạn cần để chỉnh sửa tệp Vagrant.

vipin@laptop:~/chef-repo $ subl Vagrantfile 
Vagrant.configure("2") do |config| 
   config.vm.box = "opscode-ubuntu-12.04" 
   config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/ 
   vagrant/opscode_ubuntu-12.04_provisionerless.box 
   config.omnibus.chef_version = :latest  
   config.vm.provision :chef_client do |chef| 
      chef.provisioning_path = "/etc/chef" 
      chef.chef_server_url = "https://api.opscode.com/ 
      organizations/<YOUR_ORG>" 
      chef.validation_key_path = "/.chef/<YOUR_ORG>-validator.pem"
      chef.validation_client_name = "<YOUR_ORG>-validator" 
      chef.node_name = "server" 
   end 
end

Trong chương trình trên, bạn cần cập nhật tên <YOUR_ORG> với tên tổ chức chính xác hoặc bắt buộc.

Step 3- Bước tiếp theo sau khi cấu hình là mở hộp vagrant. Đối với điều này, bạn cần phải di chuyển đến vị trí đặt hộp Vagrant và chạy lệnh sau.

$ vagrant up

Step 4 - Sau khi máy khởi động, bạn có thể đăng nhập vào máy bằng lệnh sau.

$ vagrant ssh

Trong lệnh trên, vagrantfile được viết bằng ngôn ngữ dành riêng cho miền Ruby (DSL) để cấu hình máy ảo vagrant.

Trong tệp vagrant, chúng ta có đối tượng cấu hình. Vagrant sẽ sử dụng đối tượng cấu hình này để cấu hình máy ảo.

Vagrant.configure("2") do |config| 
……. 
End

Bên trong khối cấu hình, bạn sẽ cho vagrant biết hình ảnh VM nào sẽ sử dụng để khởi động nút.

config.vm.box = "opscode-ubuntu-12.04" 
config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/ 
   vagrant/opscode_ubuntu-12.04_provisionerless.box

Trong bước tiếp theo, bạn sẽ yêu cầu Vagrant tải xuống plugin omnibus.

config.omnibus.chef_version = :latest

Sau khi chọn hộp VM để khởi động, hãy cấu hình cách cung cấp hộp bằng Chef.

config.vm.provision :chef_client do |chef| 
….. 
End

Bên trong này, bạn cần thiết lập hướng dẫn về cách kết nối nút ảo với máy chủ Chef. Bạn cần cho Vagrant biết nơi bạn cần lưu trữ tất cả các công cụ Chef trên nút.

chef.provisioning_path = "/etc/chef"

Test Kitchen là khung kiểm tra tích hợp của Chef's. Nó cho phép viết các công thức nấu ăn thử nghiệm, sẽ chạy trên máy ảo sau khi chúng được khởi tạo và hội tụ bằng cách sử dụng sách nấu ăn. Các công thức thử nghiệm chạy trên máy ảo đó và có thể xác minh xem mọi thứ có hoạt động như mong đợi hay không.

ChefSpeclà một cái gì đó chỉ mô phỏng một Chef run. Thử nghiệm nhà bếp khởi động nút thực và chạy Chef trên đó.

Step 1 - Cài đặt đá quý Ruby của bếp thử nghiệm và đá quý thử nghiệm trong bếp để cho phép bếp thử nghiệm sử dụng đá quý thử nghiệm để quay.

$ gem install kitchen 
$ gem install kitchen-vagrant

Step 2- Đặt bếp thử. Điều này có thể được thực hiện bằng cách tạo.kitchen.yml trong thư mục sách nấu ăn.

driver_plugin: vagrant 
driver_config: 
   require_chef_omnibus: true 
platforms: 
   - name: ubuntu-12.04 
   driver_config: 
      box: opscode-ubuntu-12.04 
      box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ 
      ubuntu-12.04_provisionerless.box 
suites: 
   - name: default 
run_list: 
   - recipe[minitest-handler] 
   - recipe[my_cookbook_test] 
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} }

Trong đoạn mã trên, một phần xác định rằng vagrant cần quay các máy ảo và nó xác định rằng bạn muốn Omnibus cài đặt Chef trên nút đích.

Phần thứ hai xác định nền tảng nào bạn muốn kiểm tra sách nấu ăn. Vagrant sẽ luôn tạo và hủy các phiên bản mới. Bạn không phải lo lắng về các tác dụng phụ với máy ảo ảo mà bạn tạo ra bằng cách sử dụng tệp Vagrant.

Thử nghiệm bếp có thể được coi là một môi trường tạm thời giúp chạy và thử nghiệm sách nấu ăn trong một môi trường tạm thời tương tự như sản xuất. Khi bật bếp thử nghiệm, người ta có thể đảm bảo rằng đoạn mã đã cho đang hoạt động, trước khi nó thực sự được triển khai vào môi trường thử nghiệm, tiền sản xuất và sản xuất. Tính năng này của nhà bếp thử nghiệm được nhiều tổ chức tuân theo như một bộ trước khi đưa sách nấu ăn vào môi trường làm việc thực tế.

Kiểm tra quy trình làm việc của nhà bếp

Sau đây là các bước liên quan đến Quy trình làm việc của Nhà bếp Thử nghiệm.

Tạo sách dạy nấu ăn bằng Chef

Sử dụng mã sau để tạo sách nấu ăn.

$ chef generate cookbook motd_rhel 
Installing Cookbook Gems: 

Compiling Cookbooks... 
Recipe: code_generator::cookbook
   * directory[C:/chef/cookbooks/motd_rhel] action create
      - create new directory C:/chef/cookbooks/motd_rhel
   
   * template[C:/chef/cookbooks/motd_rhel/metadata.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/metadata.rb
      - update content in file C:/chef/cookbooks/motd_rhel/metadata.rb from none to 
      d6fcc2 (diff output suppressed by config)
   
   * template[C:/chef/cookbooks/motd_rhel/README.md] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/README.md
      - update content in file C:/chef/cookbooks/motd_rhel/README.md from none to 50deab
         (diff output suppressed by config)
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/chefignore] action create
      - create new file C:/chef/cookbooks/motd_rhel/chefignore
      - update content in file C:/chef/cookbooks/motd_rhel/chefignore from none to 15fac5
         (diff output suppressed by config)
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/Berksfile] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/Berksfile
      - update content in file C:/chef/cookbooks/motd_rhel/Berksfile from none to 9f08dc
         (diff output suppressed by config)
   
   * template[C:/chef/cookbooks/motd_rhel/.kitchen.yml] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/.kitchen.yml
      - update content in file C:/chef/cookbooks/motd_rhel/.kitchen.yml
         from none to 49b92b (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec]
      action create 
      - create new directory 
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec
   
   * directory[C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec]
      action create 
      - create new directory 
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec
   
   * cookbook_file
      [C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb]
      action create_if_missing
      - create new file 
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
            from none to d85df4 (diff output suppressed by config)
   
   * template
      [C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/defaul t_spec.rb]
      action create_if_missing
      - create new file
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
            from none to 3fbdbd (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/spec/unit/recipes] action create
      - create new directory C:/chef/cookbooks/motd_rhel/spec/unit/recipes
   
   * cookbook_file
      [C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb from none to 587075
            (diff output suppressed by config)
   
   * template
      [C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb]
      action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
            from none to ff3b17 (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/recipes] action create
      - create new directory C:/chef/cookbooks/motd_rhel/recipes
   
   * template[C:/chef/cookbooks/motd_rhel/recipes/default.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/recipes/default.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/recipes/default.rb from none to c4b029
            (diff output suppressed by config) 
   
   * execute[initialize-git] action run 
      - execute git init . 
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/.gitignore] action create
      - create new file C:/chef/cookbooks/motd_rhel/.gitignore
      - update content in file C:/chef/cookbooks/motd_rhel/.gitignore from none to 33d469
         (diff output suppressed by config)
   
   * execute[git-add-new-files] action run
      - execute git add .
   
   * execute[git-commit-new-files] action run 
      - execute git commit -m "Add generated cookbook content"

Sau đây là Cấu trúc Sách dạy nấu ăn đã Tạo dưới dạng đầu ra của đoạn mã trên.

Kiểm tra tệp cấu hình nhà bếp

tệp .kitchen.yaml

driver: 
   name: vagrant 
provisioner: 
   name: chef_zero 
# verifier: 
# name: inspec 
# format: doc 
platforms: 
   - name: ubuntu-14.04 
suites: 
   - name: default 
   run_list: 
      - recipe[motd_rhel::default] 
   attributes:

Drivers - Nó chỉ định phần mềm quản lý máy.

Provisioner- Nó cung cấp đặc điểm kỹ thuật về cách Chef điều hành. Chúng tôi đang sử dụng Chef_zero vì nó cho phép bắt chước môi trường máy chủ Chef trên máy cục bộ. Điều này cho phép làm việc với các thuộc tính nút và thông số kỹ thuật của máy chủ Chef.

Platform - Điều này chỉ định hệ điều hành mục tiêu.

Suites- Nó xác định những gì người ta muốn áp dụng trên môi trường ảo. Ở đây, bạn xác định nhiều định nghĩa. Đây là vị trí mà bạn xác định danh sách chạy, chỉ định công thức sẽ chạy và chúng ta cần chạy theo trình tự nào.

Chạy các lệnh theo trình tự

Danh sách nhà bếp

$ kitchen list 
Instance  Driver  Provisioner Verifier   Transport Last Action 
ubuntu-1404 Vagrant ChefZero   Busser       Ssh   <Not Created>

Bếp Tạo

$ kitchen create
-----> Starting Kitchen (v1.4.2)
-----> Creating <default-centos-72>...
      Bringing machine 'default' up with 'virtualbox' provider...
      ==> default: Box 'opscode-centos-7.2' could not be found.
         Attempting to find and install...
      default: Box Provider: virtualbox
      default: Box Version: >= 0
      ==> default: Box file was not detected as metadata. Adding it directly...
         ==> default: Adding box 'opscode-centos-7.2' (v0) for provider: virtualbox
         default: Downloading:
            https://opscode-vmbento.s3.amazonaws.com/vagrant/virtualbox/
            opscode_centos-7.1_chefprovisionerless.box[...]
         Vagrant instance <default-centos-72> created.
         Finished creating <default-centos-72> (3m12.01s).
         -----> Kitchen is finished. (3m12.60s)

Hội tụ nhà bếp

$ kitchen converge 
-----> Converging <default-centos-72>...        
      Preparing files for transfer        
      Preparing dna.json        
      Resolving cookbook dependencies with Berkshelf 4.0.1...
      Removing non-cookbook files before transfer       
      Preparing validation.pem        
      Preparing client.rb 
-----> Chef Omnibus   installation detected (install only if missing)        
      Transferring files to <default-centos-72>       
      Starting Chef Client, version 12.6.0        
      resolving cookbooks for run list: ["motd_rhel::default"]
      Synchronizing Cookbooks: - motd_rhel (0.1.0)       
      Compiling Cookbooks...       Converging 1 resources        
      Recipe: motd_rhel::default        (up to date)         
      Running handlers:       Running handlers complete       
      Chef Client finished, 0/1 resources updated in 01 seconds        
      Finished converging <default-centos-72> (0m3.57s). 
      -----> Kitchen is finished. (0m4.55s)

Thử nghiệm thiết lập

Đăng nhập nhà bếp được sử dụng để kiểm tra xem máy ảo thử nghiệm có được cung cấp chính xác hay không.

$ kitchen login 
Last login: Thu Jan 30 19:02:14 2017 from 10.0.2.2 
hostname:  default-centos-72 
fqdn:      default-centos-72 
memory:    244180kBcpu count: 1

Cuối cùng thoát

$ exit 
Logout 
Connection to 127.0.0.1 closed.

Phá hủy thiết lập

$ Kitchen destroy 
-----> Starting Kitchen (v1.4.2) 
-----> Destroying <default-centos-72>...       
   ==> default: Forcing shutdown of VM...        
   ==> default: Destroying VM and associated drives...        
   Vagrant instance <default-centos-72> destroyed.        
   Finished destroying <default-centos-72> (0m4.94s). 
-----> Kitchen is finished. (0m5.93s)

Knife là công cụ dòng lệnh của Chef để tương tác với máy chủ Chef. Một người sử dụng nó để tải lên sách nấu ăn và quản lý các khía cạnh khác của Chef. Nó cung cấp giao diện giữa ChefDK (Repo) trên máy cục bộ và máy chủ Chef. Nó giúp quản lý -

  • Nút đầu bếp
  • Cookbook
  • Recipe
  • Environments
  • Tài nguyên đám mây
  • Cấp phép đám mây
  • Cài đặt trên máy khách Chef trên các nút Chef

Knife cung cấp một tập hợp các lệnh để quản lý cơ sở hạ tầng Chef.

Lệnh Bootstrap

  • dao bootstrap [SSH_USER @] FQDN (tùy chọn)

Lệnh máy khách

  • khách hàng dao xóa số lượng lớn REGEX (tùy chọn)
  • khách hàng dao tạo CLIENTNAME (tùy chọn)
  • khách hàng dao xóa CLIENT (tùy chọn)
  • khách hàng dao chỉnh sửa CLIENT (tùy chọn)
  • Cách sử dụng: C: / opscode / chef / bin / dao (tùy chọn)
  • phím khách dao xóa CLIENT KEYNAME (tùy chọn)
  • chỉnh sửa phím khách dao CLIENT KEYNAME (tùy chọn)
  • danh sách chìa khóa khách hàng của dao CLIENT (tùy chọn)
  • hiển thị phím khách hàng dao CLIENT KEYNAME (tùy chọn)
  • danh sách khách hàng dao (tùy chọn)
  • khách hàng dao đăng ký lại CLIENT (tùy chọn)
  • trình diễn dao khách hàng CLIENT (tùy chọn)

Định cấu hình lệnh

  • cấu hình dao (tùy chọn)
  • dao cấu hình máy khách TRỰC TIẾP

Lệnh Cookbook

  • sách nấu ăn dao xóa số lượng lớn REGEX (tùy chọn)
  • sách nấu ăn dao tạo COOKBOOK (tùy chọn)
  • sách nấu ăn dao xóa PHIÊN BẢN COOKBOOK (tùy chọn)
  • tải xuống sách dạy nấu ăn COOKBOOK [VERSION] (tùy chọn)
  • danh sách sách nấu ăn dao (tùy chọn)
  • siêu dữ liệu sách nấu ăn COOKBOOK (tùy chọn)
  • siêu dữ liệu sách nấu ăn dao từ FILE (tùy chọn)
  • sách dạy nấu ăn bằng dao COOKBOOK [VERSION] [PART] [FILENAME] (tùy chọn)
  • kiểm tra sách nấu ăn bằng dao [COOKBOOKS ...] (tùy chọn)
  • Tải lên sách dạy nấu ăn dao [COOKBOOKS ...] (tùy chọn)

Lệnh trang web Cookbook

  • Trang web sách dạy nấu ăn tải xuống COOKBOOK [VERSION] (tùy chọn)
  • trang web dạy nấu ăn dao cài đặt COOKBOOK [VERSION] (tùy chọn)
  • danh sách trang web sách nấu ăn dao (tùy chọn)
  • tìm kiếm trang web sách nấu ăn dao QUERY (tùy chọn)
  • trang web dạy nấu ăn dao chia sẻ COOKBOOK [CATEGORY] (tùy chọn)
  • Trang web sách dạy nấu dao hiển thị COOKBOOK [VERSION] (tùy chọn)
  • trang web dạy nấu ăn dao đã hủy chia sẻ COOKBOOK

Lệnh về túi dữ liệu

  • túi dữ liệu dao tạo TÚI [ITEM] (tùy chọn)
  • túi dữ liệu dao xóa BAG [ITEM] (tùy chọn)
  • túi dữ liệu dao chỉnh sửa BAG ITEM (tùy chọn)
  • túi dữ liệu dao từ tệp BAG FILE | FOLDER [FILE | FOLDER ..] (tùy chọn)
  • danh sách túi dữ liệu dao (tùy chọn)
  • túi dữ liệu dao hiển thị BAG [ITEM] (tùy chọn)

Lệnh Môi trường

  • môi trường dao so sánh [ENVIRONMENT ..] (tùy chọn)
  • môi trường dao tạo ra MÔI TRƯỜNG (tùy chọn)
  • môi trường dao xóa MÔI TRƯỜNG (tùy chọn)
  • môi trường dao chỉnh sửa MÔI TRƯỜNG (tùy chọn)
  • môi trường dao từ tệp FILE [FILE ..] (tùy chọn)
  • danh sách môi trường dao (tùy chọn)
  • môi trường dao hiển thị MÔI TRƯỜNG (tùy chọn)

Lệnh thực thi

  • dao thực thi [SCRIPT] (tùy chọn)

Lệnh trợ giúp

  • trợ giúp dao [danh sách | CHỦ ĐỀ]

Lệnh chỉ mục

  • xây dựng lại chỉ mục dao (tùy chọn)

Lệnh nút

  • nút dao xóa số lượng lớn REGEX (tùy chọn)
  • nút dao tạo NODE (tùy chọn)
  • nút dao xóa NODE (tùy chọn)
  • nút dao chỉnh sửa NODE (tùy chọn)
  • thiết lập môi trường nút dao NODE ENVIRONMENT
  • nút dao từ tệp FILE (tùy chọn)
  • danh sách nút dao (tùy chọn)
  • nút dao run_list thêm [NODE] [ENTRY [, ENTRY]] (tùy chọn)
  • nút dao run_list xóa [NODE] [ENTRY [, ENTRY]] (tùy chọn)
  • nút dao run_list đặt NODE ENTRIES (tùy chọn)
  • nút dao hiển thị NODE (tùy chọn)

Lệnh OSC

  • dao osc_user tạo USER (tùy chọn)
  • dao osc_user xóa USER (tùy chọn)
  • dao osc_user chỉnh sửa USER (tùy chọn)
  • danh sách osc_user dao (tùy chọn)
  • dao osc_user đăng ký lại USER (tùy chọn)
  • dao osc_user hiển thị USER (tùy chọn)

Lệnh dựa trên đường dẫn

  • xóa dao [PATTERN1 ... PATTERNn]
  • đĩa dao PATTERN1 [PATTERNn]
  • dao khác MẪU
  • dao tải MẪU
  • chỉnh sửa dao [PATTERN1 ... PATTERNn]
  • danh sách dao [-dfR1p] [PATTERN1 ... PATTERNn]
  • trình diễn dao [PATTERN1 ... PATTERNn]
  • tải lên dao MẪU
  • dao xargs [COMMAND]

Lệnh thô

  • dao thô REQUEST_PATH

Lệnh công thức

  • danh sách công thức dao [PATTERN]

Lệnh vai trò

  • vai trò dao xóa số lượng lớn REGEX (tùy chọn)
  • vai trò dao tạo VAI TRÒ (tùy chọn)
  • vai trò con dao xóa ROLE (tùy chọn)
  • chỉnh sửa vai trò dao ROLE (tùy chọn)
  • vai trò dao env_run_list add [ROLE] [ENVIRONMENT] [ENTRY [, ENTRY]] (tùy chọn)
  • vai trò dao env_run_list clear [ROLE] [ENVIRONMENT]
  • vai trò dao env_run_list xóa [ROLE] [ENVIRONMENT] [ENTRIES]
  • vai trò dao env_run_list thay thế [ROLE] [ENVIRONMENT] [OLD_ENTRY] [NEW_ENTRY]
  • vai trò dao env_run_list set [ROLE] [ENVIRONMENT] [ENTRIES]
  • vai trò dao từ tệp FILE [FILE ..] (tùy chọn)
  • danh sách vai trò dao (tùy chọn)
  • vai trò dao run_list thêm [ROLE] [ENTRY [, ENTRY]] (tùy chọn)
  • vai trò dao run_list clear [ROLE]
  • vai trò dao run_list xóa [ROLE] [ENTRY]
  • vai trò dao run_list thay thế [ROLE] [OLD_ENTRY] [NEW_ENTRY]
  • bộ run_list vai dao [ROLE] [ENTRIES]
  • trình diễn vai dao VAI TRÒ (tùy chọn)

Cung cấp lệnh

  • phục vụ dao (tùy chọn)

Lệnh SSH

  • dao ssh QUERY COMMAND (tùy chọn)

Lệnh SSL

  • kiểm tra dao ssl [URL] (tùy chọn)
  • dao ssl tìm nạp [URL] (tùy chọn)

Lệnh trạng thái

  • trạng thái dao QUERY (tùy chọn)

Lệnh thẻ

  • thẻ dao tạo THẺ NODE ...
  • thẻ dao xóa THẺ NODE ...
  • danh sách thẻ dao NODE

Lệnh người dùng

  • người dùng dao tạo USERNAME DISPLAY_NAME FIRST_NAME LAST_NAME MẬT KHẨU EMAIL (tùy chọn)
  • người dùng dao xóa USER (tùy chọn)
  • người dùng dao chỉnh sửa USER (tùy chọn)
  • phím người dùng dao tạo USER (tùy chọn)
  • phím người dùng dao xóa USER KEYNAME (tùy chọn)
  • phím người dùng dao chỉnh sửa USER KEYNAME (tùy chọn)
  • danh sách phím người dùng dao USER (tùy chọn)
  • hiển thị phím người dùng dao USER KEYNAME (tùy chọn)
  • danh sách người dùng dao (tùy chọn)
  • người dùng dao đăng ký lại USER (tùy chọn)
  • người dùng dao hiển thị USER (tùy chọn)

Thiết lập dao

Để thiết lập dao, người ta cần di chuyển đến .chef thư mục và tạo một knife.rbbên trong repo đầu bếp, cho dao biết về chi tiết cấu hình. Điều này sẽ có một vài chi tiết.

current_dir = File.dirname(__FILE__) 
log_level                :info 
log_location             STDOUT 
node_name                'node_name' 
client_key               "#{current_dir}/USER.pem" 
validation_client_name   'ORG_NAME-validator' 
validation_key           "#{current_dir}/ORGANIZATION-validator.pem" 
chef_server_url          'https://api.chef.io/organizations/ORG_NAME' 
cache_type               'BasicFile' 
cache_options( :path =>  "#{ENV['HOME']}/.chef/checksums" ) 
cookbook_path            ["#{current_dir}/../cookbooks"]

Trong đoạn mã trên, chúng tôi đang sử dụng máy chủ Chef được lưu trữ sử dụng hai phím sau.

validation_client_name   'ORG_NAME-validator' 
validation_key           "#{current_dir}/ORGANIZATION-validator.pem"

Tại đây, dao.rb cho dao biết nên sử dụng tổ chức nào và tìm khóa cá nhân ở đâu. Nó cho dao biết nơi tìm khóa cá nhân của người dùng.

client_key               "#{current_dir}/USER.pem"

Dòng mã sau đây cho dao biết rằng chúng ta đang sử dụng máy chủ được lưu trữ.

chef_server_url        'https://api.chef.io/organizations/ORG_NAME'

Sử dụng tệp dao.rb, dao trình xác nhận hiện có thể kết nối với Mã Opscode được lưu trữ của tổ chức bạn.

Chef-Solo là một công cụ mã nguồn mở chạy cục bộ và cho phép cung cấp cho các máy khách sử dụng sách nấu ăn Chef mà không cần cấu hình máy khách và máy chủ Chef phức tạp nào. Nó giúp thực thi sách nấu ăn trên một máy chủ tự tạo.

Trước khi chạy Chef-Solo trên máy cục bộ, người ta cần cài đặt hai tệp sau trên máy cục bộ.

  • Solo.rb - Tệp này cho Chef biết nơi tìm sách nấu ăn, vai trò và túi dữ liệu.

  • Node.json - Tệp này đặt danh sách chạy và bất kỳ thuộc tính cụ thể cho nút nào, nếu được yêu cầu.

Cấu hình solo.rb

Sau đây là các bước để cấu hình solo.rb.

Step 1 - Tạo tệp solo.rb bên trong repo đầu bếp.

current_dir       = File.expand_path(File.dirname(__FILE__)) 
file_cache_path   "#{current_dir}" 
cookbook_path     "#{current_dir}/cookbooks" 
role_path         "#{current_dir}/roles" 
data_bag_path     "#{current_dir}/data_bags"

Step 2 - Thêm tập tin vào git repo.

$ git add solo.rb

Step 3 - Tạo một tệp node.json bên trong Chef repo với nội dung như sau.

{ 
   "run_list": [ "recipe[ntp]" ] 
}

Step 4 - Nhận sách nấu ăn ntp bên trong repo đầu bếp bằng cách sử dụng dao.

vipin@laptop:~/chef-repo $ knife cookbook site install ntp 
Installing ntp to /Users/mma/work/chef-repo/cookbooks 
…TRUNCATED OUTPUT… 
Cookbook ntp version 1.3.0 successfully installed

Step 5 - Thêm tệp node.json vào Git.

$ git add node.json

Step 6 - Cam kết và đẩy các tập tin sang git repo.

vipin@laptop:~/chef-repo $ git commit -m "initial setup for Chef Solo" 
vipin@laptop:~/chef-repo $ git push 
Counting objects: 4, done. 
Delta compression using up to 4 threads. 
...TRUNCATED OUTPUT... 
To [email protected]:mmarschall/chef-repo.git 
b930647..5bcfab6 master -> master

Chạy Cookbook trên Node

Step 1 - Đăng nhập vào nút mà người ta muốn cung cấp Chef-Solo.

Step 2 - Sao chép repo Chef trên máy.

$ git clone $URL_PATH

Step 3 - cd cho repo đầu bếp.

$ cd chef-repo

Cuối cùng, chạy Chef-Solo để hội tụ nút -

$ sudo chef-solo -c solo.rb -j node.json 
[2017-20-08T22:54:13+01:00] INFO: *** Chef 11.0.0 *** 
[2017-20-08T22:54:13+01:00] INFO: Setting the run_list to 
["recipe[ntp]"] from JSON 
...TRUNCATED OUTPUT... 
[2012-12-08T22:54:16+01:00] INFO: Chef Run complete in 2.388374 
seconds 
[2012-12-08T22:54:16+01:00] INFO: Running report handlers

solo.rb cấu hình Chef-Solo để tìm kiếm sách nấu ăn, vai trò và túi dữ liệu của nó bên trong thư mục hiện tại: kho lưu trữ Chef.

Chef-Sololấy cấu hình nút của nó từ tệp JSON. Trong ví dụ của chúng tôi, chúng tôi gọi nó là node.json. Nếu bạn định quản lý nhiều máy chủ, bạn sẽ cần một tệp riêng cho mỗi nút. Sau đó, Chef-Solo chỉ thực hiện một Chef run dựa trên dữ liệu cấu hình được tìm thấy trong solo.rb và node.json.

Sách dạy nấu ăn là đơn vị làm việc cơ bản của Chef, bao gồm tất cả các chi tiết liên quan đến đơn vị làm việc, có khả năng sửa đổi cấu hình và trạng thái của bất kỳ hệ thống nào được cấu hình như một nút trên cơ sở hạ tầng Chef. Sách dạy nấu ăn có thể thực hiện nhiều tác vụ. Sách nấu ăn chứa các giá trị về trạng thái mong muốn của nút. Điều này đạt được trong Chef bằng cách sử dụng các thư viện bên ngoài mong muốn.

Các thành phần chính của Sách dạy nấu ăn

  • Recipes
  • Metadata
  • Attributes
  • Resources
  • Templates
  • Libraries
  • Bất kỳ điều gì khác giúp tạo hệ thống

Tạo Sách dạy nấu ăn

Có hai cách để tạo động một cuốn sách nấu ăn.

  • Sử dụng lệnh đầu bếp
  • Sử dụng tiện ích dao

Sử dụng lệnh Chef

Để tạo một sách dạy nấu ăn trống bằng lệnh Chef, hãy chạy lệnh sau.

C:\Users\vipinkumarm>chef generate cookbook <Cookbook Name> 
C:\Users\vipinkumarm>chef generate cookbook VTest
Installing Cookbook Gems:

Compiling Cookbooks...
Recipe: code_generator::cookbook
   * directory[C:/Users/vipinkumarm/VTest] action create
      - create new directory C:/Users/vipinkumarm/VTest
   
   * template[C:/Users/vipinkumarm/VTest/metadata.rb] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/metadata.rb
      - update content in file C:/Users/vipinkumarm/VTest/metadata.rb 
         from none to 4b9435 (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/README.md] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/README.md
      - update content in file C:/Users/vipinkumarm/VTest/README.md 
         from none to 482077 (diff output suppressed by config)

   * cookbook_file[C:/Users/vipinkumarm/VTest/chefignore] action create
      - create new file C:/Users/vipinkumarm/VTest/chefignore
      - update content in file C:/Users/vipinkumarm/VTest/chefignore 
         from none to 15fac5 (diff output suppressed by config)
   
   * cookbook_file[C:/Users/vipinkumarm/VTest/Berksfile] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/Berksfile
      - update content in file C:/Users/vipinkumarm/VTest/Berksfile 
         from none to 9f08dc (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/.kitchen.yml] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/.kitchen.yml
      - update content in file C:/Users/vipinkumarm/VTest/.kitchen.yml 
         from none to 93c5bd (diff output suppressed by config)

   * directory[C:/Users/vipinkumarm/VTest/test/integration/default/serverspec]
      action create
      - create new directory
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec
   
   * directory[C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec]
      action create
      - create new directory
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec
   
   * cookbook_file
      [C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/sp ec_helper.rb]
      action create_if_missing
      - create new file
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
      - update content in file
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
         from none to d85df4 (diff output suppressed by config)
   
   * template
      [C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default _spec.rb]
      action create_if_missing
      - create new file
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
      - update content in file
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
         from none to 758b94 (diff output suppressed by config)
   
   * directory[C:/Users/vipinkumarm/VTest/spec/unit/recipes] action create
      - create new directory C:/Users/vipinkumarm/VTest/spec/unit/recipes
   
   * cookbook_file[C:/Users/vipinkumarm/VTest/spec/spec_helper.rb]
      action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
      - update content in file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
         from none to 587075 (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb]
      action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
      - update content in file 
         C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
         from none to 779503 (diff output suppressed by config)
      - create new file C:/Users/vipinkumarm/VTest/recipes/default.rb
      - update content in file C:/Users/vipinkumarm/VTest/recipes/default.rb
         from none to 8cc381 (diff output suppressed by config)

   * cookbook_file[C:/Users/vipinkumarm/VTest/.gitignore] action create
      - create new file C:/Users/vipinkumarm/VTest/.gitignore
      - update content in file C:/Users/vipinkumarm/VTest/.gitignore from none to 33d469
         (diff output suppressed by config)

Cấu trúc sách dạy nấu ăn với tên VTest sẽ được tạo trong thư mục và sau đây sẽ là cấu trúc tương tự.

Sử dụng Tiện ích Dao

Sử dụng lệnh sau để tạo sách nấu ăn bằng tiện ích dao.

C:\Users\vipinkumarm\VTest>knife cookbook create VTest2 
WARNING: No knife configuration file found 
** Creating cookbook VTest2 in C:/chef/cookbooks 
** Creating README for cookbook: VTest2 
** Creating CHANGELOG for cookbook: VTest2 
** Creating metadata for cookbook: VTest2

Sau đây sẽ là cấu trúc của sách nấu ăn.

Các tính năng xác định sự phụ thuộc của sách nấu ăn giúp quản lý sách nấu ăn. Tính năng này được sử dụng khi chúng tôi muốn sử dụng chức năng của một sách nấu ăn trong các sách nấu ăn khác.

Ví dụ, nếu người ta muốn biên dịch mã C thì người ta cần đảm bảo rằng tất cả các phụ thuộc cần thiết để biên dịch đã được cài đặt. Để làm như vậy, có thể có sách dạy nấu ăn riêng có thể thực hiện chức năng như vậy.

Khi chúng tôi đang sử dụng máy chủ đầu bếp, chúng tôi cần biết các phụ thuộc như vậy trong sách nấu ăn sẽ được giảm tốc trong tệp siêu dữ liệu sách nấu ăn. Tệp này nằm ở trên cùng trong cấu trúc thư mục sách nấu ăn. Nó cung cấp gợi ý cho máy chủ Chef giúp triển khai sách nấu ăn trên đúng nút.

Tính năng của tệp metadata.rb

  • Nằm ở trên cùng trong cấu trúc thư mục sách nấu ăn.

  • Được biên dịch khi sách nấu ăn được tải lên máy chủ Chef bằng lệnh dao.

  • Được biên dịch bằng lệnh con siêu dữ liệu sách nấu ăn.

  • Được tạo tự động khi chạy lệnh tạo sổ nấu ăn dao.

Cấu hình của metadata.rb

Sau đây là nội dung mặc định của tệp siêu dữ liệu.

Vai trò trong Chef là một cách hợp lý để nhóm các nút. Các trường hợp điển hình là có các vai trò cho máy chủ web, máy chủ cơ sở dữ liệu, v.v. Người ta có thể đặt danh sách chạy tùy chỉnh cho tất cả các nút và ghi đè giá trị thuộc tính trong các vai trò.

Tạo một vai trò

vipin@laptop:~/chef-repo $ subl roles/web_servers.rb 
name "web_servers" 
description "This role contains nodes, which act as web servers" 
run_list "recipe[ntp]" 
default_attributes 'ntp' => { 
   'ntpdate' => { 
      'disable' => true 
   } 
}

Khi chúng tôi đã tạo vai trò, chúng tôi cần tải lên máy chủ Chef.

Tải vai trò lên Máy chủ Chef

vipin@laptop:~/chef-repo $ knife role from file web_servers.rb

Bây giờ, chúng ta cần gán một vai trò cho một nút được gọi là máy chủ.

Gán vai trò cho nút

vipin@laptop:~/chef-repo $ knife node edit server 
"run_list": [ 
   "role[web_servers]" 
] 
Saving updated run_list on node server

Chạy Chef-Client

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-07-25T13:28:24+00:00] INFO: Run List is [role[web_servers]] 
[2013-07-25T13:28:24+00:00] INFO: Run List expands to [ntp] 
...TRUNCATED OUTPUT...

Làm thế nào nó hoạt động

  • Xác định vai trò trong tệp Ruby bên trong thư mục vai trò của kho lưu trữ Chef.

  • Vai trò bao gồm tên và thuộc tính mô tả.

  • Vai trò bao gồm danh sách điều hành dành riêng cho vai trò và cài đặt thuộc tính dành riêng cho vai trò.

  • Mỗi nút có vai trò trong danh sách chạy của nó sẽ có danh sách chạy của vai trò được chính xác hóa thành của riêng nó.

  • Tất cả các công thức trong danh sách chạy của vai trò sẽ được thực thi trên nút.

  • Vai trò sẽ được tải lên máy chủ Chef bằng cách sử dụng vai trò dao từ lệnh tệp.

  • Vai trò sẽ được thêm vào danh sách chạy nút.

  • Chạy ứng dụng Chef Chef trên một nút có vai trò trong danh sách chạy của nó sẽ thực thi tất cả các công thức được liệt kê trong vai trò.

Chef giúp thực hiện cấu hình môi trường cụ thể. Luôn luôn là một ý kiến ​​hay khi có một môi trường riêng biệt để phát triển, thử nghiệm và sản xuất.

Chef cho phép nhóm các nút thành các môi trường riêng biệt để hỗ trợ luồng phát triển có thứ tự.

Tạo môi trường

Việc tạo ra môi trường đang bay có thể được thực hiện bằng cách sử dụng tiện ích dao. Lệnh sau sẽ mở trình soạn thảo mặc định của Shell để người ta có thể sửa đổi định nghĩa môi trường.

vipin@laptop:~/chef-repo $ knife environment create book { 
   "name": "book", 
   "description": "", 
   "cookbook_versions": { 
   }, 
   "json_class": "Chef::Environment", 
   "chef_type": "environment", 
   "default_attributes": { 
   }, 
   "override_attributes": { 
   } 
} 
Created book

Kiểm tra một môi trường đã tạo

vipin@laptop:~/chef-repo $ knife environment list 
_default 
book

Nút danh sách cho tất cả môi trường

vipin@laptop:~/chef-repo $ knife node list 
my_server

_Môi trường mặc định

Mỗi tổ chức sẽ luôn bắt đầu với ít nhất một môi trường duy nhất được gọi là môi trường mặc định, môi trường này luôn có sẵn cho máy chủ Chef. Không thể sửa đổi môi trường mặc định. Bất kỳ loại thay đổi nào chỉ có thể được thực hiện trong môi trường tùy chỉnh mà chúng tôi tạo ra.

Thuộc tính môi trường

Một thuộc tính có thể được xác định trong một môi trường và sau đó được sử dụng để ghi đè cài đặt mặc định trong nút. Khi quá trình chạy máy khách Chef diễn ra, các thuộc tính này được so sánh với các thuộc tính mặc định đã có trong nút. Khi các thuộc tính môi trường được ưu tiên hơn các thuộc tính mặc định, ứng dụng khách Chef sẽ áp dụng các cài đặt và giá trị này khi ứng dụng khách Chef chạy diễn ra trên mỗi nút.

Thuộc tính môi trường chỉ có thể là default_attribute hoặc override_attribute. Nó không thể là một thuộc tính bình thường. Người ta có thể sử dụng các phương thức default_attribute hoặc override_attribute.

Loại thuộc tính

Default - Một thuộc tính mặc định luôn được đặt lại khi bắt đầu mỗi lần chạy máy khách Chef và có mức ưu tiên thuộc tính thấp nhất.

Override- Thuộc tính ghi đè luôn được đặt lại khi bắt đầu mỗi lần chạy máy khách Chef và có mức ưu tiên thuộc tính cao hơn mặc định, force_default và bình thường. Thuộc tính ghi đè thường được xác định nhiều nhất trong công thức nhưng cũng có thể được chỉ định trong tệp thuộc tính cho một vai trò hoặc cho một môi trường.

Thứ tự áp dụng một thuộc tính

Chạy Chef-Client dưới dạng daemon giúp biết trạng thái của tất cả các nút tại bất kỳ thời điểm nào. Điều này giúp điều hành Chef-Client bất kỳ lúc nào.

Điều kiện tiên quyết

Nút phải được đăng ký với máy chủ Chef và nó sẽ chạy Chef-Client mà không có bất kỳ lỗi nào.

Chef-Client trong Daemon Mode

Khởi động Chef-Client ở chế độ daemon, chạy 30 phút một lần.

user@server:~$ sudo chef-client -i 1800

Trong đoạn mã trên, - i cho phép chạy Chef-Client ở chế độ daemon trên nút yêu cầu và 1800 giây xác định rằng daemon Chef-Client sẽ chạy sau mỗi 30 phút.

Xác thực Daemon Run

Xác thực rằng Chef-Client đang chạy dưới dạng daemon.

user@server:~$ ps auxw | grep chef-client

Lệnh trên sẽ gửi quá trình daemon đang chạy của Chef-Client.

Những cách khác

Thay vì chạy Chef-Client như một daemon, chúng ta có thể chạy giống như một cron job.

user@server:~$ subl /etc/cron.d/chef_client 
PATH=/usr/local/bin:/usr/bin:/bin 
# m h dom mon dow user command 
*/15 * * * * root chef-client -l warn | grep -v 'retrying [1234]/5 in'

Công việc cron trên sẽ chạy sau mỗi 15 phút.

Viết sách nấu ăn Chef luôn khó. Nó thậm chí còn khó khăn hơn vì chu kỳ phản hồi dài để tải chúng lên máy chủ Chef, cung cấp một máy ảo ảo, kiểm tra xem chúng bị lỗi ở đó như thế nào, rửa và lặp lại. Sẽ dễ dàng hơn nếu chúng ta có thể thử kiểm tra một số món ăn hoặc công thức trước khi thực hiện tất cả những việc nặng nhọc này cùng một lúc.

Chef đi kèm với Chef-Shell, về cơ bản là một phiên Ruby tương tác với Chef. Trong Chef-Shell, chúng ta có thể tạo -

  • Attributes
  • Viết công thức nấu ăn
  • Khởi chạy Chef chạy

Nó được sử dụng để đánh giá các phần của công thức nấu ăn một cách nhanh chóng, trước khi tải chúng lên máy chủ Chef và thực hiện các sách nấu ăn hoàn chỉnh trên nút.

Chạy Shell

Step 1 - Chạy Chef-Shell ở chế độ độc lập.

mma@laptop:~/chef-repo $ chef-shell 
loading configuration: none (standalone chef-shell session) 
Session type: standalone 
Loading...[2017-01-12T20:48:01+01:00] INFO: Run List is [] 
[2017-01-12T20:48:01+01:00] INFO: Run List expands to [] 
done. 
This is chef-shell, the Chef Shell. 
Chef Version: 11.0.0 
http://www.opscode.com/chef 
http://wiki.opscode.com/display/chef/Home 
run `help' for help, `exit' or ^D to quit. 
Ohai2u mma@laptop!  
chef >

Step 2 - Chuyển sang chế độ thuộc tính trong Chef-Shell

  • chef > attributes_mode

Step 3 - Đặt giá trị thuộc tính.

  • chef:attributes > set[:title] = "Chef Cookbook"

    • "Sách dạy nấu ăn"

  • chef:attributes > quit

    • :attributes

  • chef >

Step 4 - Chuyển sang chế độ công thức.

  • chef > recipe_mode

Step 5 - Tạo tài nguyên tệp.

chef:recipe > file "/tmp/book.txt" do 
chef:recipe > content node.title 
chef:recipe ?> end  

=> <file[/tmp/book.txt] @name: "/tmp/book.txt" @noop: nil @ 
before: nil @params: {} @provider: Chef::Provider::File @allowed_ 
actions: [:nothing, :create, :delete, :touch, :create_if_missing] 
@action: "create" @updated: false @updated_by_last_action: false 
@supports: {} @ignore_failure: false @retries: 0 @retry_delay: 
2 @source_line: "(irb#1):1:in `irb_binding'" @elapsed_time: 0 @ 
resource_name: :file @path: "/tmp/book.txt" @backup: 5 @diff: nil 
@cookbook_name: nil @recipe_name: nil @content: "Chef Cookbook">   

chef:recipe >

Step 6 - Chạy Commence Chef để tạo tệp với nội dung đã cho.

  • chef:recipe > run_chef

[2017-01-12T21:07:49+01:00] INFO: Processing file[/tmp/book.txt] 
action create ((irb#1) line 1) 
--- /var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/cheftempfile20121212- 
11348-dwp1zs 2012-12-12 21:07:49.000000000 
+0100 
+++ /var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/chefdiff20121212- 
11348-hdzcp1 2012-12-12 21:07:49.000000000 +0100 
@@ -0,0 +1 @@ 
+Chef Cookbook 
\ No newline at end of file 
[2017-01-12T21:07:49+01:00] INFO: entered create 
[2017-01-12T21:07:49+01:00] INFO: file[/tmp/book.txt] created file 
/tmp/book.txt

Làm thế nào nó hoạt động

  • Chef-Shell bắt đầu với phiên Interactive Ruby (IRB) được cải tiến với một số tính năng cụ thể.

  • Nó cung cấp các chế độ như thuộc tính_mode và tương tác_mode.

  • Nó giúp viết các lệnh được viết bên trong công thức nấu ăn hoặc sách dạy nấu ăn.

  • Nó chạy mọi thứ trong một chế độ tương tác.

Chúng ta có thể chạy Chef-Shell ở ba chế độ khác nhau: Standalone mode, Client modeSolo mode.

  • Standalone mode- Đây là chế độ mặc định. Không có sách dạy nấu ăn nào được tải và danh sách chạy trống.

  • Client mode - Ở đây, Chef-shell đóng vai trò là đầu bếp-khách hàng.

  • Solo mode - Ở đây, Chef-shell đóng vai trò là khách hàng solo đầu bếp.

Trong trường hợp sách nấu ăn được triển khai trực tiếp và chạy trên máy chủ sản xuất, thì rất có khả năng sách nấu ăn bị hỏng trong quá trình sản xuất. Cách tốt nhất để ngăn điều này xảy ra là thử nghiệm sách nấu ăn trong môi trường thiết lập.

Sau đây là các bước để kiểm tra.

Step 1 - Cài đặt sách nấu ăn bằng lệnh sau.

vipin@laptop:~/chef-repo $ knife cookbook site install <cookbook name>

Step 2 - Chạy các lệnh kiểm tra sách nấu dao trên sách nấu ăn đang hoạt động.

vipin@laptop:~/chef-repo $ knife cookbook test VTest  
checking ntp 
Running syntax check on ntp 
Validating ruby files 
Validating templates

Step 3 - Phá vỡ một cái gì đó trong sách nấu ăn và kiểm tra lại.

vipin@laptop:~/chef-repo $ subl cookbooks/VTest/recipes/default.rb 
... 
[ node['ntp']['varlibdir'] 
node['ntp']['statsdir'] ].each do |ntpdir| 
   directory ntpdir do 
      owner node['ntp']['var_owner'] 
      group node['ntp']['var_group'] 
      mode 0755 
   end 
end

Step 4 - Chạy lại lệnh thử dao.

vipin@laptop:~/chef-repo $ knife cookbook test ntp 
checking ntp 
Running syntax check on ntp 
Validating ruby files 
FATAL: Cookbook file recipes/default.rb has a ruby syntax error: 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected tIDENTIFIER, expecting ']' 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: ^ 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected ']', expecting $end 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL:

Phương pháp làm việc

Kiểm tra sách nấu ăn Knife thực hiện kiểm tra cú pháp Ruby trên tất cả các tệp Ruby trong sách nấu ăn cũng như tất cả các mẫu ERB. Nó lặp qua các tệp Ruby và chạy Ruby–cchống lại mỗi người trong số họ. Ruby–c kiểm tra cú pháp của tập lệnh và thoát mà không chạy nó.

Sau khi xem qua tất cả các tệp Ruby, bài kiểm tra sách dạy nấu dao sẽ đi qua tất cả các mẫu và đường dẫn ERB, phiên bản dự phòng được tạo bởi –x thông qua Ruby –c.

Hạn chế

Kiểm tra sách dạy nấu ăn dao chỉ thực hiện một cú pháp đơn giản kiểm tra các tệp Ruby và các mẫu ERB. Chúng ta có thể tiếp tục thử nghiệm hoàn toàn bằng cách sử dụng ChefSpec và bếp thử nghiệm.

Viết sách dạy nấu ăn ngon mà không có vấn đề gì là một nhiệm vụ khá khó khăn. Nhưng có những cách có thể giúp xác định các cạm bẫy. Có thể gắn cờ trong Chef Cookbook. Phân tích thực phẩm là một trong những cách tốt nhất để lưu trữ nó, giúp xác định các vấn đề có thể xảy ra với logic và phong cách của sách dạy nấu ăn.

Thiết lập tội phạm thực phẩm

Step 1 - Thêm đá quý Thực phẩm.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'foodcritic', '~>2.2.0'

Step 2 - Cài đặt đá quý.

vipin@laptop:~/chef-repo $ bundle install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing foodcritic (2.2.0)

Đá quý thực phẩm

Step 1 - Chạy Foodcritic trên sách nấu ăn.

vipin@laptop:~/chef-repo $ foodcritic ./cookbooks/<Cookbook Name> 
FC002: Avoid string interpolation where not required: ./cookbooks/ 
mysql/attributes/server.rb:220 
...TRUNCATED OUTPUT... 
FC024: Consider adding platform equivalents: ./cookbooks/<Cookbook Name>/ 
recipes/server.rb:132

Step 2 - Tạo một báo cáo chi tiết.

vipin@laptop:~/chef-repo $ foodcritic -C ./cookbooks/mysql 
cookbooks/<cookbook Name>/attributes/server.rb 
FC002: Avoid string interpolation where not required 
[...] 
85| default['<Cookbook Name>']['conf_dir'] = "#{mysql['basedir']}" 
[...] 
cookbooks/<Cookbook Name>/recipes/client.rb 
FC007: Ensure recipe dependencies are reflected in cookbook 
metadata 
40| end 
41|when "mac_os_x" 
42| include_recipe 'homebrew' 
43|end 
44|

Phương pháp làm việc

Foodcritic xác định một tập hợp các quy tắc và kiểm tra các tác nhân công thức, mỗi người trong số họ. Nó đi kèm với nhiều quy tắc liên quan đến các lĩnh vực khác nhau: kiểu, tính kết nối, thuộc tính, chuỗi, xác suất, tìm kiếm, dịch vụ, tệp, siêu dữ liệu, v.v.

Test Driven Development (TDD)là một cách để viết bài kiểm tra đơn vị trước khi viết bất kỳ mã công thức thực tế nào. Bài kiểm tra phải là thật và phải xác thực những gì một công thức làm. Nó thực sự sẽ thất bại vì không có công thức nào được phát triển. Khi công thức được phát triển, bài kiểm tra sẽ vượt qua.

ChefSpec được xây dựng trên khung RSpec phổ biến và cung cấp một cú pháp phù hợp để kiểm tra công thức Chef.

Tạo ChefSpec

Step 1 - Tạo một tập tin đá quý có chứa đá quý ChefSpec.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'chefspec'

Step 2 - Cài đặt đá quý.

vipin@laptop:~/chef-repo $ bundler install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing chefspec (1.3.1) 
Using bundler (1.3.5) 
Your bundle is complete!

Step 3 - Tạo một thư mục đặc tả.

vipin@laptop:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec

Step 4 - Tạo một thông số kỹ thuật

vipin@laptop:~/chef-repo $ subl  
cookbooks/my_cookbook/spec/default_spec.rb  
require 'chefspec'  
describe 'my_cookbook::default' do  
   let(:chef_run) {  
      ChefSpec::ChefRunner.new(  
         platform:'ubuntu', version:'12.04'  
      ).converge(described_recipe)  
   }  

   it 'creates a greetings file, containing the platform  
   name' do  
      expect(chef_run).to  
      create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!')  
   end  
end

Step 5 - Xác thực ChefSpec.

vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
F 
Failures: 
1) <CookBook Name> ::default creates a greetings file, containing the platform name 
Failure/Error: expect(chef_run.converge(described_recipe)).to 
create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!') 
File content: 
does not match expected: 
Hello! ubuntu! 
# ./cookbooks/my_cookbook/spec/default_spec.rb:11:in `block 
(2 levels) in <top (required)>' 
Finished in 0.11152 seconds 
1 example, 1 failure  

Failed examples: 
rspec ./cookbooks/my_cookbook/spec/default_spec.rb:10 # my_ 
cookbook::default creates a greetings file, containing the 
platform name

Step 6 - Chỉnh sửa công thức nấu ăn mặc định Cookbooks.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
template '/tmp/greeting.txt' do 
   variables greeting: 'Hello!' 
end

Step 7 - Tạo một tệp mẫu.

vipin@laptop:~/chef-repo $ subl cookbooks/< Cookbook Name>/recipes/default.rb 
<%= @greeting %> <%= node['platform'] %>!

Step 8 - Chạy lại rspec.

vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
. 
Finished in 0.10142 seconds 
1 example, 0 failures

Làm thế nào nó hoạt động

Để làm cho nó hoạt động, trước tiên chúng ta cần thiết lập cơ sở hạ tầng cơ sở để sử dụng RSpec với Chef. Sau đó, chúng ta cần đá quý ChefSpec Ruby và sách nấu ăn cần một thư mục có tên là spec, nơi tất cả các bài kiểm tra sẽ được lưu.

Thử nghiệm bếp là khung thử nghiệm tích hợp Chef's. Nó cho phép các bài kiểm tra viết, chạy sau khi VM được khởi tạo và hội tụ bằng cách sử dụng sách nấu ăn. Các bài kiểm tra chạy trên VM và có thể xác minh rằng mọi thứ hoạt động như mong đợi.

Đây là hợp đồng nút với ChefSpec, chỉ mô phỏng một lần chạy Chef. Test Kitchen khởi động một nút thực và chạy Chef trên đó.

Đang cài đặt

Để làm được điều này, chúng ta cần cài đặt Vagrant trên máy để giúp quản lý máy ảo. Sau đó, chúng tôi cần phải cài đặt giá sách và kết nối với Vagrant để quản lý các phần phụ thuộc sách nấu ăn.

Step 1 - Chỉnh sửa công thức mặc định trong sách nấu ăn.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
file "/tmp/greeting.txt" do 
   content node['my_cookbook']['greeting'] 
end

Step 2 - Chỉnh sửa thuộc tính sách nấu ăn.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/attributes/default.rb 
default['my_cookbook']['greeting'] = "Ohai, Chefs!"

Step 3 - Chỉnh sửa tệp gem để cài đặt các viên ngọc Ruby cần thiết.

vipin@laptop:~/chef-repo $ subl Gemfile 
gem 'test-kitchen', '~> 2.0.0.alpha.7' 
gem 'kitchen-vagrant'

Step 4 - Cài đặt viên ngọc Ruby cần thiết.

vipin@laptop:~/chef-repo $ bundle install 
...TRUNCATED OUTPUT... 
Installing test-kitchen (1.0.0.alpha.7) 
Installing kitchen-vagrant (0.10.0) ...TRUNCATED OUTPUT...

Step 5 - Tạo tệp .kitchen.yml trong sách nấu ăn.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl .kitchen.yml 
--- 
driver_plugin: vagrant 
driver_config: 
   require_chef_omnibus: true  
platforms: 
   - name: ubuntu-12.04 
  driver_config: 
      box: opscode-ubuntu-12.04 
      box_url: 
         https://opscode-vm.s3.amazonaws.com/vagrant/
            opscode_ubuntu12.04_provisionerless.box  
suites: 
   - name: default 
   run_list: 
      - recipe[minitest-handler] 
      - recipe[my_cookbook_test] 
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} }

Step 6 - Tạo một thư mục thử nghiệm bên trong sách nấu ăn.

vipin@laptop:~/chef-repo/cookbooks/<Cookbook Name>$ mkdir test

Step 7 - Tạo một sách dạy nấu ăn thử nghiệm để kiểm tra tích hợp.

vipin@laptop:~/chef-repo/cookbooks/<Cookbook Name>/test $ knife 
cookbook create my_cookbook_test 
** Creating cookbook my_cookbook_test 
** Creating README for cookbook: my_cookbook_test 
** Creating CHANGELOG for cookbook: my_cookbook_test 
** Creating metadata for cookbook: my_cookbook_test

Step 8 - Chỉnh sửa công thức nấu ăn thử nghiệm mặc định.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl 
test/cookbooks/my_cookbook_test/recipes/default.rb 
include_recipe 'my_cookbook::default'

Step 9 - Tạo Minitest Spec bên trong sách nấu ăn.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ mkdir -p 
   test/cookbooks/my_cookbook_test/files/default/tests/minitest  

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl 
   test/cookbooks/my_cookbook_test/files/default/tests/minitest/default_test.rb  

require 'minitest/spec'  
describe_recipe 'my_cookbook::default' do 
   describe "greeting file" do 
      it "creates the greeting file" do 
         file("/tmp/greeting.txt").must_exist 
      end 
       
      it "contains what's stored in the 'greeting' node 
         attribute" do 
         file('/tmp/greeting.txt').must_include 'Ohai, Minitest!' 
      end 
end

Step 10 - Chỉnh sửa Berksfile của sách nấu ăn chính của bạn.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl Berksfile 
site :opscode 
metadata 
cookbook "apt" 
cookbook "minitest-handler" 
cookbook "my_cookbook_test", path: 
"./test/cookbooks/my_cookbook_test"

Kiểm tra thiết lập

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ kitchen test 
-----> Starting Kitchen (v1.0.0.alpha.7) 
...TRUNCATED OUTPUT... 
-----> Converging <default-ubuntu-1204> 
-----> Installing Chef Omnibus (true) 
...TRUNCATED OUTPUT... 
Starting Chef Client, version 11.4.4 
[2013-06-29T18:33:57+00:00] INFO: *** Chef 11.4.4 *** 
[2013-06-29T18:33:58+00:00] INFO: Setting the run_list to 
["recipe[minitest-handler]", "recipe[my_cookbook_test]"] 
from JSON 
...TRUNCATED OUTPUT... 
# Running tests: 
recipe::my_cookbook::default::greeting 
file#test_0001_creates the greeting file = 0.00 s = . 
recipe::my_cookbook::default::greeting 
file#test_0002_contains what's stored in the 'greeting' 
node attribute = 0.00 s = . 
Finished tests in 0.011190s, 178.7277 tests/s, 178.7277 
assertions/s. 
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips 
...TRUNCATED OUTPUT...  
-----> Kitchen is finished. (2m5.69s)

Knife preflight hiển thị chi tiết về tất cả các nút sử dụng một sách nấu ăn nhất định trước khi tải nó lên máy chủ Chef.

Bắt đầu

Để bắt đầu, chúng ta cần phải cài đặt thêm đá quý dao trước.

Step 1 - Xác định đường dẫn trong tệp gem.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'knife-preflight'

Step 2 - Chạy Bundler để cài đặt dao-preflight gem.

vipin@laptop:~/chef-repo $ bundle install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing knife-preflight (0.1.6)

Phương pháp làm việc

Chạy dao trước trên sách nấu ăn đã cho.

Chúng ta có thể chạy lệnh preflight để tìm ra các nút và vai trò có sách nấu ăn đã cho trong danh sách chạy mở rộng của chúng.

vipin@laptop:~/chef-repo $ knife preflight ntp 
Searching for nodes containing ntp OR ntp::default in their 
expanded run_list... 
2 Nodes found 
www-staging.example.com 
cms-staging.example.com 
Searching for roles containing ntp OR ntp::default in their 
expanded run_list... 
3 Roles found 
your_cms_role 
your_www_role 
your_app_role 
Found 6 nodes and 3 roles using the specified search 
criteria

Có nhiều cách để sách dạy nấu ăn được thực thi trên nút.

  • Bạn có thể gán sách nấu ăn trực tiếp cho một nút bằng cách thêm nó vào danh sách chạy của nút.

  • Bạn có thể thêm sách dạy nấu ăn vào vai trò và thêm vai trò vào danh sách chạy của nút.

  • Bạn có thể thêm vai trò vào danh sách chạy của một vai trò khác và thêm vai trò khác đó vào danh sách chạy của nút.

  • Sách dạy nấu ăn có thể là phụ thuộc của một sách dạy nấu ăn đã qua sử dụng khác.

Bất kể sách dạy nấu ăn kết thúc như thế nào trong danh sách chạy của nút, lệnh dao preflight sẽ bắt được nó vì Chef lưu trữ tất cả danh sách mở rộng về vai trò và công thức nấu ăn trong thuộc tính của nút. Lệnh preflight dao đưa ra một tìm kiếm chính xác các thuộc tính nút đó.

Để kiểm tra việc chạy Chef-Client, chúng ta cần phải cấu hình Chef-Client để sử dụng Chef được lưu trữ hoặc máy chủ được lưu trữ riêng.

Chạy Chef-Client trong Chế độ gỡ lỗi

vipin@server:~$ sudo chef-client -l debug 
…TRUNCATED OUTPUT… 
Hashed Path:A+WOcvvGu160cBO7IFKLYPhh9fI= 
X-Ops-Content-Hash:2jmj7l5rSw0yVb/vlWAYkK/YBwk= 
X-Ops-Timestamp:2012-12-27T11:14:07Z 
X-Ops-UserId:vagrant' 
Header hash: {"X-Ops-Sign"=>"algorithm=sha1;version=1.0;", 
"X-Ops-Userid"=>"vagrant", "X-Ops-Timestamp"=>"2012-12- 
27T11:14:07Z", "X-Ops-Content- 
Hash"=>"2jmj7l5rSw0yVb/vlWAYkK/YBwk=", "X-Ops- 
Authorization- 
1"=>"HQmTt9U/ 
LJJVAJXWtyOu3GW8FbybxAIKp4rhiw9O9O3wtGYVHyVGuoilWDao", 
"X-Ops-Authorization- 
2"=>"2/uUBPWX+YAN0g1/ 
fD2854QAU2aUcnSaVM0cPNNrldoOocmA0U5HXkBJTKok", 
"X-Ops-Authorization- 
3"=>"6EXPrEJg5T+ 
ddWd5qHAN6zMqYc3untb41t+eBpigGHPhtn1LLInMkPeIYwBm", 
"X-Ops-Authorization- 
4"=>"B0Fwbwz2HVP3wEsYdBGu7yOatq7fZBXHfIpeOi0kn/ 
Vn0P7HrucnOpONmMgU", "X-Ops-Authorization- 
5"=>"RBmmbetFSKCYsdg2v2mW/ 
ifLIVemhsHyOQjffPYPpNIB3U2n7vji37NxRnBY", 
"X-Ops-Authorization- 
6"=>"Pb3VM7FmY60xKvWfZyahM8y8WVV9xPWsD1vngihjFw=="} 
[2012-12-27T11:14:07+00:00] DEBUG: Sending HTTP Request via 
GET to api.opscode.com:443/organizations/agilewebops/ 
nodes/vagrant
[2012-12-27T11:14:09+00:00] DEBUG: ---- HTTP Status and 
Header Data: ---- 
[2012-12-27T11:14:09+00:00] DEBUG: HTTP 1.1 200 OK 
[2012-12-27T11:14:09+00:00] DEBUG: server: nginx/1.0.5 
[2012-12-27T11:14:09+00:00] DEBUG: date: Thu, 27 Dec 2012

Kiểm tra kết quả của lần chạy đầu bếp-khách hàng cuối cùng

Để kiểm tra lần chạy Chef-Client cuối cùng, đặc biệt là các vấn đề hỏng hóc khi chúng tôi đang phát triển một cuốn sách dạy nấu ăn mới, chúng tôi cần biết chính xác những gì đã xảy ra. Mặc dù Chef in mọi thứ trong stdout, người ta có thể muốn xem lại nhật ký gỡ lỗi.

Nếu chúng ta muốn kiểm tra, chúng ta cần phải có một cuốn sách dạy nấu ăn bị hỏng và đang không biên soạn.

user@server:~$ sudo chef-client 
================================================================== 
============== 
Recipe Compile Error in /srv/chef/file_store/cookbooks/my_ 
cookbook/recipes/default.rb 
================================================================== 
============== 
NoMethodError 
------------- 
undefined method `each' for nil:NilClass 
Cookbook Trace: 
--------------- 
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default. 
rb:9:in `from_file' 
Relevant File Content: 
---------------------- 
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.rb: 
2: # Cookbook Name:: my_cookbook 
3: # Recipe:: default 
4: # 
5: # Copyright 2013, YOUR_COMPANY_NAME 
6: # 
7: # All rights reserved - Do Not Redistribute 
8: # 
9≫ nil.each {}  
10:

Để biết thêm chi tiết, chúng ta có thể xem xét stacktrace.

user@server:~$ less /srv/chef/file_store/chef-stacktrace.out 
Generated at 2013-07-21 18:34:05 +0000 
NoMethodError: undefined method `each' for nil:NilClass 
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.rb:9:in 
`from_file' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/ 
mixin/from_file.rb:30:in `instance_eval' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/ 
mixin/from_file.rb:30:in `from_file' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/ 
cookbook_version.rb:346:in `load_recipe'

Thuộc tính là thành phần quan trọng để định cấu hình động các sách nấu ăn. Các thuộc tính cho phép các tác giả đặt sách nấu ăn có thể định cấu hình. Bằng cách ghi đè các giá trị mặc định được đặt trong sách dạy nấu ăn, người dùng có thể nhập các giá trị của riêng họ.

Step 1 - Tạo một tệp mặc định cho các thuộc tính sách nấu ăn và thêm một thuộc tính mặc định cho nó.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/attributes/default.rb 
default['my_cookbook']['message'] = 'hello world!'

Step 2 - Xác định thuộc tính bên trong công thức.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
message = node['my_cookbook']['message'] 
Chef::Log.info("** Saying what I was told to say: #{message}")

Step 3 - Tải lên sách nấu ăn đã sửa đổi.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0]

Step 4 - Chạy Chef-Client của nút đã xác định.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-13T20:48:21+00:00] INFO: ** Saying what I was told to 
say: hello world! 
...TRUNCATED OUTPUT...

Phương pháp làm việc

Chef tải tất cả các thuộc tính từ tệp thuộc tính trước khi nó thực thi chúng. Các thuộc tính được lưu trữ với đối tượng nút. Người ta có thể truy cập tất cả các thuộc tính được lưu trữ với đối tượng nút trong công thức nấu ăn và truy xuất các giá trị hiện tại của chúng.

Chef có một cấu trúc hạn chế bắt đầu từ mặc định là thấp nhất, sau đó trở thành bình thường (được đặt bí danh với bộ) và sau đó ghi đè. Cấp thuộc tính được đặt trong công thức có quyền ưu tiên hơn cấp thuộc tính được đặt trong tệp thuộc tính.

Ghi đè thuộc tính ở cấp độ nút và môi trường

Thuộc tính được xác định trong vai trò hoặc môi trường có mức độ ưu tiên cao nhất.

Step 1 - Tạo vai trò.

vipin@laptop:~/chef-repo $ subl roles/german_hosts.rb 
name "german_hosts" 
description "This Role contains hosts, which should print out 
their messages in German" 
run_list "recipe[my_cookbook]" 
default_attributes "my_cookbook" => { "message" => "Hallo Welt!" }

Step 2 - Tải vai trò lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife role from file german_hosts.rb 
Updated Role german_hosts!

Step 3 - Gán vai trò cho một nút.

vipin@laptop:~/chef-repo $ knife node edit server 
"run_list": [ 
   "role[german_hosts]" 
] 
Saving updated run_list on node server

Step 4 - Điều hành Chef-Client.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-13T20:49:49+00:00] INFO: ** Saying what I was told to 
say: Hallo Welt! 
...TRUNCATED OUTPUT...

Trong cơ sở hạ tầng, configuration managementlà tất cả về cách một người cấu hình máy chủ tốt như thế nào. Nói chung, tất cả các cấu hình được thực hiện bằng cách sử dụng các tệp cấu hình. Chef sử dụng các mẫu để có thể điền vào tệp cấu hình với các giá trị động.

Chef cung cấp các mẫu như một tài nguyên có thể được sử dụng trong công thức nấu ăn. Giá trị động của tệp cấu hình có thể được truy xuất từ ​​túi dữ liệu, thuộc tính hoặc thậm chí tính toán chúng bằng cách chuyển chúng vào mẫu.

Làm thế nào để sử dụng nó?

Step 1 - Thêm mẫu vào công thức.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb  
template '/tmp/message' do 
   source 'Test.erb' 
   variables( 
      hi: 'Tesing', 
      world: 'Welt', 
      from: node['fqdn'] 
   ) 
end

Step 2 - Thêm ERB Tệp mẫu.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/templates/default/test.erb 
<%- 4.times do %> 
<%= @hi %>, <%= @world %> from <%= @from %>! 
<%- end %>

Step 3 - Tải sách nấu ăn đã sửa đổi lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload <Cookbook Name> 
Uploading my_cookbook [0.1.0] 
Run Chef Client on your node: 
user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2017-01-14T20:41:21+00:00] INFO: Processing template[/tmp/ 
message] action create (my_cookbook::default line 9) 
[2017-01-14T20:41:22+00:00] INFO: template[/tmp/message] updated 
content

Step 4 - Xác thực nội dung của tập tin tải lên.

user@server:~$ sudo cat /tmp/message 
Hallo, Welt from vagrant.vm! 
Hallo, Welt from vagrant.vm! 
Hallo, Welt from vagrant.vm! 
Hallo, Welt from vagrant.vm!

Quy trình làm việc

Chef sử dụng Erubis làm ngôn ngữ mẫu của nó. Nó cho phép nhúng mã Ruby thuần túy bên trong các ký hiệu đặc biệt trong các mẫu.

  • <% =%> được sử dụng nếu bạn muốn in giá trị của một biến hoặc biểu thức Ruby vào tệp được tạo.

  • <% -%> được sử dụng nếu bạn muốn nhúng logic Ruby vào tệp mẫu của mình. Chúng tôi sử dụng nó để lặp lại biểu thức của chúng tôi bốn lần.

Trong Chef, nếu cần tạo các công thức nấu ăn đơn giản, người ta có thể sử dụng các tài nguyên có sẵn trong Chef, chẳng hạn như các mẫu, remote_file và các dịch vụ. Tuy nhiên, khi các công thức nấu ăn trở nên phức tạp, người ta cần các kỹ thuật nâng cao, chẳng hạn như các câu lệnh điều kiện để thực hiện các phần của công thức với điều kiện. Đây là sức mạnh của việc trộn Ruby thuần túy với Ngôn ngữ cụ thể của miền Chef (DSL).

Làm thế nào để sử dụng nó?

Khởi động Chef Shell trên bất kỳ nút nào trong chế độ máy khách để có thể truy cập máy chủ Chef.

user@server:~$ sudo chef-shell --client 
loading configuration: /etc/chef/client.rb 
Session type: client 
...TRUNCATED OUTPUT... 
run `help' for help, `exit' or ^D to quit. 
Ohai2u user@server! 
Chef>

Các điều kiện cơ bản với Chef DSL

Sắp xếp các nút theo tên bằng Ruby đơn giản.

chef > nodes.sort! {|a,b| a.name <=> b.name } 
=> [node[alice],node[server]]

Lặp qua các nút, in hệ điều hành của chúng.

chef > nodes.each do |n| 
   chef > puts n['os'] 
   chef ?> 
end  
linux 
windows 
=> [node[server], node[alice]]

Cài đặt nhiều đá quý Ruby bằng cách sử dụng mở rộng mảng, vòng lặp và chuỗi để tạo tên đá quý.

chef > %w{ec2 essentials}.each do |gem| 
   chef > gem_package "knife-#{gem}" 
   chef ?> end   => ["ec2", "essentials"]

Phương pháp làm việc

Công thức nấu ăn đầu bếp là các tệp Ruby, được đánh giá trong bối cảnh Chef run. Chúng có thể chứa mã Ruby thuần túy như câu lệnh if và các vòng lặp cũng như các phần tử Chef DSL chẳng hạn như tài nguyên.

Bên trong công thức, người ta có thể chỉ cần khai báo các biến Ruby và gán giá trị cho nó.

Công thức nấu ăn là nền tảng chính của sách dạy nấu ăn, về cơ bản là mã Ruby. Có thể sử dụng tất cả các tính năng của ngôn ngữ Ruby bên trong công thức Chef. Hầu hết thời gian Ruby xây dựng trong chức năng là đủ nhưng đôi khi người ta có thể cần sử dụng các viên ngọc Ruby bổ sung. Ví dụ, nếu một người cần truy cập cơ sở dữ liệu MySQL từ chính công thức.

Công thức đầu bếp có khả năng nhận được những viên ngọc Ruby cần thiết để sử dụng chúng trong cùng một công thức.

Sử dụng đá quý iptable trong công thức được đưa ra

Step 1 - Chỉnh sửa công thức mặc định của sách nấu ăn và cài đặt đá quý để sử dụng bên trong công thức.

vipin@laptop:~/chef-repo $ subl 
cookbooks/my_cookbook/recipes/default.rb 
chef_gem 'ipaddress' 
require 'ipaddress' 
ip = IPAddress("192.168.0.1/24") 
Chef::Log.info("Netmask of #{ip}: #{ip.netmask}")

Step 2 - Tải sách nấu ăn đã sửa đổi lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0]

Step 3 - Chạy máy khách Chef để xem kết quả đầu ra.

user@server $ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-18T14:02:02+00:00] INFO: Netmask of 192.168.0.1: 
255.255.255.0 
...TRUNCATED OUTPUT...

Phương pháp làm việc

Các bước chạy Chef bao gồm giai đoạn biên dịch, nơi nó biên dịch tất cả các tài nguyên và một giai đoạn thực thi trong đó Chef chạy các nhà cung cấp tài nguyên để hội tụ nút về trạng thái mong muốn. Nếu một người cần bất kỳ viên ngọc Ruby cụ thể nào bên trong sách dạy nấu ăn, người ta cần cài đặt viên đá quý đó trong giai đoạn phức tạp.

Tài nguyên Chef_gem sẽ thực hiện chính xác như vậy và trong Chef, Omnibus là cách duy nhất để hoạt động. Chức năng chính của nó là làm cho đá quý có sẵn cho chính Chef.

Thư viện trong Chef cung cấp một nơi để đóng gói logic đã biên dịch để các công thức nấu ăn vẫn gọn gàng và sạch sẽ.

Tạo thư viện

Step 1 - Tạo một phương thức trợ giúp trong thư viện sách dạy nấu ăn.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/libraries/ipaddress.rb 
class Chef::Recipe 
def netmask(ipaddress) 
IPAddress(ipaddress).netmask 
end 
end

Step 2 - Sử dụng phương pháp trợ giúp.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/default.rb 
ip = '10.10.0.0/24' 
mask = netmask(ip) # here we use the library method 
Chef::Log.info("Netmask of #{ip}: #{mask}")

Step 3 - Tải sách nấu ăn đã sửa đổi lên Máy chủ đầu bếp.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0]

Kiểm tra Thư viện

user@server $ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-18T14:38:26+00:00] INFO: Netmask of 10.10.0.0/24: 
255.255.255.0 
...TRUNCATED OUTPUT...

Phương pháp làm việc

Mã thư viện Chef có thể mở lớp đầu bếp :: Recipe và thêm các phương thức mới như đã thực hiện ở Bước 1. Bước này không phải là cách làm sạch nhất nhưng là cách đơn giản nhất.

class Chef::Recipe 
def netmask(ipaddress) 
... 
end 
end

Thực hành tốt nhất

Khi chúng ta mở lớp đầu bếp :: công thức, sẽ có những thay đổi khiến nó bị ô nhiễm. Cách tốt nhất là giới thiệu một lớp con mới bên trong thư viện và xác định một phương thức là phương thức của lớp. Điều này tránh kéo không gian tên đầu bếp :: công thức.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/libraries/ipaddress.rb 
class Chef::Recipe::IPAddress 
def self.netmask(ipaddress) 
IPAddress(ipaddress).netmask 
end 
end

Chúng ta có thể sử dụng phương pháp bên trong công thức như

IPAddress.netmask(ip)

Định nghĩa có thể được định nghĩa là một phương pháp hợp lý để nhóm các tài nguyên, được sử dụng lặp đi lặp lại. Trong quy trình này, chúng tôi nhóm các tài nguyên và đặt tên cho chúng để lấy lại khả năng đọc của các sách dạy nấu ăn đã xác định.

Để làm được điều này, chúng ta nên có một công thức. Trong trường hợp này, chúng tôi đang sử dụng test_cookbook và danh sách các nút đang chạy, bao gồm sách nấu ăn.

Tạo định nghĩa

Step 1 - Tạo một tệp định nghĩa mới trong thư mục định nghĩa sách nấu ăn.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/definitions/ 
capistrano_deploy_dirs.rb 
define :capistrano_deploy_dirs, :deploy_to => '' do 
   directory "#{params[:deploy_to]}/releases" 
   directory "#{params[:deploy_to]}/shared" 
   directory "#{params[:deploy_to]}/shared/system" 
end

Step 2 - Sử dụng một định nghĩa bên trong công thức nấu ăn mặc định.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
capistrano_deploy_dirs do 
   deploy_to "/srv" 
end

Step 3 - Tải sách nấu ăn lên máy chủ đầu bếp.

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading test_cookbook [0.1.0]

Step 4 - Chạy ứng dụng khách Chef trên nút mong muốn.

vipin@laptop:~/chef-repuser@server $ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/ 
releases] action create (my_cookbook::default line 2) 
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/releases] created 
directory /srv/releases 
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/ 
shared] action create (my_cookbook::default line 3) 
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/shared] created 
directory /srv/shared 
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/ 
shared/system] action create (my_cookbook::default line 4) 
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/shared/system]

Định nghĩa trong sách dạy nấu ăn giống như micro, nhóm các tài nguyên và đặt tên cho chúng. Một định nghĩa có một tên mà người ta có thể cho chúng biết từ đó có thể được gọi bên trong công thức và nó có một danh sách các chu vi.

Trong định nghĩa, chúng ta có các tham số trong mã của chúng ta trông giống như sau.

….. 
directory "#{params[:deploy_to]}/releases" 
directory "#{params[:deploy_to]}/shared" 
directory "#{params[:deploy_to]}/shared/system” 
……

Nó có thể được sử dụng bên trong công thức mặc định như sau.

capistrano_deploy_dirs do 
   deploy_to "/srv"` 
end

Biến môi trường là một cách quan trọng để làm cho công thức Chef chạy thành công trên bất kỳ nút cụ thể nào. Có nhiều cách để thực hiện, hoặc thiết lập chúng theo cách thủ công hoặc bằng cách sử dụng tập lệnh Shell. Đặt chúng qua công thức là những gì chúng ta cần thực hiện ở đây.

Để làm được điều này, chúng ta cần có một sách dạy nấu ăn, ở đây chúng ta sẽ sử dụng test_cookbook và một danh sách chạy có chứa test_cookbook.

Thiết lập biến môi trường bằng công thức đầu bếp

Step 1 - Cập nhật công thức nấu ăn mặc định của sách nấu ăn với một biến môi trường.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb  
ENV['MESSAGE'] = 'Testing environment variable update with chef !'  
execute 'print value of environment variable $MESSAGE' do command 'echo $MESSAGE > /tmp/message' 
end

Step 2 - Tải sách nấu ăn cập nhật lên máy chủ.

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading my_cookbook [0.1.0]

Step 3 - Chạy máy khách Chef để tạo tệp tạm thời.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-25T15:01:57+00:00] INFO: Processing execute[print 
value of environment variable $MESSAGE] action run (my_cookbook::default line 11) [2013-01-25T15:01:57+00:00] INFO: execute[print value of environment variable $MESSAGE] ran successfully 
...TRUNCATED OUTPUT...

Biến hợp lệ

user@server:~$ cat /tmp/message 
Hello from Chef

Phương pháp làm việc

Ruby hiển thị biến môi trường hiện tại thông qua ENV –a băm để đọc và sửa đổi biến môi trường.

Tài nguyên Thực thi

Chúng ta có thể sử dụng tài nguyên thực thi để làm điều tương tự bên trong công thức nấu ăn mặc định của Chef.

mma@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb  
execute 'print value of environment variable $MESSAGE' do command 'echo $MESSAGE > /tmp/message' 
   environment 'MESSAGE' => 'Hello from the execute resource' 
end

Note- Đặt một biến môi trường bằng ENV sẽ làm cho biến đó khả dụng trong toàn bộ quá trình Chef chạy. Ngược lại, chuyển nó đến tài nguyên thực thi sẽ chỉ làm cho nó có sẵn cho một lệnh được tài nguyên thực thi.

Túi dữ liệu đầu bếp có thể được định nghĩa là một tập hợp dữ liệu tùy ý mà người ta có thể sử dụng với sách nấu ăn. Sử dụng túi dữ liệu rất hữu ích khi người ta không muốn mã hóa các thuộc tính trong công thức nấu ăn cũng như để lưu trữ các thuộc tính trong sách nấu ăn.

Phương pháp làm việc

Trong thiết lập sau, chúng tôi đang cố gắng giao tiếp với URL điểm cuối http. Đối với điều này, chúng tôi cần tạo một túi dữ liệu, túi này sẽ chứa chi tiết URL của điểm cuối và sử dụng nó trong công thức của chúng tôi.

Step 1 - Tạo một thư mục cho túi dữ liệu của chúng tôi.

mma@laptop:~/chef-repo $ mkdir data_bags/hooks

Step 2- Tạo một mục túi dữ liệu cho thùng yêu cầu. Người ta cần đảm bảo rằng một người đang sử dụng một URL requestBin đã xác định.

vipi@laptop:~/chef-repo $ subl data_bags/hooks/request_bin.json { 
   "id": "request_bin", 
   "url": "http://requestb.in/1abd0kf1" 
}

Step 3 - Tạo túi dữ liệu trên máy chủ Chef

vipin@laptop:~/chef-repo $ knife data bag create hooks 
Created data_bag[hooks]

Step 4 - Tải túi dữ liệu lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife data bag from file hooks requestbin.json 
Updated data_bag_item[hooks::RequestBin]

Step 5 - Cập nhật công thức nấu ăn mặc định của sách nấu ăn để nhận sách nấu ăn cần thiết từ túi dữ liệu.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/default.rb 
hook = data_bag_item('hooks', 'request_bin') 
http_request 'callback' do 
   url hook['url'] 
end

Step 6 - Tải sách nấu ăn đã sửa đổi lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0]

Step 7 - Chạy máy khách Chef trên nút để kiểm tra xem thùng yêu cầu http có được thực thi hay không.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-02-22T20:37:35+00:00] INFO: http_request[callback] 
GET to http://requestb.in/1abd0kf1 successful 
...TRUNCATED OUTPUT...

Làm thế nào nó hoạt động

Túi dữ liệu là một tập hợp các mục dữ liệu cấu trúc được đặt tên. Người ta cần xác định mục nhập dữ liệu và gọi mục túi dữ liệu trong tệp JSON. Người ta cũng có thể tìm kiếm mục túi dữ liệu từ bên trong công thức nấu ăn để sử dụng dữ liệu được lưu trữ trong túi dữ liệu.

Chúng tôi đã tạo một túi dữ liệu có tên là hook. Một túi dữ liệu là một thư mục trong kho lưu trữ Chef. Chúng tôi đã sử dụng dao để tạo nó trên máy chủ.

Trong một số điều kiện nhất định, không thể đặt máy chủ dưới sự kiểm soát hoàn toàn của Chef. Trong những trường hợp như vậy, người ta có thể cần truy cập các giá trị trong túi dữ liệu Chef từ các tập lệnh. Để làm điều này, người ta cần lưu trữ các giá trị của túi dữ liệu trong tệp JSON và cho phép tập lệnh được thêm vào truy cập các giá trị đó.

Đối với điều này, một người cần phải có một cuốn sách nấu ăn. Trong trường hợp của chúng tôi, chúng tôi sẽ sử dụng test_cookbook như trước đó và nên có danh sách chạy của nút bao gồm định nghĩa test_cookbook trong đó.

Phương pháp làm việc

Step 1 - Tạo một túi dữ liệu.

vipin@laptop:~/chef-repo $ mkdir data_bags/servers 
vipin@laptop:~/chef-repo $ knife data bag create servers 
Created data_bag[servers]

Step 2 - Tạo một mục túi dữ liệu.

vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json { 
   "id": "storage", 
   "host": "10.0.0.12" 
}

Step 3 - Cập nhật mục túi dữ liệu.

vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json { 
   "id": "storage", 
   "host": "10.0.0.12" 
}

Sử dụng trong Sách dạy nấu ăn

Step 1 - Cần tạo một tệp JSON chứa các giá trị túi dữ liệu bằng cách sử dụng sách dạy nấu ăn ở trên để các tập lệnh bên ngoài có thể truy cập các giá trị đó.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
file "/etc/backup_config.json" do 
   owner "root"
   group "root" 
   mode 0644 
   content data_bag_item('servers', 'backup')['host'].to_json 
end

Step 2 - Tải test_cookbook lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading my_cookbook [0.1.0]

Step 3 - Chạy máy khách Chef trên nút.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-14T20:30:33+00:00] INFO: Processing 
file[/etc/backup_config.json] action create 
(my_cookbook::default line 9) 
[2013-03-14T20:30:34+00:00] INFO: entered create 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] owner changed to 0 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] group changed to 0 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] mode changed to 644 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] created file 
/etc/backup_config.json 
...TRUNCATED OUTPUT...

Step 4 - Xác thực nội dung của tệp JSON đã tạo.

user@server:~$ cat /etc/backup_config.json 
"10.0.0.12"

Quy trình làm việc của Scripts

Trong lệnh trên, tài nguyên tệp mà chúng tôi đã sử dụng để tạo tệp JSON bên trong /etcthư mục được xác định trong sách nấu ăn mặc định. Nó lấy nội dung tệp trực tiếp từ túi dữ liệu bằng phương thức data_bag_item. Chúng tôi truy cập các giá trị máy chủ lưu trữ từ mục túi dữ liệu và chuyển đổi nó thành JSON. Tài nguyên tệp sử dụng các giá trị được chuyển đổi JSON làm nội dung của nó và ghi nó vào đĩa.

Sách nấu ăn đa nền tảng là những sách dạy nấu ăn áp dụng một môi trường cơ bản mà nó sẽ chạy. Chef cung cấp một loạt các tính năng, giúp viết sách nấu ăn dạng chéo có khả năng chạy trên bất kỳ hệ điều hành nào mà nó sẽ được triển khai. Điều này giúp nhà phát triển viết một cuốn sách dạy nấu ăn hoàn chỉnh.

Để làm được điều này, chúng ta cần phải có một cuốn sách dạy nấu ăn. Trong trường hợp của chúng tôi, nó sẽ là test_cookbook và một danh sách chạy sẽ có định nghĩa sách nấu ăn trong đó.

Phương pháp làm việc

Việc truy xuất chi tiết nền tảng các nút và thực thi logic có điều kiện trong sách dạy nấu ăn của chúng tôi tùy thuộc vào nền tảng. Trong trường hợp của chúng tôi, chúng tôi sẽ thử nghiệm nó cho Ubuntu.

Step 1 - Ghi nhật ký nếu nút là Ubuntu.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Log.info("Running on ubuntu") if node.platform['ubuntu']

Step 2 - Tải sách nấu ăn lên máy chủ Chef.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Uploading my_cookbook [0.1.0] 
Uploaded 1 cookbook.

Step 3 - Chạy máy khách Chef trên nút.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-03T20:07:39+00:00] INFO: Running on Ubuntu 
...TRUNCATED OUTPUT...

Ngoài ra, nếu một người không quan tâm đến một nền tảng cụ thể mà chỉ cần biết nền tảng khai báo nào đang sử dụng, thì có thể sử dụng câu lệnh sau.

Log.info("Running on a debian derivative") if 
platform_family?('debian')

Tải lên sách dạy nấu ăn đã sửa đổi và chạy ứng dụng khách Chef trên nút Ubuntu sẽ hiển thị kết quả sau.

[2013-03-03T20:16:14+00:00] INFO: Running on a debian 
derivative

Quy trình làm việc của Scripts

Trong lệnh trên, Ohai sẽ khám phá trạng thái hiện tại của hệ điều hành của nút và lưu trữ nó dưới dạng thuộc tính nền tảng với đối tượng nút.

node['platform']

Hoặc, bạn có thể sử dụng cú pháp kiểu phương thức -

node.platform

Đặt giá trị cụ thể cho nền tảng

Để thiết lập các giá trị cụ thể cho nền tảng, đầu bếp cung cấp các phương thức tiện lợi value_for_platform và value_for_platform_family. Chúng có thể được sử dụng để tránh các trường hợp phức tạp và thay vào đó sử dụng một hàm băm đơn giản.

Sách dạy nấu ăn ví dụ

execute "start-runsvdir" do 
   command value_for_platform( 
      "debian" => { "default" => "runsvdir-start" }, 
      "ubuntu" => { "default" => "start runsvdir" }, 
      "gentoo" => { "default" => "/etc/init.d/runit-start start" } 
   ) 
   action :nothing 
end

Trong ví dụ trên, lệnh dành cho hệ điều hành cụ thể như được định nghĩa.

  • Đối với Debian, "runningvdir-start" sẽ hoạt động
  • Đối với Ubuntu, "start runningvdir" sẽ hoạt động
  • Đối với Gentoo, "/etc/init.d/runit-start" sẽ hoạt động

Tài nguyên Chef đại diện cho một phần của hệ điều hành ở trạng thái mong muốn của nó. Nó là một tuyên bố về chính sách cấu hình mô tả trạng thái mong muốn của một nút mà nút muốn sử dụng cấu hình hiện tại để sử dụng các nhà cung cấp tài nguyên. Nó giúp biết tình trạng hiện tại của máy mục tiêu bằng cách sử dụng cơ chế Ohai của Chef. Nó cũng giúp xác định các bước cần thiết để thực hiện để đưa máy mục tiêu đến trạng thái đó. Các tài nguyên được nhóm lại theo công thức mô tả cấu hình hoạt động.

Trong trường hợp Chef, đầu bếp :: Nền tảng ánh xạ các nhà cung cấp và phiên bản nền tảng của mỗi nút. Vào đầu mỗi lần chạy Chef-client, máy chủ Chef thu thập thông tin chi tiết về trạng thái hiện tại của bất kỳ máy nào. Sau đó, máy chủ Chef sử dụng các giá trị đó để xác định nhà cung cấp chính xác.

Cú pháp tài nguyên

type 'name' do 
   attribute 'value' 
   action :type_of_action 
end

Trong cú pháp trên, 'type' là loại tài nguyên và 'name' là tên mà chúng ta sẽ sử dụng. Trong khối 'do' và 'end', chúng ta có thuộc tính của tài nguyên đó và hành động mà chúng ta cần thực hiện đối với tài nguyên cụ thể đó.

Mọi tài nguyên mà chúng tôi sử dụng trong công thức đều có một tập hợp các hành động riêng, được xác định bên trong khối 'do' và 'end'.

Thí dụ

type 'name' do 
   attribute 'value' 
   action :type_of_action 
end

Tất cả các tài nguyên đều có chung một nhóm chức năng, hành động, thuộc tính, thực thi có điều kiện, thông báo và đường dẫn hành động có liên quan.

Hành động Các :nothing hành động có thể được sử dụng với bất kỳ tài nguyên nào hoặc tài nguyên tùy chỉnh.
Tính chất Các thuộc tính ignore_failure, nhà cung cấp, thử lại, retry_delay và hỗ trợ có thể được sử dụng với bất kỳ tài nguyên nào hoặc tài nguyên tùy chỉnh.
Lính canh Các thực thi có điều kiện not_if và only_if có thể được sử dụng để đặt các bảo vệ bổ sung xung quanh các tài nguyên nhất định, để chúng chỉ được chạy khi điều kiện được đáp ứng.
Phiên dịch bảo vệ Đánh giá một lệnh chuỗi bằng cách sử dụng scripttài nguyên dựa trên: bash, csh, perl, powershell_script, python, hoặc là ruby.
Thông báo Các thông báo đăng ký và thông báo đăng ký có thể được sử dụng với bất kỳ tài nguyên nào.
Đường dẫn tương đối Đường dẫn tương đối # {ENV ['HOME']} có thể được sử dụng với bất kỳ tài nguyên nào.
Bảo mật tệp Windows Các template, file, remote_file, cookbook_file, directory,remote_directory tài nguyên hỗ trợ việc sử dụng danh sách kế thừa và kiểm soát truy cập (ACL) trong các công thức nấu ăn.
Chạy trong giai đoạn biên dịch Đôi khi một tài nguyên cần được chạy trước mọi tài nguyên khác hoặc sau khi tất cả tài nguyên đã được thêm vào bộ sưu tập tài nguyên.

Tài nguyên sẵn có

apt_package

Sử dụng apt_package tài nguyên để quản lý các gói cho nền tảng Debian và Ubuntu.

Bash

Sử dụng bashtài nguyên để thực thi các tập lệnh bằng trình thông dịch Bash. Tài nguyên này cũng có thể sử dụng bất kỳ hành động và thuộc tính nào có sẵn choexecutenguồn. Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

Lô hàng

Sử dụng batchtài nguyên để thực thi tập lệnh hàng loạt bằng trình thông dịch cmd.exe. Cácbatch resource tạo và thực thi một tệp tạm thời (tương tự như cách script tài nguyên hoạt động), thay vì chạy lệnh nội tuyến.

Tài nguyên này kế thừa các hành động (: run and: nothing) và các thuộc tính (tạo, cwd, môi trường, nhóm, đường dẫn, thời gian chờ và người dùng) từ executenguồn. Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụngnot_ifonly_if để bảo vệ tài nguyên này cho tưởng tượng.

bff_package

Sử dụng bff_package tài nguyên để quản lý các gói cho nền tảng AIX bằng cách sử dụng installptiện ích. Khi một gói được cài đặt từ một tệp cục bộ, nó phải được thêm vào nút bằng cách sử dụngremote_file hoặc là cookbook_file resources.

Chef_gem

Sử dụng chef_gemtài nguyên để cài đặt một viên ngọc chỉ dành cho phiên bản Ruby dành riêng cho Chef-Client. Khi một đá quý được cài đặt từ một tệp cục bộ, nó phải được thêm vào nút bằng cách sử dụngremote_file hoặc là cookbook_file tài nguyên.

Các chef_gem tài nguyên hoạt động với tất cả các thuộc tính và tùy chọn giống như gem_packagenhưng không chấp nhận thuộc tính gem_binary vì nó luôn sử dụng CurrentGemEnosystem mà Chef-Client đang chạy. Ngoài việc thực hiện các hành động tương tự nhưgem_package tài nguyên, chef_gem tài nguyên làm như trên.

cookbook_file

Sử dụng cookbook_file tài nguyên để chuyển các tệp từ thư mục con của COOKBOOK_NAME / files / đến một đường dẫn cụ thể nằm trên máy chủ đang chạy ChefClient.

Tệp được chọn theo tính đặc trưng của tệp, cho phép các tệp nguồn khác nhau được sử dụng dựa trên tên máy chủ, nền tảng máy chủ lưu trữ (hệ điều hành, bản phân phối hoặc nếu thích hợp) hoặc phiên bản nền tảng. Các tệp nằm trong COOKBOOK_NAME / tệp / thư mục con mặc định có thể được sử dụng trên mọi nền tảng.

Cron

Sử dụng tài nguyên cron để quản lý các mục cron để lập lịch công việc dựa trên thời gian. Các thuộc tính cho lịch biểu sẽ mặc định thành * nếu không được cung cấp. Tài nguyên cron yêu cầu quyền truy cập vào chương trình crontab, thường là cron.

Csh

Sử dụng tài nguyên csh để thực thi các tập lệnh bằng trình thông dịch csh. Tài nguyên này cũng có thể sử dụng bất kỳ hành động và thuộc tính nào có sẵn cho tài nguyên thực thi.

Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

Triển khai

Sử dụng deploytài nguyên để quản lý và kiểm soát việc triển khai. Đây là một tài nguyên phổ biến, nhưng cũng phức tạp, có nhiều thuộc tính nhất, nhiều nhà cung cấp, sự phức tạp thêm của lệnh gọi lại, cộng với bốn thuộc tính hỗ trợ sửa đổi bố cục từ bên trong một công thức.

Danh mục

Sử dụng directorytài nguyên để quản lý một thư mục, là một hệ thống phân cấp các thư mục bao gồm tất cả thông tin được lưu trữ trên máy tính. Thư mục gốc là cấp cao nhất, trong đó phần còn lại của thư mục được tổ chức.

Các directoryresource sử dụng thuộc tính name để chỉ định đường dẫn đến một vị trí trong thư mục. Thông thường, quyền truy cập vào vị trí đó trong thư mục là bắt buộc.

dpkg_package

Sử dụng dpkg_package tài nguyên để quản lý các gói cho dpkgnền tảng. Khi một gói được cài đặt từ một tệp cục bộ, nó phải được thêm vào nút bằng cách sử dụngremote_file hoặc là cookbook_file tài nguyên.

easy_install_package

Sử dụng easy_install_package tài nguyên để quản lý các gói cho nền tảng Python.

Env

Sử dụng envtài nguyên để quản lý khóa môi trường trong Microsoft Windows. Sau khi khóa môi trường được đặt, Microsoft Windows phải được khởi động lại trước khi khóa môi trường khả dụng cho Bộ lập lịch tác vụ.

erl_call

Sử dụng erl_calltài nguyên để kết nối với một nút nằm trong hệ thống Erlang phân tán. Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

Hành hình

Sử dụng executetài nguyên để thực hiện một lệnh duy nhất. Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụngnot_ifonly_if để bảo vệ tài nguyên này cho tưởng tượng.

Tập tin

Sử dụng file tài nguyên để quản lý các tệp trực tiếp trên một nút.

freebsd_package

Sử dụng freebsd_package tài nguyên để quản lý các gói cho nền tảng FreeBSD.

gem_package

Sử dụng gem_packagetài nguyên để quản lý các gói đá quý chỉ có trong công thức nấu ăn. Khi một gói được cài đặt từ một tệp cục bộ, nó phải được thêm vào nút bằng cách sử dụngremote_file hoặc là cookbook_file tài nguyên.

Git

Sử dụng gittài nguyên để quản lý tài nguyên kiểm soát nguồn tồn tại trong kho lưu trữ git. Cần có phiên bản git 1.6.5 (hoặc cao hơn) để sử dụng tất cả các chức năng trong tài nguyên git.

Nhóm

Sử dụng group tài nguyên để quản lý một nhóm cục bộ.

homebrew_package

Sử dụng homebrew_package tài nguyên để quản lý các gói cho nền tảng Mac OS X.

http_request

Sử dụng http_requesttài nguyên để gửi một yêu cầu HTTP (GET, PUT, POST, DELETE, HEAD hoặc OPTIONS) với một thông báo tùy ý. Tài nguyên này thường hữu ích khi các lệnh gọi lại tùy chỉnh là cần thiết.

Ifconfig

Sử dụng ifconfig tài nguyên để quản lý các giao diện.

ips_package

Sử dụng ips_package tài nguyên để quản lý các gói (sử dụng Hệ thống đóng gói hình ảnh (IPS)) trên nền tảng Solaris 11.

Ksh

Sử dụng kshtài nguyên để thực thi các tập lệnh bằng trình thông dịch Korn shell (ksh). Tài nguyên này cũng có thể sử dụng bất kỳ hành động và thuộc tính nào có sẵn cho tài nguyên thực thi.

Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

Liên kết

Sử dụng link tài nguyên để tạo liên kết tượng trưng hoặc liên kết cứng.

Nhật ký

Sử dụng logtài nguyên để tạo các mục nhật ký. Tài nguyên nhật ký hoạt động giống như bất kỳ tài nguyên nào khác: được tích hợp vào bộ sưu tập tài nguyên trong giai đoạn biên dịch và sau đó chạy trong giai đoạn thực thi. (Để tạo mục nhật ký không được tích hợp vào bộ sưu tập tài nguyên, hãy sử dụng Chef :: Log thay vì tài nguyên nhật ký)

macports_package

Sử dụng tài nguyên macports_package để quản lý các gói cho nền tảng Mac OS X.

Mdadm

Sử dụng mdadmtài nguyên để quản lý thiết bị RAID trong môi trường Linux bằng tiện ích mdadm. Nhà cung cấp mdadm sẽ tạo và lắp ráp một mảng, nhưng nó sẽ không tạo tệp cấu hình được sử dụng để duy trì mảng khi khởi động lại.

Nếu tệp cấu hình là bắt buộc, nó phải được thực hiện bằng cách chỉ định một mẫu với bố cục mảng chính xác, sau đó bằng cách sử dụng trình cung cấp gắn kết để tạo mục nhập bảng hệ thống tệp (fstab).

Gắn kết

Sử dụng tài nguyên gắn kết để quản lý hệ thống tệp được gắn kết.

Ohai

Sử dụng ohaitài nguyên để tải lại cấu hình Ohai trên một nút. Điều này cho phép các công thức nấu ăn thay đổi thuộc tính hệ thống (như công thức có thêm người dùng) để tham chiếu đến các thuộc tính đó sau này trong quá trình đầu bếp-khách hàng chạy.

Gói

Sử dụng packagetài nguyên để quản lý các gói. Khi gói được cài đặt từ một tệp cục bộ (chẳng hạn như với RubyGems, dpkg hoặc Trình quản lý gói RPM), tệp phải được thêm vào nút bằng cách sử dụng tài nguyên remote_file hoặc cookbook_file.

pacman_package

Sử dụng pacman_package tài nguyên để quản lý các gói (sử dụng pacman) trên nền tảng Arch Linux.

powershell_script

Sử dụng powershell_scripttài nguyên để thực thi một tập lệnh bằng trình thông dịch Windows PowerShell, giống như cách sử dụng tập lệnh và các tài nguyên dựa trên tập lệnh — bash, csh, perl, python và ruby ​​—. PowerShell_script dành riêng cho nền tảng Microsoft Windows và trình thông dịch Windows PowerShell.

Python

Sử dụng pythontài nguyên để thực thi các tập lệnh bằng trình thông dịch Python. Tài nguyên này cũng có thể sử dụng bất kỳ hành động và thuộc tính nào có sẵn cho tài nguyên thực thi.

Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

Khởi động lại

Sử dụng reboottài nguyên để khởi động lại một nút, một bước cần thiết với một số cài đặt trên một số nền tảng nhất định. Tài nguyên này được hỗ trợ để sử dụng trên các nền tảng Microsoft Windows, Mac OS X và Linux.

mã đăng kí

Sử dụng registry_key tài nguyên để tạo và xóa khóa đăng ký trong Microsoft Windows.

remote_directory

Sử dụng remote_directorytài nguyên để chuyển từng bước một thư mục từ sách dạy nấu ăn sang một nút. Thư mục được sao chép từ sách nấu ăn phải nằm trong COOKBOOK_NAME / files / default / REMOTE_DIRECTORY.

Tài nguyên remote_directory sẽ tuân theo tính cụ thể của tệp.

remote_file

Sử dụng remote_filetài nguyên để chuyển một tệp từ một vị trí từ xa bằng cách sử dụng đặc tính của tệp. Tài nguyên này tương tự như tài nguyên tệp.

Lộ trình

Sử dụng tài nguyên định tuyến để quản lý bảng định tuyến hệ thống trong môi trường Linux.

rpm_package

Sử dụng rpm_package tài nguyên để quản lý các gói cho nền tảng Trình quản lý gói RPM.

Ruby

Sử dụng rubytài nguyên để thực thi các tập lệnh bằng trình thông dịch Ruby. Tài nguyên này cũng có thể sử dụng bất kỳ hành động và thuộc tính nào có sẵn cho tài nguyên thực thi.

Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

ruby_block

Sử dụng ruby_blocktài nguyên để thực thi mã Ruby trong khi chạy Chef-Client. Mã Ruby trong tài nguyên ruby_block được đánh giá với các tài nguyên khác trong quá trình hội tụ, trong khi mã Ruby bên ngoài tài nguyên ruby_block được đánh giá trước các tài nguyên khác, khi công thức được biên dịch.

Kịch bản

Sử dụng tài nguyên tập lệnh để thực thi các tập lệnh bằng trình thông dịch được chỉ định, chẳng hạn như Bash, csh, Perl, Python hoặc Ruby. Tài nguyên này cũng có thể sử dụng bất kỳ hành động và thuộc tính nào có sẵn cho tài nguyên thực thi.

Các lệnh được thực thi với tài nguyên này (theo bản chất của chúng) không phải là idmpotent, vì chúng thường là duy nhất đối với môi trường mà chúng được chạy. Sử dụng not_if và only_if để bảo vệ tài nguyên này cho Idempotence.

Dịch vụ

Sử dụng service tài nguyên để quản lý một dịch vụ.

smart_os_package

Sử dụng smartos_package tài nguyên để quản lý các gói cho nền tảng SmartOS.

solaris_package

Các solaris_package tài nguyên được sử dụng để quản lý các gói cho nền tảng Solaris.

Lật đổ

Sử dụng subversion tài nguyên để quản lý tài nguyên kiểm soát nguồn tồn tại trong kho lưu trữ Subversion.

Bản mẫu

Sử dụng templatetài nguyên để quản lý nội dung của tệp bằng cách sử dụng mẫu Ruby nhúng (ERB) bằng cách chuyển tệp từ thư mục con của COOKBOOK_NAME / templates / đến một đường dẫn cụ thể nằm trên máy chủ đang chạy Chef-Client. Tài nguyên này bao gồm các hành động và thuộc tính từ tài nguyên tệp. Tệp mẫu do tài nguyên mẫu quản lý tuân theo các quy tắc về tính đặc trưng của tệp giống như tài nguyên tệp và tệp từ xa.

Người dùng

Sử dụng user tài nguyên để thêm người dùng, cập nhật người dùng hiện có, xóa người dùng và khóa / mở khóa mật khẩu người dùng.

windows_package

Sử dụng windows_package tài nguyên để quản lý các gói Microsoft Installer Package (MSI) cho nền tảng Microsoft Windows.

windows_service

Sử dụng windows_service tài nguyên để quản lý dịch vụ trên nền tảng Microsoft Windows.

yum_package

Sử dụng yum_packagetài nguyên để cài đặt, nâng cấp và gỡ bỏ các gói với Yum cho nền tảng Red Hat và CentOS. Tài nguyên yum_package có thể phân giải cung cấp dữ liệu cho các gói giống như Yum có thể làm khi nó được chạy từ dòng lệnh. Điều này cho phép nhiều tùy chọn để cài đặt gói, như phiên bản tối thiểu, cung cấp ảo và tên thư viện.

Lightweight resource provider (LWRP) cung cấp tùy chọn mở rộng danh sách các tài nguyên có sẵn bằng cách mở rộng các tính năng của nó và cho phép người dùng Chef tạo các tài nguyên tùy chỉnh.

Bằng cách tạo tài nguyên tùy chỉnh, người ta có thể đơn giản viết sách dạy nấu ăn vì người ta có thể sở hữu các tài nguyên tùy chỉnh phong phú bằng cách sử dụng Chef DSL giúp làm cho mã công thức trở nên biểu cảm hơn.

Trong cộng đồng Chef, nhiều tài nguyên tùy chỉnh được triển khai bằng LWRP. Có nhiều ví dụ hoạt động của LWRP nhưiptables_rulesapt_repository.

Phương pháp làm việc

Đảm bảo rằng một trong số đó có tên sách nấu ăn Testing_resource và run_list của nút có chứa sách dạy nấu ăn Testing_resource.

Xây dựng LWRP

Step 1 - Tạo tài nguyên tùy chỉnh trong sách dạy nấu ăn Testing_resource.

vipin@laptop:~/chef-repo $ subl cookbooks/Testing_resource/resources/default.rb 
actions :create, :remove 
attribute :title, kind_of: String, default: "World" 
attribute :path, kind_of: String, default: "/tmp/greeting.txt"

Step 2 - Tạo nhà cung cấp cho các tài nguyên trong sách dạy nấu ăn Tesing_resource.

vipin@laptop:~/chef-repo $ subl cookbooks/Testing_resource/provider/default.rb 
action :create do 
   log "Adding '#{new_resource.name}' greeting as #{new_resource. 
      path}" 
   file new_resource.path do 
      content "#{new_resource.name}, #{new_resource.title}!" 
      action :create 
end  
action :remove do 
   Chef::Log.info "Removing '#{new_resource.name}' greeting #{new_resource.path}" 
   file new_resource.path do 
      action :delete 
   end 
end

Step 3 - Sử dụng một tài nguyên mới bằng cách chỉnh sửa công thức mặc định của Testing_resource.

vipin@laptop:~/chef-repo $ subl cookbooks/Tesing_resource/recipes/default.rb 
greeting "Ohai" do 
   title "Chef" 
   action :create 
end

Step 4 - Tải sách nấu ăn đã sửa đổi lên máy chủ Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload greeting 
Uploading greeting [0.1.0]

Step 5 - Chạy Chef-Client trên nút.

vipin@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
2013-06-28T21:32:54+00:00] INFO: Processing greeting[Ohai] action 
create (greeting::default line 9) 
[2013-06-28T21:32:54+00:00] INFO: Adding 'Ohai' greeting as /tmp/ 
greeting.txt 
[2013-06-28T21:32:54+00:00] INFO: Processing file[/tmp/greeting. 
txt] action create (/srv/chef/file_store/cookbooks/greeting/ 
providers/default.rb line 7) 
[2013-06-28T21:32:54+00:00] INFO: entered create 
[2013-06-28T21:32:54+00:00] INFO: file[/tmp/greeting.txt] created 
file /tmp/greeting.txt 
...TRUNCATED OUTPUT...

Step 6 - Xác thực nội dung của tập tin được tạo.

user@server:~$ cat /tmp/greeting.txt 
Ohai, Chef!

Tập lệnh quy trình làm việc

LWRP có trong sách dạy nấu ăn. Một tài nguyên tùy chỉnh nằm trong sách nấu ăn và sẽ có sẵn dưới tên sách nấu ăn. Trong quy trình làm việc, trước tiên chúng tôi xác định các định nghĩa và sau đó chuyển các thuộc tính cho các tài nguyên sẽ được sử dụng trong sách dạy nấu ăn. Cuối cùng, chúng tôi sử dụng các hành động và thuộc tính đó trong công thức của mình.

Trong Chef, bản thiết kế là công cụ để tìm ra và ghi lại chính xác những gì có trên máy chủ. Bản thiết kế ghi lại tất cả những thứ cần thiết như giám đốc, gói, tệp cấu hình, v.v. Bản thiết kế có khả năng phân chia thông tin máy chủ ở nhiều định dạng khác nhau. Một trong số đó là công thức Chef. Điều này giúp định cấu hình máy chủ duy nhất bằng Chef.

Phương pháp Woring

Chúng ta cần cài đặt Python và Git trên nút nơi chúng ta cần chạy bản thiết kế.

Step 1 - Cài đặt bản thiết kế.

vipin@server:~$ pip install blueprint

Step 2 - Tạo bản thiết kế.

user@server:~$ sudo blueprint create internal-cookbook 
# [blueprint] using cached blueprintignore(5) rules 
# [blueprint] searching for Python packages 
# [blueprint] searching for PEAR/PECL packages 
# [blueprint] searching for Yum packages 
# [blueprint] searching for Ruby gems 
# [blueprint] searching for npm packages 
# [blueprint] searching for software built from source 
# [blueprint] searching for configuration files 
# [blueprint] /etc/ssl/certs/AC_Ra\xc3\xadz_Certic\xc3\ 
xa1mara_S.A..pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/NetLock_Arany_=Class_Gold=_F\xc5\ 
x91tan\xc3\xbas\xc3\xadtv\xc3\xa1ny.pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_Sa\ 
xc4\x9flay\xc4\xb1c\xc4\xb1s\xc4\xb1.pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/Certinomis_-_Autorit\xc3\xa9_Racine. 
pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/T\xc3\x9cB\xc4\xb0TAK_UEKAE_K\xc3\ 
xb6k_Sertifika_Hizmet_Sa\xc4\x9flay\xc4\xb1c\xc4\xb1s\xc4\xb1_-_S\ 
xc3\xbcr\xc3\xbcm_3.pem not UTF-8 - skipping it 
# [blueprint] searching for APT packages 
# [blueprint] searching for service dependencies

Step 3 - Tạo sách nấu ăn từ bản thiết kế.

user@server:~$ blueprint show -C internal-cookbook my-server/recipes/default.rb

Step 4 - Xác thực nội dung của tập tin được tạo.

user@server:~$ cat internal-cookbook /recipes/default.rb 
# 
# Automatically generated by blueprint(7). Edit at your own risk. 
# 
cookbook_file('/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar') 
do 
   backup false 
   group 'root' 
   mode '0644' 
   owner 'root' 
   source 'tmp/96468fd1cc36927a027045b223c61065de6bc575.tar' 
end 
execute('/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar') do 
   command 'tar xf "/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar"' 
   cwd '/usr/local' 
end 
directory('/etc/apt/apt.conf.d') do 
...TRUNCATED OUTPUT... 
service('ssh') do 
   action [:enable, :start] 
   subscribes :restart, resources('cookbook_file[/etc/default/ 
      keyboard]', 'cookbook_file[/etc/default/console-setup]', 
      'cookbook_file[/etc/default/ntfs-3g]', 'package[openssh-server]', 
      'execute[96468fd1cc36927a027045b223c61065de6bc575.tar]') 
end

Tập lệnh quy trình làm việc

Blueprint là một gói Python tìm ra tất cả dữ liệu cấu hình liên quan của máy chủ và lưu trữ nó trong một kho lưu trữ Git. Mỗi bản thiết kế có tên riêng.

Người ta có thể yêu cầu bản thiết kế hiển thị nội dung của repo Git của nó trong nhiều công thức khác nhau.

user@server:~$ ls -l internal-cookbook / 
total 8 
drwxrwxr-x 3 vagrant vagrant 4096 Jun 28 06:01 files 
-rw-rw-r-- 1 vagrant vagrant 0 Jun 28 06:01 metadata.rb 
drwxrwxr-x 2 vagrant vagrant 4096 Jun 28 06:01 recipes

Bản thiết kế Hiển thị lệnh

user@server:~$ blueprint show-packages my-server 
...TRUNCATED OUTPUT... 
apt wireless-regdb 2011.04.28-1ubuntu3 
apt zlib1g-dev 1:1.2.3.4.dfsg-3ubuntu4 
python2.7 distribute 0.6.45 
python2.7 pip 1.3.1 
pip blueprint 3.4.2 
pip virtualenv 1.9.1

Lệnh trước hiển thị tất cả các loại gói đã cài đặt. Các lệnh hiển thị khác như sau:

  • show-files
  • show-services
  • show-sources

Trong Chef, việc tạo tệp cấu hình và chuyển gói là những thành phần quan trọng. Có nhiều cách để Chef quản lý giống nhau. Có nhiều cách Chef hỗ trợ trong việc xử lý các tệp và gói phần mềm.

Cài đặt Gói từ Repo của bên thứ ba

Step 1 - Chỉnh sửa công thức mặc định của sách nấu ăn.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
include_recipe "apt" 
apt_repository "s3tools" do 
   uri "http://s3tools.org/repo/deb-all" 
   components ["stable/"] 
   key "http://s3tools.org/repo/deb-all/stable/s3tools.key" 
   action :add 
end 
package "s3cmd"

Step 2 - Chỉnh sửa siêu dữ liệu để thêm phụ thuộc vào sách nấu ăn apt.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/metadata.rb 
... 
depends "apt"

Step 3 - Tải sách nấu ăn đã sửa đổi lên máy chủ Chef.

Step 4 - Xác thực rằng gói bạn đang cố gắng cài đặt chưa được cài đặt.

Step 5 - Xác thực repo mặc định.

Step 6 - Chạy Chef-Client trên nút.

Step 7 - Xác thực rằng gói yêu cầu đã được cài đặt.

Cài đặt phần mềm từ nguồn

Nếu một người cần cài đặt một phần mềm không có sẵn dưới dạng gói cho một nền tảng nhất định, người ta cần phải tự biên dịch phần mềm đó. Trong Chef, chúng ta có thể làm điều này bằng cách sử dụng tài nguyên script.

Step 1 - Chỉnh sửa công thức mặc định.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/ 
default.rb 
version = "1.3.9" 
bash "install_nginx_from_source" do 
   cwd Chef::Config['file_cache_path'] 
   code ≪-EOH 
      wget http://nginx.org/download/nginx-#{version}.tar.gz 
      tar zxf nginx-#{version}.tar.gz && 
      cd nginx-#{version} && 
      ./configure && make && make install 
   EOH

Step 2 - Tải sách nấu ăn đã sửa đổi lên máy chủ Chef.

Step 3 - Chạy Chef-Client trên nút.

Step 4 - Xác thực rằng nginx đã được cài đặt.

Sách nấu ăn cộng đồng tương tự như bất kỳ sách nấu ăn nào khác. Lý do duy nhất nó được gọi là sách nấu ăn cộng đồng là vì bất kỳ ai biết viết sách nấu ăn đều có thể tham gia cộng đồng này và tải sách nấu ăn của họ lên trung tâm tập trung. Những cuốn sách nấu ăn này có sẵn miễn phí và bất kỳ ai cũng có thể tải xuống và sử dụng nó. Để sử dụng các sách nấu ăn cộng đồng này, người ta cần tải chúng xuống, sửa đổi chúng theo yêu cầu và tải chúng lên máy chủ Chef tương ứng của họ.

Một người cần phải cấu hình dao trên hệ thống của họ để cập nhật, tải lên và tải xuống sách nấu ăn. Tương tác với sách nấu ăn bằng các lệnh trong sách nấu ăn bằng dao. Với sách dạy nấu ăn bằng dao, bạn có thể tạo, xóa, hiển thị, liệt kê, tải xuống và tải lên sách nấu ăn. Đọc tài liệu hướng dẫn sử dụng dao để biết thêm thông tin trong Chương 7.

Sau đây là liên kết của sách nấu ăn cộng đồng: https://supermarket.chef.io/cookbooksdirectory