Hướng dẫn sử dụng Puppet dành cho người mới bắt đầu: Cơ bản & DSL
⚡ Tóm tắt thông minh
Puppet là một nền tảng quản lý cấu hình mã nguồn mở tự động hóa quy trình cung cấp, cấu hình và duy trì tính nhất quán của máy chủ. Nó áp dụng cơ sở hạ tầng dưới dạng mã thông qua một ngôn ngữ khai báo chuyên biệt, thay thế việc quản trị thủ công lặp đi lặp lại trên các hệ thống máy chủ lớn.

Puppet là một công cụ quản lý cấu hình mã nguồn mở cho phép bạn định nghĩa cơ sở hạ tầng dưới dạng mã và duy trì trạng thái nhất quán, có thể lặp lại cho các hệ thống máy chủ lớn. Trước khi tìm hiểu về Puppet, chúng ta hãy cùng tìm hiểu về quản lý cấu hình.
Quản lý cấu hình là gì?
Quản lý cấu hình là quá trình duy trì phần mềm và hệ thống máy tính — chẳng hạn như máy chủ, thiết bị lưu trữ và mạng — ở trạng thái đã biết, mong muốn và nhất quán. Nó cũng cung cấp quyền truy cập vào hồ sơ lịch sử chính xác về trạng thái hệ thống cho mục đích quản lý dự án và kiểm toán.
Quản trị viên hệ thống chủ yếu thực hiện các tác vụ lặp đi lặp lại, chẳng hạn như cài đặt máy chủ và cấu hình chúng. Những chuyên gia này có thể tự động hóa công việc này bằng cách viết các tập lệnh.
Tuy nhiên, công việc này trở nên khó khăn khi họ làm việc trên một cơ sở hạ tầng khổng lồ. Các công cụ quản lý cấu hình như Puppet đã được giới thiệu để giải quyết những vấn đề này.
Con rối là gì?
Múa rối Puppet là một công cụ quản lý hệ thống dùng để tập trung hóa và tự động hóa quy trình quản lý cấu hình. Puppet cũng được sử dụng như một công cụ triển khai phần mềm.
Đây là phần mềm quản lý cấu hình mã nguồn mở, được sử dụng rộng rãi để cấu hình, quản lý, triển khai máy chủ và điều phối các ứng dụng và dịch vụ khác nhau trên toàn bộ cơ sở hạ tầng của một tổ chức.
Puppet được thiết kế đặc biệt để quản lý cấu hình của Linux và Windows hệ thống. Nó được viết bằng Ruby và sử dụng tính năng độc đáo của nó Dchính Sđặc biệt Lngôn ngữ (DSL) để mô tả cấu hình hệ thống.
Các phiên bản con rối là gì?
Con rối có hai phiên bản:
- Con rối mã nguồn mởĐây là phiên bản cơ bản của công cụ quản lý cấu hình Puppet, còn được gọi là Puppet mã nguồn mở. Nó có sẵn trực tiếp trên trang web của Puppet và được cấp phép theo hệ thống Apache 2.0.
- Puppet EnterprisePhiên bản thương mại cung cấp các tính năng như báo cáo tuân thủ, điều phối, kiểm soát truy cập dựa trên vai trò, giao diện người dùng đồ họa (GUI), giao diện lập trình ứng dụng (API) và các công cụ dòng lệnh để quản lý hiệu quả các nút.
Con rối có thể làm gì?
Ví dụ, giả sử bạn có một hệ thống cơ sở hạ tầng với khoảng 100 máy chủ. Là một quản trị viên hệ thống, nhiệm vụ của bạn là đảm bảo tất cả các máy chủ này luôn được cập nhật và hoạt động đầy đủ chức năng.

Để làm điều này, bạn có thể sử dụng Puppet, một công cụ cho phép bạn viết mã đơn giản và tự động triển khai trên các máy chủ này. Điều này giúp giảm thiểu công sức của con người và làm cho quá trình phát triển nhanh chóng và hiệu quả.

