Sách hướng dẫn của Chef mô tả trạng thái mong muốn của các nút của bạn và cho phép Chef đưa ra các thay đổi cần thiết để đạt được trạng thái này. Trong hướng dẫn này, bạn sẽ học cách tạo sách hướng dẫn cấu hình ngăn xếp LAMP trên Linode.

Tạo sách dạy nấu ăn đầu tiên của bạn

Trước khi bạn bắt đầu

  1. Thiết lập Chef với hướng dẫn Thiết lập máy chủ, máy trạm và nút Chef . Khi làm theo hướng dẫn đó, hãy chọn Ubuntu 16.04 làm ảnh Linux của bạn cho nút Chef mà bạn sẽ khởi động và quản lý . Hướng dẫn này sẽ sử dụng sách hướng dẫn MySQL Chef , hiện chưa hỗ trợ Ubuntu 18.04.
  2. Sau khi nút của bạn được khởi động, bạn có thể sử dụng sổ tay hướng dẫn Chef để bảo mật nút của mình. Hãy cân nhắc sử dụng sổ tay hướng dẫn Users và sổ tay hướng dẫn Firewall cho công việc này. Mặc dù không bắt buộc phải làm như vậy để hoàn thành hướng dẫn này, nhưng bạn nên làm như vậy.
  3. Bạn cũng có thể tham khảo Hướng dẫn đầu bếp cho người mới bắt đầu để có cái nhìn tổng quan về các khái niệm đầu bếp.
  4. Các ví dụ trong hướng dẫn này yêu cầu tài khoản người dùng có quyền sudo. Người đọc sử dụng tài khoản người dùng hạn chế sẽ cần thêm tiền tố sudo vào lệnh khi phát lệnh cho nút máy khách Chef và thay thế -x rootbằng -x usernamewhere usernameis your limited user account.
  5. Đảm bảo rằng /etc/hoststệp của máy trạm của bạn chứa địa chỉ IP riêng, địa chỉ IP của máy chủ Chef và tên miền đủ điều kiện, cũng như địa chỉ IP và tên máy chủ cho bất kỳ nút nào bạn sẽ tương tác từ máy trạm. Ví dụ:
    127.0.0.1       localhost
    192.0.2.0       workstation
    192.0.1.0       www.example.com
    198.51.100.0    node-hostname

Create the Cookbook

1.Từ máy trạm của bạn, di chuyển đến chef-repo/cookbooksthư mục:

cd chef-repo/cookbooks

2.Tạo sách dạy nấu ăn. Trong trường hợp này, sách dạy nấu ăn có tiêu đề là lamp_stack:

chef generate cookbook lamp_stack

3.Di chuyển đến thư mục mới tạo của sách dạy nấu ăn:

cd lamp_stack

Nếu bạn thực hiện lslệnh, bạn sẽ thấy các tệp và thư mục sau:

Berksfile  CHANGELOG.md  chefignore  LICENSE  metadata.rb  README.md  recipes  spec  test

default.rb

Thuộc tính là các phần dữ liệu giúp chef-client xác định trạng thái hiện tại của một nút và bất kỳ thay đổi nào đã diễn ra trên nút từ lần chạy chef-client này sang lần chạy chef-client khác. Thuộc tính được thu thập từ trạng thái của nút, cookbook, vai trò và môi trường. Sử dụng các nguồn này, một danh sách thuộc tính được tạo cho mỗi lần chạy chef-client và được áp dụng cho nút. Nếu một default.rbtệp tồn tại trong cookbook, tệp đó sẽ được tải trước, nhưng có mức độ ưu tiên thuộc tính thấp nhất.

default.rbTệp này recipeschứa các tài nguyên công thức “mặc định”.

Trong ví dụ này, tệp lamp_stacksách hướng dẫn nấu ăn default.rbđược sử dụng để cập nhật phần mềm phân phối của nút.

1.Từ trong thư lamp_stackmục, điều hướng đến recipesthư mục:

cd recipes

2.Mở default.rbtệp và thêm đoạn mã sau:

