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 modevà Solo 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, và 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_if và only_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_if và only_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_rules và apt_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