Puppet thực hiện các chức năng sau:
- Con rối cho phép bạn xác định cấu hình riêng biệt cho mọi máy chủ.
- Công cụ này cho phép bạn liên tục giám sát máy chủ để xác nhận xem cấu hình cần thiết có tồn tại và không bị thay đổi hay không. Nếu cấu hình bị thay đổi, Puppet sẽ khôi phục lại cấu hình được xác định trước trên máy chủ.
- Nó cũng cung cấp khả năng kiểm soát mọi hệ thống đã được cấu hình, do đó, mọi thay đổi tập trung sẽ tự động được thực hiện ở mọi nơi.
- Nó cũng được sử dụng như một công cụ triển khai, vì nó tự động triển khai phần mềm vào hệ thống. Nó thực hiện... Cơ sở hạ tầng dưới dạng mã, bởi vì các chính sách và cấu hình được viết dưới dạng mã.
DSL rối và các mô hình lập trình
Trước khi tìm hiểu về Puppet DSL, chúng ta hãy cùng hiểu về các mô hình lập trình. Mô hình lập trình là một phong cách mà bạn sử dụng trong lập trình máy tính.
Bốn loại mô hình là:
- Mệnh lệnh.
- Tuyên bố.
- Ngôn ngữ lập trình chức năng (được coi là một tập hợp con của ngôn ngữ lập trình khai báo).
- Hướng đối tượng.
Chúng ta sẽ tập trung vào các mô hình mệnh lệnh và tường thuật.
Mô hình bắt buộc
Mô hình lập trình này thể hiện logic của một phép tính (cần làm gì) và cũng mô tả luồng điều khiển của nó (làm thế nào để thực hiện).
Ví dụ:
Giả sử bạn đang đi đến văn phòng. Bạn đặt một chiếc taxi và bắt đầu hướng dẫn tài xế từng bước một cho đến khi đến văn phòng. Việc chỉ rõ phải làm gì và làm như thế nào là một phong cách lập luận mệnh lệnh.
Mô hình khai báo
Mô hình lập trình này thể hiện logic của một phép tính (cần làm gì) mà không mô tả luồng điều khiển của nó (làm thế nào để thực hiện).
Ví dụ:
Giả sử bạn đang đi đến văn phòng. Bạn đặt một chiếc xe Uber và chỉ định điểm đến cuối cùng (văn phòng). Việc chỉ định những việc cần làm, nhưng không chỉ định cách thức thực hiện, là một kiểu lập trình khai báo.
| Paradigm | Phải làm gì | Làm thế nào để làm |
|---|---|---|
| Bắt buộc | Có | Có |
| Khai báo | Có | Không |
Con rối sử dụng mô hình lập trình khai báo
Con rối sử dụng phương pháp lập trình khai báo.
Ví dụ: Tạo tài khoản người dùng trên hệ thống.
Việc này có thể được thực hiện bằng cách sử dụng mô hình lập trình mệnh lệnh với một tập lệnh shell. Ở đây, chúng ta chỉ định cách tạo người dùng và các lệnh cần sử dụng trên đó. hệ điều hành.
Tuy nhiên, điều này cũng có thể được thực hiện bằng cách sử dụng mô hình lập trình khai báo chỉ với một vài dòng mã Puppet và ngôn ngữ chuyên dụng của Puppet (DSL), và vẫn đạt được kết quả tương tự.
Mô hình triển khai các công cụ quản lý cấu hình
Có hai mô hình triển khai cho công cụ quản lý cấu hình:
- Mô hình triển khai dựa trên đẩy: được khởi tạo bởi nút chính.
- Mô hình triển khai dựa trên kéo: do các tác nhân khởi xướng.
Mô hình triển khai dựa trên đẩy
Trong mô hình triển khai này, máy chủ chính sẽ đẩy cấu hình và phần mềm đến các máy khách riêng lẻ. Sau khi xác minh kết nối an toàn, máy chủ chính sẽ chạy các lệnh từ xa trên các máy khách. Ví dụ: Có khả năng và đống muối.
Mô hình triển khai dựa trên kéo
Trong mô hình triển khai này, các máy chủ riêng lẻ liên hệ với máy chủ chính, xác minh và thiết lập kết nối an toàn, tải xuống cấu hình và phần mềm của chúng, sau đó tự cấu hình cho phù hợp — ví dụ: Puppet và... Chef.
Con rối hoạt động như thế nào?
Puppet dựa trên mô hình triển khai kéo, trong đó các nút tác nhân kiểm tra định kỳ — sau mỗi 1800 vài giây — với nút chính để kiểm tra xem có cần cập nhật gì trên tác nhân hay không. Nếu cần cập nhật, tác nhân sẽ tải mã Puppet cần thiết từ nút chính và thực hiện các hành động cần thiết.
Chúng ta hãy minh họa điều này bằng một ví dụ về thiết lập hệ thống chủ-đại lý.
The Master
Đây là một máy ảo chạy hệ điều hành Linux, đã được cài đặt phần mềm Puppet master. Nó chịu trách nhiệm duy trì các cấu hình dưới dạng mã Puppet. Máy chủ master chỉ có thể là Linux.
các đại lý
Đây là các máy mục tiêu được quản lý bởi Puppet, với phần mềm Puppet agent đã được cài đặt trên chúng.
Phần mềm agent có thể được cấu hình trên bất kỳ hệ điều hành nào được hỗ trợ, chẳng hạn như Linux. Windows, Solarishoặc Mac OS.
Việc liên lạc giữa máy chủ chính và máy khách được thiết lập thông qua các chứng chỉ bảo mật.