#
# Cookbook Name:: lamp_stack
# Recipe:: default
#
#

execute "update-upgrade" do
  command "sudo apt-get update && sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' upgrade"
  action :run
end

Công thức bao gồm một loạt các tài nguyên . Trong trường hợp này, tài nguyên thực thi được sử dụng, tài nguyên này yêu cầu một lệnh được thực thi một lần. Các apt-get update && apt-get upgrade -ylệnh được định nghĩa trong commandphần và actionđược đặt thành :runcác lệnh.

Các biến và cờ bổ sung được truyền vào upgradelệnh có mục đích ngăn chặn menu cấu hình GRUB, điều này có thể khiến Chef bị treo khi chờ người dùng nhập dữ liệu.

Đây là một trong những công thức nấu ăn đơn giản hơn của Chef để viết và là cách tốt để bắt đầu. Bất kỳ quy trình khởi động nào khác mà bạn cho là quan trọng đều có thể được thêm vào tệp bằng cách mô phỏng mẫu mã ở trên.

3.Để kiểm tra công thức, hãy thêm sách dạy nấu ăn LAMP vào máy chủ Chef:

knife cookbook upload lamp_stack

4.Xác minh rằng công thức đã được thêm vào máy chủ Chef:

knife cookbook list

Bạn sẽ thấy kết quả tương tự:

Uploading lamp_stack   [0.1.0]
Uploaded 1 cookbook.

5.Thêm công thức vào danh sách chạy của nút bạn chọn , thay thế nodenamebằng tên nút của bạn:

knife node run_list add nodename "recipe[lamp_stack]"

6.Từ máy trạm của bạn, áp dụng các cấu hình được xác định trong cookbook bằng cách chạy chef-client trên nút của bạn. Thay thế nodenamebằng tên nút của bạn:

knife ssh 'name:nodename' 'sudo chef-client' -x root

Đầu ra của bạn sẽ hiển thị một lần chạy Chef thành công. Nếu không, hãy xem lại mã của bạn để tìm bất kỳ lỗi nào, thường được xác định trong đầu ra của lần chef-clientchạy.

Người Apache

Cài đặt và kích hoạt

1.Trong máy trạm Chef của bạn, hãy tạo một tệp mới trong ~/chef-repo/cookbooks/lamp_stack/recipesthư mục có tên là apache.rb. Tệp này sẽ chứa tất cả thông tin cấu hình Apache của bạn.

2.Mở tệp và xác định tài nguyên gói để cài đặt Apache:

package "apache2" do
  action :install
end

Một lần nữa, đây là một công thức rất cơ bản. Tài nguyên gói gọi đến một gói ( apache2). Giá trị này phải là tên gói hợp lệ. Hành động là cài đặt vì Apache đang được cài đặt trong bước này. Không cần thêm giá trị nào để chạy cài đặt.

3.Đặt Apache để bật và khởi động khi khởi động lại. Trong cùng một tệp, thêm các dòng mã bổ sung:

service "apache2" do
  action [:enable, :start]
end

Điều này sử dụng tài nguyên dịch vụ , gọi đến dịch vụ Apache. Hành động enable sẽ bật dịch vụ khi khởi động và start sẽ khởi động Apache.

Lưu và đóng apache.rb tệp.

4.Để kiểm tra công thức Apache, hãy cập nhật công thức LAMP Stack trên máy chủ:

knife cookbook upload lamp_stack

5.Thêm công thức vào danh sách chạy của một nút, thay thế nodenamebằng tên nút bạn chọn:

knife node run_list add nodename "recipe[lamp_stack::apache]"

Vì đây không phải là default.rbcông thức nên tên công thức, apache , phải được thêm vào giá trị công thức.

Ghi chú: Để xem danh sách tất cả các nút được máy chủ Chef của bạn quản lý, hãy đưa ra lệnh sau từ máy trạm của bạn:

knife node list

6.Từ máy trạm của bạn, áp dụng các cấu hình được xác định trong cookbook bằng cách chạy chef-client trên nút của bạn. Thay thế nodenamebằng tên nút của bạn:

knife ssh 'name:nodename' 'sudo chef-client' -x root

Nếu công thức không thành công do lỗi cú pháp, Chef sẽ ghi chú trong quá trình xuất công thức.

7.Sau khi chạy thành công chef-client, hãy kiểm tra xem Apache có đang chạy hay không:

knife ssh 'name:nodename' 'systemctl status apache2' -x root

Ghi chú: Lặp lại các bước 4-7 để tải từng công thức lên máy chủ Chef khi bạn tạo công thức. Chạy chef-clienttrên nút của bạn khi cần trong suốt phần còn lại của hướng dẫn này để đảm bảo công thức của bạn hoạt động bình thường và không có lỗi. Khi thêm công thức mới, hãy đảm bảo bạn đang sử dụng đúng tên của công thức đó trong danh sách chạy.

Đây không phải là quy trình làm việc được khuyến nghị cho môi trường sản xuất. Bạn có thể cân nhắc tạo các môi trường Chef khác nhau để thử nghiệm, dàn dựng và sản xuất.

Cấu hình máy chủ ảo

Cấu hình này dựa trên hướng dẫn Cách cài đặt LAMP Stack trên Ubuntu 16.04 .

1.Vì có thể cần cấu hình nhiều trang web, hãy sử dụng tính năng thuộc tính của Chef để xác định các khía cạnh nhất định của tệp máy chủ ảo. ChefDK có lệnh tích hợp để tạo thư mục và default.rbtệp thuộc tính trong sổ tay nấu ăn. Thay thế ~/chef-repo/cookbooks/lamp_stackbằng đường dẫn của sổ tay nấu ăn của bạn:

chef generate attribute ~/chef-repo/cookbooks/lamp_stack default

2.Trong phần mới default.rb, tạo các giá trị mặc định cho sổ tay hướng dẫn:

default["lamp_stack"]["sites"]["example.com"] = { "port" => 80, "servername" => "example.com", "serveradmin" => "webmaster@example.com" }

Tiền tố defaultxác định rằng đây là các giá trị bình thường được sử dụng tại lamp_stacknơi trang web example.comsẽ được gọi đến. Điều này có thể được xem như một hệ thống phân cấp: Bên dưới chính sổ tay hướng dẫn là các trang web, sau đó được xác định theo URL của chúng.

Các giá trị sau trong mảng (được xác định bằng dấu ngoặc nhọn ( {})) là các giá trị sẽ được sử dụng để cấu hình tệp máy chủ ảo. Apache sẽ được thiết lập để lắng nghe trên cổng 80và sử dụng các giá trị được liệt kê cho tên máy chủ và email của quản trị viên.

Nếu bạn có nhiều hơn một trang web hoặc URL khả dụng (ví dụ: example.org), cú pháp này sẽ được mô phỏng cho URL thứ hai:

default["lamp_stack"]["sites"]["example.com"] = { "port" => 80, "servername" => "example.com", "serveradmin" => "webmaster@example.com" }
default["lamp_stack"]["sites"]["example.org"] = { "port" => 80, "servername" => "example.org", "serveradmin" => "webmaster@example.org" }

3.Quay lại apache.rbtệp của bạn bên dưới recipesđể gọi các thuộc tính vừa được xác định. Thực hiện điều này với nodetài nguyên:

#Install & enable Apache

package "apache2" do
  action :install
end

service "apache2" do
  action [:enable, :start]
end


# Virtual Host Files

node["lamp_stack"]["sites"].each do |sitename, data|
end

Điều này gọi các giá trị bên dưới ["lamp_stack"]["sites"]. Mã được thêm vào khối này sẽ được tạo cho mỗi giá trị, được định nghĩa bởi từ sitenamedataGiá trị gọi các giá trị được liệt kê trong mảng của mỗi sitenamethuộc tính.

4.Trong nodetài nguyên, hãy xác định gốc tài liệu. Gốc này sẽ được sử dụng để xác định các tệp HTML công khai và bất kỳ tệp nhật ký nào sẽ được tạo:

node["lamp_stack"]["sites"].each do |sitename, data|
  document_root = "/var/www/html/#{sitename}"
end

5.Tạo thư document_rootmục. Khai báo một directorytài nguyên với truegiá trị đệ quy để tất cả các thư mục dẫn đến sitenamesẽ được tạo. Giá trị quyền 0755cho phép chủ sở hữu tệp có quyền truy cập đầy đủ vào thư mục, trong khi nhóm và người dùng thông thường sẽ có quyền đọc và thực thi:

node["lamp_stack"]["sites"].each do |sitename, data|
  document_root = "/var/www/html/#{sitename}"

  directory document_root do
    mode "0755"
    recursive true
  end

end

6.Tính năng mẫu sẽ được sử dụng để tạo các tệp máy chủ ảo cần thiết. Trong thư chef-repomục, hãy chạy chef generate templatelệnh với đường dẫn đến cookbook và tên tệp mẫu được xác định:

chef generate template ~/chef-repo/cookbooks/lamp_stack virtualhosts

7.Mở và chỉnh sửa virtualhosts.erbtệp. Thay vì viết giá trị thực cho từng tham số VirtualHost, hãy sử dụng biến Ruby. Biến Ruby được xác định bằng cú <%= @variable_name %>pháp. Tên biến bạn sử dụng sẽ cần được xác định trong tệp recipe:

<VirtualHost *:<%= @port %>>
        ServerAdmin <%= @serveradmin %>
        ServerName <%= @servername %>
        ServerAlias www.<%= @servername %>
        DocumentRoot <%= @document_root %>/public_html
        ErrorLog <%= @document_root %>/logs/error.log
        <Directory <%= @document_root %>/public_html>
                Require all granted
        </Directory>
</VirtualHost>

Một số biến trông quen thuộc. Chúng được tạo ở Bước 2, khi đặt tên cho các thuộc tính mặc định.

8.Quay lại apache.rbcông thức. Trong khoảng trống sau tài directorynguyên, sử dụng templatetài nguyên để gọi tệp mẫu vừa tạo:

# [...]

#Virtual Host Files

node["lamp_stack"]["sites"].each do |sitename, data|
  document_root = "/var/www/html/#{sitename}"

  directory document_root do
    mode "0755"
    recursive true
  end

  template "/etc/apache2/sites-available/#{sitename}.conf" do
    source "virtualhosts.erb"
    mode "0644"
    variables(
      :document_root => document_root,
      :port => data["port"],
      :serveradmin => data["serveradmin"],
      :servername => data["servername"]
    )
  end

end

Tên của tài nguyên mẫu phải là vị trí mà tệp máy chủ ảo được đặt trên các nút. Đây sourcelà tên của tệp mẫu. Chế độ 0644cung cấp cho chủ sở hữu tệp quyền đọc và ghi, và mọi người khác quyền đọc. Các giá trị được xác định trong variablesphần này được lấy từ tệp thuộc tính và chúng là các giá trị giống nhau được gọi trong mẫu.

9.Các trang web cần được bật trong Apache và máy chủ được khởi động lại. Điều này chỉ nên xảy ra nếu có thay đổi đối với máy chủ ảo, vì vậy giá notifiestrị nên được thêm vào templatetài nguyên. notifiesthông báo cho Chef khi mọi thứ đã thay đổi và chỉ sau đó mới chạy các lệnh:

template "/etc/apache2/sites-available/#{sitename}.conf" do
  source "virtualhosts.erb"
  mode "0644"
  variables(
    :document_root => document_root,
    :port => data["port"],
    :serveradmin => data["serveradmin"],
    :servername => data["servername"]
  )
  notifies :restart, "service[apache2]"
end

Lệnh này notifiesđặt tên cho mục :actioncần cam kết, sau đó là tài nguyên và tên tài nguyên trong dấu ngoặc vuông.