Giao tiếp giữa Master và Agent
Bước 1) Sau khi thiết lập kết nối giữa tác nhân và máy chủ chính, tác nhân Puppet sẽ gửi dữ liệu về trạng thái của nó đến máy chủ chính Puppet. Những dữ liệu này được gọi là Facts, và thông tin này bao gồm tên máy chủ, chi tiết nhân hệ điều hành, địa chỉ IP, chi tiết tên tệp, v.v.

Bước 2) Máy chủ Puppet sử dụng dữ liệu này và biên soạn một danh sách các cấu hình cần áp dụng cho tác nhân. Danh sách cấu hình cần thực hiện trên một tác nhân được gọi là danh sách cấu hình (configuration). Danh mục hàngNó có thể bao gồm cài đặt gói phần mềm, nâng cấp hoặc gỡ bỏ, tạo hệ thống tập tin, tạo hoặc xóa người dùng, khởi động lại máy chủ, thay đổi cấu hình IP, v.v.
Bước 3) Tác nhân sử dụng danh sách cấu hình này để áp dụng mọi thay đổi cấu hình cần thiết trên nút.
Nếu không có sự thay đổi nào trong cấu hình, tác nhân sẽ không thực hiện bất kỳ thay đổi cấu hình nào và để nút tiếp tục hoạt động với cấu hình tương tự.

Bước 4) Sau khi hoàn tất, nút này sẽ báo cáo lại cho máy chủ Puppet, cho biết cấu hình đã được áp dụng và hoàn thành.
Khối rối
Puppet cung cấp tính linh hoạt để tích hợp các báo cáo với các công cụ của bên thứ ba bằng cách sử dụng API của Puppet.
Bốn loại khối xây dựng rối là:
- Trung Tâm Tài Liệu
- Các lớp học
- Tệp kê khai
- Modules
Tài nguyên con rối
Các tài nguyên của Puppet là những khối xây dựng cơ bản của Puppet.
Tài nguyên là chức năng sẵn có Chúng chạy ở phía máy chủ để thực hiện các thao tác cần thiết trong Puppet.
Lớp múa rối
Sự kết hợp của nhiều nguồn lực khác nhau có thể được nhóm lại thành một đơn vị duy nhất gọi là lớp học.
Bản kê khai con rối
Tệp manifest là một thư mục chứa các tệp DSL của Puppet. Các tệp này có phần mở rộng .pp, viết tắt của Puppet program (chương trình Puppet). Mã Puppet bao gồm các định nghĩa hoặc khai báo của các lớp Puppet.
Mô-đun con rối
Module là tập hợp các tệp và thư mục, chẳng hạn như các tệp cấu hình và định nghĩa lớp. Chúng là các đơn vị có thể tái sử dụng và chia sẻ trong Puppet.
Ví dụ, các MySQL mô-đun cài đặt và cấu hình MySQL, và Jenkins mô-đun quản lý Jenkins.