10. notifies cũng có thể gọi executelệnh, lệnh này sẽ chạy a2ensitevà kích hoạt các trang web có tệp máy chủ ảo tương ứng. Thêm executelệnh sau vào phía trên mã templatetài nguyên để tạo a2ensitetập lệnh:

# [...]

directory document_root do
  mode "0755"
  recursive true
end

execute "enable-sites" do
  command "a2ensite #{sitename}"
  action :nothing
end

template "/etc/apache2/sites-available/#{sitename}.conf" do

# [...]

Chỉ thị này action :nothingcó nghĩa là tài nguyên sẽ chờ được gọi. Thêm một notifiesdòng mới phía trên notifiesdòng trước đó vào templatemã tài nguyên để sử dụng nó:

# [...]

template "/etc/apache2/sites-available/#{sitename}.conf" do
  # [...]
  notifies :run, "execute[enable-sites]"
  notifies :restart, "service[apache2]"
end

# [...]

11.Các đường dẫn được tham chiếu trong các tệp máy chủ ảo cần được tạo. Một lần nữa, điều này được thực hiện với tài directorynguyên và nên được thêm vào trước endthẻ cuối cùng:

# [...]

node["lamp_stack"]["sites"].each do |sitename, data|
  # [...]

  directory "/var/www/html/#{sitename}/public_html" do
    action :create
  end

  directory "/var/www/html/#{sitename}/logs" do
    action :create
  end
end

Cấu hình Apache

Với các tệp máy chủ ảo được cấu hình và trang web của bạn được bật, hãy cấu hình Apache để chạy hiệu quả trên máy chủ của bạn. Thực hiện việc này bằng cách bật và cấu hình mô-đun đa xử lý (MPM) và chỉnh sửa apache2.conf.

Tất cả MPM đều nằm trong mods_availablethư mục của Apache. Trong ví dụ này, preforkMPM sẽ được sử dụng, nằm tại /etc/apache2/mods-available/mpm_prefork.conf. Nếu chúng ta đang có kế hoạch triển khai tới các nút có kích thước khác nhau, chúng ta sẽ tạo một tệp mẫu để thay thế tệp gốc, cho phép tùy chỉnh nhiều hơn các biến cụ thể. Trong trường hợp này, tệp cookbook sẽ được sử dụng để chỉnh sửa tệp.

Tệp cookbook là các tài liệu tĩnh được chạy trên tài liệu ở cùng một vị trí trên máy chủ của bạn. Nếu có bất kỳ thay đổi nào được thực hiện, tệp cookbook sẽ sao lưu tệp gốc và thay thế bằng tệp mới.

1.Để tạo tệp sách dạy nấu ăn, hãy điều hướng đến files/defaulttừ thư mục chính của sách dạy nấu ăn. Nếu các thư mục chưa tồn tại, hãy tạo chúng:

mkdir -p ~/chef-repo/cookbooks/lamp_stack/files/default/
cd ~/chef-repo/cookbooks/lamp_stack/files/default

2.Tạo một tệp có tên mpm_prefork.confvà sao chép cấu hình sự kiện MPM vào đó, thay đổi bất kỳ giá trị nào cần thiết:

<IfModule mpm_prefork_module>
        StartServers            4
        MinSpareServers         3
        MaxSpareServers         40
        MaxRequestWorkers       200
        MaxConnectionsPerChild  10000
</IfModule>

3.Quay lại apache.rb, và sử dụng cookbook_filetài nguyên để gọi tệp chúng ta vừa tạo. Vì MPM sẽ cần được bật, chúng ta sẽ sử dụng lệnh notifiesmột lần nữa, lần này để thực thi a2enmod mpm_event. Thêm tài nguyên executevà cookbook_filevào apache.rbtệp trước endthẻ cuối cùng:

# [...]

node["lamp_stack"]["sites"].each do |sitename, data|
  # [...]

  execute "enable-prefork" do
    command "a2enmod mpm_prefork"
    action :nothing
  end

  cookbook_file "/etc/apache2/mods-available/mpm_prefork.conf" do
    source "mpm_prefork.conf"
    mode "0644"
    notifies :run, "execute[enable-prefork]"
  end
end

4.Trong đó apache2.confgiá KeepAlivetrị phải được đặt thành off, đây là thay đổi duy nhất được thực hiện trong tệp. Điều này có thể được thay đổi thông qua các tệp mẫu hoặc sổ tay hướng dẫn, mặc dù trong trường hợp này, một sedlệnh đơn giản sẽ được sử dụng, được ghép nối với executetài nguyên. Cập nhật apache.rbvới tài nguyên mới execute:

# [...]

directory "/var/www/html/#{sitename}/logs" do
  action :create
end

execute "keepalive" do
  command "sed -i 's/KeepAlive On/KeepAlive Off/g' /etc/apache2/apache2.conf"
  action :run
end

execute "enable-prefork" do

# [...]

Bây giờ bạn apache.rbđã hoàn tất. Một ví dụ về tệp cuối cùng nằm ở đây .

MySQL

Tải xuống Thư viện MySQL

1.Chef Supermarket có một sách hướng dẫn MySQL do OpsCode duy trì , sách này thiết lập các tài nguyên/nhà cung cấp MySQL nhẹ (LWRP) để sử dụng. Từ máy trạm, hãy tải xuống và cài đặt sách hướng dẫn:

knife cookbook site install mysql 

Điều này cũng sẽ cài đặt bất kỳ và tất cả các phụ thuộc cần thiết để sử dụng cookbook. Các phụ thuộc này bao gồm cookbook smfvà yum-mysql-communitycookbook, lần lượt phụ thuộc vào cookbook rbacvà yumcookbook.

2.Từ thư mục chính của sổ tay hướng dẫn LAMP, hãy mở tệp metadata.rbvà thêm phần phụ thuộc vào sổ tay hướng dẫn MySQL:

depends          'mysql', '~> 8.6.0'

Ghi chú:Kiểm tra trang Supermarket của MySQL Cookbook để đảm bảo đây là phiên bản mới nhất của sách hướng dẫn. MySQL Cookbook hiện chưa hỗ trợ Ubuntu 18.04.

3.Tải những cuốn sách dạy nấu ăn này lên máy chủ:

knife cookbook upload mysql --include-dependencies

Tạo và mã hóa mật khẩu MySQL của bạn

Chef có một tính năng được gọi là túi dữ liệu . Túi dữ liệu lưu trữ thông tin và có thể được mã hóa để lưu trữ mật khẩu và dữ liệu nhạy cảm khác.

1.Trên máy trạm, tạo khóa bí mật:

openssl rand -base64 512 > ~/chef-repo/.chef/encrypted_data_bag_secret

2.Tải khóa này lên thư mục nút của bạn /etc/chef, có thể tải thủ công scptừ nút (có thể tìm thấy ví dụ trong hướng dẫn Thiết lập Chef ) hoặc thông qua việc sử dụng tệp công thức nấu ăn.

3.Trên máy trạm, tạo một mysqltúi dữ liệu chứa tệp rtpass.jsonmật khẩu gốc:

knife data bag create mysql rtpass.json --secret-file ~/chef-repo/.chef/encrypted_data_bag_secret

Bạn sẽ được yêu cầu chỉnh sửa rtpass.jsontệp:

{
  "id": "rtpass.json",
  "password": "password123"
}

Thay thế password123bằng mật khẩu an toàn.

4.Xác nhận rằng rtpass.jsontập tin đã được tạo:

knife data bag show mysql

Nó sẽ xuất ra rtpass.json. Để đảm bảo rằng nó được mã hóa, hãy chạy:

knife data bag show mysql rtpass.json

Đầu ra sẽ không thể đọc được do bị mã hóa và sẽ trông giống như sau:

WARNING: Encrypted data bag detected, but no secret provided for decoding.  Displaying encrypted data.
    id:       rtpass.json
    password:
      cipher:         aes-256-cbc
      encrypted_data: wpEAb7TGUqBmdB1TJA/5vyiAo2qaRSIF1dRAc+vkBhQ=

      iv:             E5TbF+9thH9amU3QmGxWmw==

      version:        1
    user:
      cipher:         aes-256-cbc
      encrypted_data: VLA00Wrnh9DrZqDcytvo0HQUG0oqI6+6BkQjHXp6c0c=

      iv:             6V+3ROpW9RG+/honbf/RUw==

      version:        1

Thiết lập MySQL

Sau khi tải xuống thư viện MySQL và chuẩn bị mật khẩu gốc được mã hóa, giờ đây bạn có thể thiết lập công thức để tải xuống và cấu hình MySQL.

1.Mở một tệp mới có tên là recipescalled mysql.rbvà xác định túi dữ liệu sẽ được sử dụng:

mysqlpass = data_bag_item("mysql", "rtpass.json")

2.Nhờ có LWRP được cung cấp thông qua sách hướng dẫn MySQL, quá trình cài đặt ban đầu và tạo cơ sở dữ liệu cho MySQL có thể được thực hiện trong một tài nguyên:

mysqlpass = data_bag_item("mysql", "rtpass.json")

mysql_service "mysqldefault" do
  version '5.7'
  initial_root_password mysqlpass["password"]
  action [:create, :start]
end

mysqldefaultlà tên của dịch vụ MySQL cho vùng chứa này. Các inital_root_passwordlệnh gọi đến giá trị được xác định trong văn bản ở trên, trong khi hành động tạo cơ sở dữ liệu và khởi động dịch vụ MySQL.

3.Phiên bản MySQL mà mysqlcài đặt cookbook tạo ra sử dụng tệp sock ở vị trí không chuẩn, do đó bạn phải khai báo vị trí này để tương tác với MySQL từ dòng lệnh. Để thực hiện việc này, hãy tạo tệp cookbook có tên là my.cnfcấu hình sau:

[client]
socket=/run/mysql-mysqldefault/mysqld.sock

4.Mở mysql.rblại và thêm các dòng sau vào cuối tệp:

# [...]

cookbook_file "/etc/my.cnf" do
  source "my.cnf"
  mode "0644"
end

PHP

1.Trong thư mục recipes, tạo một php.rbtệp mới. Các lệnh bên dưới cài đặt PHP và tất cả các gói cần thiết để làm việc với Apache và MySQL:

package "php" do
  action :install
end

package "php-pear" do
  action :install
end

package "php-mysql" do
  action :install
end

package "libapache2-mod-php" do
  action :install
end

2.Để cấu hình dễ dàng, php.initệp sẽ được tạo và sử dụng như một tệp sổ tay hướng dẫn, khá giống với mô-đun MPM ở trên. Bạn có thể:

Thêm công thức PHP, chạy chef-clientvà sao chép tệp từ một nút (nằm trong /etc/php/7.0/cli/php.ini), hoặc:

Sao chép nó từ mẫu chef-php.ini này . Tệp này sẽ được chuyển đến thư chef-repo/cookbooks/lamp_stack/files/default/mục. Tệp này cũng có thể được chuyển thành mẫu, nếu nó phù hợp hơn với cấu hình của bạn.

3.php.inilà một tệp lớn. Tìm kiếm và chỉnh sửa các giá trị sau để phù hợp nhất với Linode của bạn. Các giá trị được đề xuất bên dưới dành cho Linode 2GB:

max_execution_time = 30
memory_limit = 128M
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
max_input_time = 30

4.Quay lại php.rbvà thêm cookbook_filetài nguyên vào cuối công thức:

cookbook_file "/etc/php/7.0/cli/php.ini" do
  source "php.ini"
  mode "0644"
  notifies :restart, "service[apache2]"
end

5.Do những thay đổi được thực hiện đối với php.ini, một /var/log/phpthư mục cần được tạo và quyền sở hữu của nó được đặt thành người dùng Apache. Điều này được thực hiện thông qua notifieslệnh và thực thi tài nguyên, như đã thực hiện trước đó. Thêm các tài nguyên này vào cuối php.rb:

execute "chownlog" do
  command "chown www-data /var/log/php"
  action :nothing
end

directory "/var/log/php" do
  action :create
  notifies :run, "execute[chownlog]"
end

Công thức PHP đã hoàn thành! Xem ví dụ về tệp php.rb tại đây .

6.Đảm bảo rằng máy chủ Chef của bạn chứa sổ tay nấu ăn đã cập nhật và danh sách chạy của nút của bạn được cập nhật. Thay thế nodenamebằng tên nút Chef của bạn:

knife cookbook upload lamp_stack
 knife node run_list add nodename "recipe[lamp_stack],recipe[lamp_stack::apache],recipe[lamp_stack::mysql],recipe[lamp_stack::php]"

Kiểm tra cài đặt của bạn

1.Để đảm bảo dịch vụ Apache đã được cài đặt và chạy thành công, bạn có thể thực hiện lệnh sau, thay thế node_nametên nút của bạn:

knife ssh 'name:node_name' 'systemctl status apache2' -x root

Ngoài ra, bạn có thể truy cập tên miền máy chủ của mình trong trình duyệt. Nếu hoạt động, bạn sẽ thấy trang máy chủ Chef hướng dẫn bạn cách thiết lập Bảng điều khiển quản lý (vì bạn chưa tải bất kỳ tệp nào lên máy chủ của mình.)

2.Để kiểm tra trạng thái của PHP, bạn sẽ cần tải một tệp lên máy chủ của mình để đảm bảo tệp được hiển thị chính xác. Một tệp PHP đơn giản mà bạn có thể tạo là tệp thông tin PHP. Tạo một tệp có tên info.phptrong cùng thư mục với các tệp sách hướng dẫn khác mà bạn đã tạo:

<?php phpinfo(); ?>

Sửa đổi tệp của bạn php.rbvà thêm nội dung sau vào cuối tệp, thay thế example.comtên miền của trang web:

cookbook_file "/var/www/html/example.com/public_html/info.php" do
  source "info.php"
end

Tải sách dạy nấu ăn của bạn lên máy chủ Chef, sau đó chạy chef-clienttrên nút của bạn, thay thế node_namebằng tên nút của bạn:

knife cookbook upload lamp_stack
knife ssh 'name:node_name' 'sudo chef-client' -x root

Truy cập example.com/info.phpvào trình duyệt của bạn. Bạn sẽ thấy một trang chứa thông tin về cài đặt PHP của bạn.

3.Để kiểm tra cài đặt MySQL của bạn, bạn có thể kiểm tra trạng thái của MySQL bằng cách sử dụng systmectl. Phát hành lệnh sau để đảm bảo dịch vụ MySQL đang chạy đúng cách:

knife ssh 'name:node_name' 'systemctl status mysql-mysqldefault' -u root

chef-clientkhông được thiết kế để chấp nhận đầu vào của người dùng và do đó, việc sử dụng các lệnh như mysqladmin statusvậy yêu cầu mật khẩu có thể khiến Chef bị treo. Nếu bạn cần có thể tương tác trực tiếp với máy khách MySQL, hãy cân nhắc đăng nhập trực tiếp vào máy chủ của bạn.

Bạn vừa tạo một sách hướng dẫn nấu ăn LAMP Stack. Qua hướng dẫn này, bạn sẽ học cách sử dụng các tài nguyên executepackageservicenodedirectorytemplatecookbook_file, và mysql_servicetrong một công thức nấu ăn, cũng như tải xuống và sử dụng LWRP, tạo các túi dữ liệu được mã hóa, tải lên/cập nhật sách hướng dẫn nấu ăn của bạn lên máy chủ và sử dụng các thuộc tính, mẫu và tệp sách hướng dẫn nấu ăn. Điều này cung cấp cho bạn một cơ sở vững chắc trong việc tạo Chef và sách hướng dẫn nấu ăn cho các dự án trong tương lai.

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.

Nguồn: https://www.linode.com/docs/guides/creating-your-first-chef-cookbook/#mysql