Các loại tài nguyên con rối
Nhìn chung, một hệ thống bao gồm các tập tin, người dùng, dịch vụ, quy trình, gói phần mềm, v.v. Trong Puppet, chúng được gọi là tài nguyên, và chúng là các khối xây dựng cơ bản của Puppet.
Tất cả các thao tác trên các agent Puppet đều được thực hiện với sự hỗ trợ của các tài nguyên Puppet.
Các tài nguyên Puppet là những công cụ có sẵn được sử dụng để thực hiện nhiều tác vụ và thao tác khác nhau trên bất kỳ nền tảng nào được hỗ trợ. Chúng ta có thể sử dụng một tài nguyên Puppet duy nhất để thực hiện một tác vụ cụ thể, hoặc chúng ta có thể sử dụng nhiều tài nguyên Puppet cùng nhau để thực hiện triển khai cấu hình ứng dụng phức tạp.
Tài nguyên có thể có nhiều loại khác nhau. Công dụng của con rối tài nguyên và các loại tài nguyên để mô tả cấu hình của hệ thống.
Có ba loại loại tài nguyên:
- Lõi con rối hoặc các loại tài nguyên tích hợp.
- Các loại tài nguyên được xác định bằng con rối.
- Các loại tài nguyên tùy chỉnh rối.
Lõi con rối hoặc các loại tài nguyên tích hợp
Các loại tài nguyên cốt lõi hoặc tích hợp sẵn là các loại tài nguyên Puppet được xây dựng sẵn và đi kèm với phần mềm Puppet. Tất cả các loại tài nguyên cốt lõi hoặc tích hợp sẵn của Puppet đều do nhóm Puppet viết và duy trì.
Các loại tài nguyên được xác định rối
Các kiểu tài nguyên được định nghĩa là các kiểu tài nguyên đơn giản được viết bằng ngôn ngữ khai báo của Puppet, sử dụng sự kết hợp của các kiểu tài nguyên hiện có.
Các loại tài nguyên tùy chỉnh con rối
Các loại tài nguyên tùy chỉnh là các loại tài nguyên được tùy chỉnh hoàn toàn được viết bằng Ruby.
Chúng ta hãy cùng tìm hiểu sâu hơn về các loại tài nguyên của Puppet.
Trong cửa sổ dòng lệnh, hãy nhập lệnh sau để hiển thị danh sách các lệnh con liên quan đến Puppet:
Puppet --help
Trong trường hợp của chúng tôi, chúng tôi quan tâm đến lệnh phụ “tài nguyên“, mà chúng ta sẽ sử dụng để tìm thông tin về các loại tài nguyên Puppet tích hợp sẵn.
Trong terminal, nhập bất kỳ lệnh nào sau đây để hiển thị danh sách hành động liên quan đến lệnh phụ Puppet “tài nguyên":
Puppet help resource Puppet resource --help
Trong trường hợp này, chúng tôi có tài nguyên với tư cách là lệnh phụ và –loại như hành động.
Puppet có sẵn 49 loại tài nguyên cốt lõi.
Trong cửa sổ dòng lệnh, hãy nhập lệnh sau để hiển thị danh sách các loại tài nguyên Puppet tích hợp sẵn:
puppet resource –types
Mỗi loại hỗ trợ một danh sách thuộc tính. Các thuộc tính này cung cấp mô tả chi tiết mà Puppet sử dụng để quản lý tài nguyên.
Để tìm hiểu tất cả các thuộc tính liên quan đến một loại tài nguyên Puppet, hãy sử dụng lệnh sau:
puppet describe <resource type name>
Các tham số sẽ liệt kê tất cả các thuộc tính có sẵn cho loại tài nguyên đó.
gói mô tả con rối
Người mới sẽ khó hiểu và liên hệ được nhiều tệp mã Puppet chưa được quản lý. Đây là lúc chúng ta cần một số nhóm hỗ trợ.ping Để liên kết các thao tác lại với nhau. Mục tiêu là giải quyết một vấn đề duy nhất, chẳng hạn như tất cả các thao tác cần thiết để cấu hình SSH trên máy chủ, dịch vụ NTP, hoặc một máy chủ web hoặc máy chủ cơ sở dữ liệu hoàn chỉnh từ đầu.
Lớp múa rối là gì?
Các lớp học Puppet là tập hợp các tài nguyên Puppet được đóng gói lại thành một đơn vị duy nhất.
Puppet giới thiệu các lớp để làm cho cấu trúc có thể tái sử dụng và có tổ chức.
Đầu tiên, chúng ta cần định nghĩa một lớp bằng cách sử dụng cú pháp định nghĩa lớp. Các lớp phải là duy nhất và chỉ có thể được khai báo một lần với cùng tên:
class <class-name> {
<Resource declarations>
}
Ví dụ:
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
Cho đến nay, chúng ta mới chỉ định nghĩa lớp; chúng ta chưa sử dụng nó ở bất cứ đâu. Điều này có nghĩa là đoạn mã chúng ta đã viết sẽ không bao giờ được thực thi trừ khi chúng ta khai báo lớp này ở nơi khác.
Khai báo lớp
Để sử dụng một lớp đã được định nghĩa trong mã của bạn, hãy sử dụng phương thức sau: bao gồm từ khóa.
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
include ntpconfig
Chúng ta hãy cùng tìm hiểu điều này thông qua một tình huống thực tế.
Demo cài đặt NTP
Trước tiên, hãy đảm bảo rằng gói NTP đã có sẵn trên máy chủ. Lệnh sau sẽ không trả về kết quả gì nếu gói NTP không có trên máy chủ:
rpm -qa | grep -i ntp
Như chúng ta thấy, gói NTP đã có sẵn trên máy chủ. Bây giờ, hãy gỡ bỏ gói NTP hiện có:
yum remove ntp
Sau khi gỡ bỏ gói phần mềm, hãy đảm bảo rằng tệp ntp.conf không còn tồn tại nữa:
ls -lrt /etc/ntp.conf
Hãy kiểm tra xem dịch vụ NTP có tồn tại hay không bằng cách chạy lệnh sau:
systemctl status ntp
Tạo một tệp .pp mới để lưu mã. Từ dòng lệnh:
vi demontp.pp
Chuyển sang chế độ chèn bằng cách nhấn phím i trên bàn phím.
Nhập mã sau để tạo một tệp mới:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
Sau khi chỉnh sửa xong, hãy nhấn phím Esc.
Để lưu file nhấn :wq!
Bước tiếp theo là kiểm tra mã có lỗi cú pháp nào không. Thực hiện lệnh sau:
puppet parser validate demontp.pp
Hãy đảm bảo rằng bạn đã chuyển sang chế độ nguồn gốc Người dùng có thể hoàn thành bài kiểm tra mà không gặp lỗi nào bằng cách thực hiện lệnh:
su root
Thử nghiệm là bước tiếp theo trong quá trình tạo mã. Thực hiện lệnh sau để thực hiện kiểm tra khói:
Puppet applies demontp.pp --noop
Bước cuối cùng là chạy Khởi động Puppet ở chế độ thực và kiểm tra kết quả đầu ra.
puppet apply demontp.pp
Puppet không thực hiện bất cứ điều gì vì lớp học demo chỉ là... xác định nhưng không tuyên bố.
Vì vậy, cho đến khi bạn khai báo lớp Puppet, mã sẽ không được áp dụng.
Hãy để chúng tôi khai lớp demo bên trong cùng một mã bằng cách sử dụng bao gồm tên lớp ở cuối mã:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
# Class Declaration
include ntpconfig
Lần nữa, kiểm tra mã có lỗi cú pháp nào không. Thực hiện lệnh sau:
puppet parser validate demontp.pp
Hãy đảm bảo rằng bạn đã chuyển sang chế độ nguồn gốc Người dùng có thể hoàn thành bài kiểm tra mà không gặp lỗi nào bằng cách thực hiện lệnh:
su root
Kiểm tra là bước tiếp theo trong quá trình tạo mã. Thực hiện lệnh sau để thực hiện kiểm tra khói:
Puppet apply demontp.pp --noop
Bước cuối cùng là chạy Khởi động Puppet ở chế độ thực và kiểm tra kết quả đầu ra.
puppet apply demontp.pp
Lần này, đoạn mã được áp dụng vì lớp đã được định nghĩa và khai báo.
Hãy đảm bảo rằng tệp ntp.conf đã tồn tại:
ls -lrt /etc/ntp.conf
Hãy kiểm tra xem dịch vụ NTP đã được khởi động hay chưa bằng cách chạy lệnh sau:
systemctl status ntpd











