Con rối - Hướng dẫn nhanh
Puppet là một công cụ quản lý cấu hình do Puppet Labs phát triển để tự động hóa việc quản lý và cấu hình cơ sở hạ tầng. Con rối là một công cụ rất mạnh giúp tạo ra khái niệm Cơ sở hạ tầng dưới dạng mã. Công cụ này được viết bằng ngôn ngữ Ruby DSL giúp chuyển đổi cơ sở hạ tầng hoàn chỉnh ở định dạng mã, có thể dễ dàng quản lý và cấu hình.
Con rối tuân theo mô hình máy khách-máy chủ, trong đó một máy trong bất kỳ cụm nào hoạt động như máy chủ, được gọi là máy chủ con rối và máy kia hoạt động như một máy khách được gọi là máy chủ trên các nút. Puppet có khả năng quản lý bất kỳ hệ thống nào từ đầu, bắt đầu từ cấu hình ban đầu cho đến khi kết thúc vòng đời của bất kỳ máy cụ thể nào.
Đặc điểm của hệ thống con rối
Sau đây là những tính năng quan trọng nhất của Puppet.
Lý tưởng
Con rối hỗ trợ Idempotency làm cho nó trở nên độc đáo. Tương tự như Chef, trong Puppet, người ta có thể chạy một cách an toàn cùng một bộ cấu hình nhiều lần trên cùng một máy. Trong luồng này, Puppet kiểm tra trạng thái hiện tại của máy mục tiêu và sẽ chỉ thực hiện thay đổi khi có bất kỳ thay đổi cụ thể nào trong cấu hình.
Idempotency giúp quản lý bất kỳ máy cụ thể nào trong suốt vòng đời của nó, bắt đầu từ khi tạo ra máy, thay đổi cấu hình trong máy, cho đến cuối vòng đời. Tính năng Puppet Idempotency rất hữu ích trong việc giữ cho máy được cập nhật trong nhiều năm thay vì xây dựng lại cùng một máy nhiều lần, khi có bất kỳ thay đổi cấu hình nào.
Đa nền tảng
Trong Puppet, với sự trợ giúp của Lớp trừu tượng tài nguyên (RAL) sử dụng tài nguyên Con rối, người ta có thể nhắm mục tiêu cấu hình hệ thống được chỉ định mà không cần lo lắng về chi tiết triển khai và cách lệnh cấu hình sẽ hoạt động bên trong hệ thống, được xác định trong cấu hình bên dưới tập tin.
Con rối - Quy trình làm việc
Con rối sử dụng quy trình làm việc sau để áp dụng cấu hình trên hệ thống.
Trong Puppet, điều đầu tiên mà bậc thầy Puppet làm là thu thập các thông tin chi tiết của máy mục tiêu. Sử dụng hệ số có trên tất cả các nút Con rối (tương tự như Ohai trong Chef), nó sẽ nhận được tất cả các chi tiết cấu hình cấp độ máy. Những thông tin chi tiết này được thu thập và gửi lại cho Puppet master.
Sau đó, bậc thầy con rối so sánh cấu hình được truy xuất với các chi tiết cấu hình đã xác định, và với cấu hình đã xác định, nó tạo một danh mục và gửi nó đến các tác nhân Con rối được nhắm mục tiêu.
Sau đó, tác nhân Con rối áp dụng các cấu hình đó để đưa hệ thống vào trạng thái mong muốn.
Cuối cùng, khi một nút đích ở trạng thái mong muốn, nó sẽ gửi một báo cáo trở lại Puppet master, điều này giúp cho Puppet master hiểu được trạng thái hiện tại của hệ thống, như được xác định trong danh mục.
Con rối - Thành phần chính
Sau đây là các thành phần chính của Puppet.
Tài nguyên con rối
Tài nguyên con rối là thành phần chính để tạo mô hình cho bất kỳ máy cụ thể nào. Các tài nguyên này có mô hình triển khai riêng. Con rối sử dụng cùng một mô hình để có được bất kỳ tài nguyên cụ thể nào ở trạng thái mong muốn.
Nhà cung cấp
Các nhà cung cấp về cơ bản là những người cung cấp dịch vụ cho bất kỳ tài nguyên cụ thể nào được sử dụng trong Puppet. Ví dụ: loại gói 'apt-get' và 'yum' đều hợp lệ để quản lý gói. Đôi khi, nhiều hơn một nhà cung cấp sẽ có sẵn trên một nền tảng cụ thể. Mặc dù mỗi nền tảng luôn có một nhà cung cấp mặc định.
Rõ ràng
Manifest là một tập hợp các tài nguyên được kết hợp bên trong hàm hoặc các lớp để cấu hình bất kỳ hệ thống đích nào. Chúng chứa một bộ mã Ruby để cấu hình hệ thống.
Mô-đun
Mô-đun là khối xây dựng chính của Puppet, có thể được định nghĩa là một tập hợp các tài nguyên, tệp, mẫu, v.v. Chúng có thể dễ dàng phân phối giữa các loại HĐH khác nhau được xác định rằng chúng có cùng hương vị. Vì chúng có thể được phân phối dễ dàng, một mô-đun có thể được sử dụng nhiều lần với cùng một cấu hình.
Mẫu
Các mẫu sử dụng các biểu thức Ruby để xác định nội dung tùy chỉnh và đầu vào biến. Chúng được sử dụng để phát triển nội dung tùy chỉnh. Các mẫu được xác định trong tệp kê khai và được sao chép vào một vị trí trên hệ thống. Ví dụ: nếu một người muốn xác định httpd với một cổng có thể tùy chỉnh, thì có thể thực hiện nó bằng cách sử dụng biểu thức sau.
Listen <% = @httpd_port %>
Biến httpd_port trong trường hợp này được xác định trong tệp kê khai tham chiếu đến mẫu này.
Tệp tĩnh
Tệp tĩnh có thể được định nghĩa là một tệp chung đôi khi được yêu cầu để thực hiện các tác vụ cụ thể. Chúng có thể được sao chép đơn giản từ vị trí này sang vị trí khác bằng Puppet. Tất cả các tệp tĩnh đều nằm trong thư mục tệp của bất kỳ mô-đun nào. Mọi thao tác với tệp trong tệp kê khai đều được thực hiện bằng cách sử dụng tài nguyên tệp.
Sau đây là biểu diễn sơ đồ của kiến trúc Con rối.
Múa rối
Puppet Master là cơ chế chính xử lý tất cả các nội dung liên quan đến cấu hình. Nó áp dụng cấu hình cho các nút bằng tác nhân Con rối.
Tác nhân con rối
Đại lý con rối là những cỗ máy làm việc thực tế được quản lý bởi bậc thầy Con rối. Họ có dịch vụ daemon tác nhân Con rối đang chạy bên trong chúng.
Kho lưu trữ cấu hình
Đây là repo nơi tất cả các nút và cấu hình liên quan đến máy chủ được lưu và kéo khi được yêu cầu.
Sự thật
Factslà các chi tiết liên quan đến nút hoặc máy chủ, về cơ bản được sử dụng để phân tích trạng thái hiện tại của bất kỳ nút nào. Trên cơ sở các dữ kiện, các thay đổi được thực hiện trên bất kỳ máy mục tiêu nào. Có các dữ kiện tùy chỉnh và được xác định trước trong Puppet.
Mục lục
Tất cả các tệp kê khai hoặc cấu hình được viết trong Puppet trước tiên được chuyển đổi sang định dạng đã biên dịch được gọi là danh mục và sau đó các danh mục đó được áp dụng trên máy đích.
Con rối hoạt động trên kiến trúc máy chủ khách, trong đó chúng tôi gọi máy chủ là con Con rối và máy khách là nút Con rối. Thiết lập này đạt được bằng cách cài đặt Puppet trên cả máy khách và trên tất cả các máy chủ.
Đối với hầu hết các nền tảng, Puppet có thể được cài đặt thông qua trình quản lý gói mà bạn lựa chọn. Tuy nhiên, đối với một số nền tảng, nó có thể được thực hiện bằng cách cài đặttarball hoặc là RubyGems.
Điều kiện tiên quyết
Yếu tố là điều kiện tiên quyết duy nhất không đi kèm với Ohai có mặt trong Chef.
Thư viện hệ điều hành tiêu chuẩn
Chúng ta cần có bộ thư viện tiêu chuẩn của bất kỳ hệ điều hành cơ bản nào. Còn lại tất cả hệ thống đi kèm với các phiên bản Ruby 1.8.2 +. Sau đây là danh sách các mục thư viện, mà một hệ điều hành nên bao gồm.
- base64
- cgi
- digest/md5
- etc
- fileutils
- ipaddr
- openssl
- strscan
- syslog
- uri
- webrick
- webrick/https
- xmlrpc
Cài đặt yếu tố
Như đã thảo luận, facterkhông đi kèm với phiên bản tiêu chuẩn của Ruby. Vì vậy, để có được facter trong hệ thống đích, người ta cần cài đặt nó theo cách thủ công từ nguồn vì thư viện facter là điều kiện tiên quyết của Puppet.
Gói này có sẵn cho nhiều nền tảng nhưng chỉ để an toàn hơn, nó có thể được cài đặt bằng cách sử dụng tarball, giúp tải phiên bản mới nhất.
Đầu tiên, tải xuống tarball từ trang web chính thức của Puppet bằng cách sử dụng wget tiện ích.
$ wget http://puppetlabs.com/downloads/facter/facter-latest.tgz ------: 1
Tiếp theo, giải nén tệp tar. Vào bên trong thư mục chưa được chia sẻ bằng lệnh CD. Cuối cùng, cài đặt facter bằnginstall.rb tệp hiện tại bên trong facter danh mục.
$ gzip -d -c facter-latest.tgz | tar xf - -----: 2
$ cd facter-* ------: 3 $ sudo ruby install.rb # or become root and run install.rb -----:4
Cài đặt con rối từ nguồn
Trước tiên, hãy cài đặt tarball Con rối từ trang Con rối bằng cách sử dụng wget. Sau đó, giải nén tarball đến một vị trí mục tiêu. Di chuyển bên trong thư mục đã tạo bằng cách sử dụngCDchỉ huy. Sử dụnginstall.rb tập tin, cài đặt Con rối trên máy chủ bên dưới.
# get the latest tarball
$ wget http://puppetlabs.com/downloads/puppet/puppet-latest.tgz -----: 1 # untar and install it $ gzip -d -c puppet-latest.tgz | tar xf - ----: 2
$ cd puppet-* ------: 3 $ sudo ruby install.rb # or become root and run install.rb -------: 4
Cài đặt con rối và yếu tố bằng Ruby Gem
# Installing Facter
$ wget http://puppetlabs.com/downloads/gems/facter-1.5.7.gem $ sudo gem install facter-1.5.7.gem
# Installing Puppet
$ wget http://puppetlabs.com/downloads/gems/puppet-0.25.1.gem $ sudo gem install puppet-0.25.1.gem
Khi chúng ta đã cài đặt Puppet trên hệ thống, bước tiếp theo là cấu hình nó để thực hiện các hoạt động ban đầu nhất định.
Mở cổng tường lửa trên máy
Để làm cho máy chủ Con rối quản lý máy chủ của khách hàng một cách tập trung, người ta cần mở một cổng được chỉ định trên tất cả các máy, tức là 8140có thể được sử dụng nếu nó không được sử dụng trong bất kỳ máy nào mà chúng tôi đang cố gắng cấu hình. Chúng ta cần kích hoạt cả giao tiếp TCP và UDP trên tất cả các máy.
Tập tin cấu hình
Tệp cấu hình chính cho Puppet là etc/puppet/puppet.conf. Tất cả các tệp cấu hình được tạo trong một cấu hình dựa trên gói của Puppet. Hầu hết cấu hình được yêu cầu để định cấu hình Con rối được giữ trong các tệp này và khi quá trình chạy Con rối diễn ra, nó sẽ tự động chọn các cấu hình đó. Tuy nhiên, đối với một số tác vụ cụ thể như định cấu hình máy chủ web hoặc Tổ chức phát hành chứng chỉ bên ngoài (CA), Puppet có cấu hình riêng cho các tệp và cài đặt.
Các tệp cấu hình máy chủ được đặt tại conf.dthư mục còn được gọi là Puppet master. Các tệp này theo mặc định nằm trong/etc/puppetlabs/puppetserver/conf.dcon đường. Các tệp cấu hình này ở định dạng HOCON, giữ cấu trúc cơ bản của JSON nhưng nó dễ đọc hơn. Khi quá trình khởi động Puppet diễn ra, nó sẽ chọn tất cả các tệp .cong từ thư mục conf.d và sử dụng chúng để thực hiện bất kỳ thay đổi cấu hình nào. Mọi thay đổi trong các tệp này chỉ diễn ra khi máy chủ được khởi động lại.
Tệp liệt kê và tệp cài đặt
- global.conf
- webserver.conf
- web-routes.conf
- puppetserver.conf
- auth.conf
- master.conf (không dùng nữa)
- ca.conf (không dùng nữa)
Có các tệp cấu hình khác nhau trong Puppet dành riêng cho từng thành phần trong Puppet.
Puppet.conf
Tệp Puppet.conf là tệp cấu hình chính của Puppet. Puppet sử dụng cùng một tệp cấu hình để định cấu hình tất cả các lệnh và dịch vụ Puppet được yêu cầu. Tất cả các cài đặt liên quan đến Con rối như định nghĩa về con rối, tác nhân con rối, áp dụng con rối và chứng chỉ đều được xác định trong tệp này. Con rối có thể giới thiệu chúng theo yêu cầu.
Tệp cấu hình tương tự như tệp ini tiêu chuẩn, trong đó cài đặt có thể đi vào phần ứng dụng cụ thể của phần chính.
Phần cấu hình chính
[main]
certname = Test1.vipin.com
server = TestingSrv
environment = production
runinterval = 1h
Tệp cấu hình chính của con rối
[main]
certname = puppetmaster.vipin.com
server = MasterSrv
environment = production
runinterval = 1h
strict_variables = true
[master]
dns_alt_names = MasterSrv,brcleprod01.vipin.com,puppet,puppet.test.com
reports = puppetdb
storeconfigs_backend = puppetdb
storeconfigs = true
environment_timeout = unlimited
Tổng quan chi tiết
Trong cấu hình Con rối, tệp sẽ được sử dụng có nhiều phần cấu hình trong đó mỗi phần có nhiều loại cài đặt khác nhau.
Phần cấu hình
Tệp cấu hình con rối chủ yếu bao gồm các phần cấu hình sau.
Main- Đây được gọi là phần chung được sử dụng bởi tất cả các lệnh và dịch vụ trong Puppet. Một định nghĩa các giá trị mặc định trong phần chính có thể được ghi đè bởi bất kỳ phần nào có trong tệp rối.conf.
Master - Phần này được tham chiếu bởi Puppet master service và Puppet cert.
Agent - Phần này được giới thiệu bởi dịch vụ đại lý Con rối.
User - Nó chủ yếu được sử dụng bởi lệnh Puppet apply cũng như nhiều lệnh ít phổ biến hơn.
[main]
certname = PuppetTestmaster1.example.com
Các thành phần chính của tệp cấu hình
Sau đây là các thành phần chính của tệp cấu hình.
Dòng bình luận
Trong Con rối, bất kỳ dòng nhận xét nào đều bắt đầu bằng (#) ký tên. Điều này có thể có ý định với bất kỳ lượng không gian nào. Chúng tôi có thể có một phần bình luận cũng như trong cùng một dòng.
# This is a comment.
Testing = true #this is also a comment in same line
Dòng cài đặt
Dòng cài đặt phải bao gồm -
- Bất kỳ khoảng trống nào ở đầu (tùy chọn)
- Tên của cài đặt
- Dấu bằng = to, có thể được bao quanh bởi bất kỳ số khoảng trắng nào
- Một giá trị cho cài đặt
Đặt biến
Trong hầu hết các trường hợp, giá trị của cài đặt sẽ là một từ duy nhất nhưng trong một số trường hợp đặc biệt, sẽ có ít giá trị đặc biệt.
Đường dẫn
Trong cài đặt tệp cấu hình, hãy lấy một danh sách các thư mục. Trong khi xác định các thư mục này, cần lưu ý rằng chúng phải được phân tách bằng ký tự phân cách đường dẫn hệ thống, là (:) trong nền tảng * nix và dấu chấm phẩy (;) trên Windows.
# *nix version:
environmentpath = $codedir/special_environments:$codedir/environments
# Windows version:
environmentpath = $codedir/environments;C:\ProgramData\PuppetLabs\code\environment
Trong định nghĩa, thư mục tệp được liệt kê đầu tiên sẽ được quét và sau đó chuyển sang thư mục khác trong danh sách, nếu nó không tìm thấy.
Tệp và Thư mục
Tất cả các cài đặt lấy một tệp hoặc thư mục có thể chấp nhận quyền băm tùy chọn. Khi máy chủ khởi động, Puppet sẽ thực thi các tệp hoặc thư mục đó trong danh sách.
ssldir = $vardir/ssl {owner = service, mode = 0771}
Trong đoạn mã trên, hàm băm được phép là chủ sở hữu, nhóm và chế độ. Chỉ có hai giá trị hợp lệ của khóa chủ sở hữu và khóa nhóm.
Trong Puppet, tất cả các môi trường đều có environment.conftập tin. Tệp này có thể ghi đè một số cài đặt mặc định bất cứ khi nào cái chính đang phục vụ bất kỳ nút nào hoặc tất cả các nút được gán cho môi trường cụ thể đó.
Vị trí
Trong Puppet, đối với tất cả các môi trường đã được xác định, tệp môi trường.conf được đặt ở cấp cao nhất của môi trường chính của nó, bên cạnh tệp kê khai và các giám đốc mô-đun. Xem xét một ví dụ, nếu môi trường của bạn nằm trong các thư mục mặc định(Vipin/testing/environment), thì tệp cấu hình của môi trường thử nghiệm được đặt tại Vipin/testing/environments/test/environment.conf.
Thí dụ
# /etc/testingdir/code/environments/test/environment.conf
# Puppet Enterprise requires $basemodulepath; see note below under modulepath". modulepath = site:dist:modules:$basemodulepath
# Use our custom script to get a git commit for the current state of the code:
config_version = get_environment_commit.sh
định dạng
Tất cả các tệp cấu hình trong Puppet đều sử dụng cùng một định dạng giống INI theo cùng một cách. environment.conftệp theo cùng một định dạng giống INI như những người khác làm như tệp rối.conf. Sự khác biệt duy nhất giữa môi trường.conf vàpuppet.conflà tệp môi trường.conf không thể chứa phần [chính]. Tất cả cài đặt trong tệp môi trường.conf phải nằm ngoài bất kỳ phần cấu hình nào.
Đường dẫn tương đối trong giá trị
Hầu hết các cài đặt được phép chấp nhận đường dẫn tệp hoặc danh sách đường dẫn làm giá trị. Nếu bất kỳ đường dẫn nào là đường dẫn có liên quan, chúng bắt đầu mà không có dấu gạch chéo ở đầu hoặc ký tự ổ đĩa - chúng chủ yếu sẽ được giải quyết liên quan đến thư mục chính của môi trường đó.
Nội suy giá trị
Tệp cài đặt Environment.conf có thể sử dụng các giá trị của các cài đặt khác làm biến. Có nhiều biến hữu ích có thể được nội suy vào tệp môi trường.conf. Dưới đây là danh sách một số biến quan trọng -
$basemodulepath- Hữu ích để đưa các thư mục vào cài đặt đường dẫn mô-đun. Người dùng doanh nghiệp con rối thường nên bao gồm giá trị này làmodulepath vì công cụ Con rối sử dụng mô-đun trong basemodulepath.
$environment- Hữu ích như một đối số dòng lệnh cho tập lệnh config_version của bạn. Bạn chỉ có thể nội suy biến này trong cài đặt config_version.
$codedir - Hữu ích cho việc định vị các tập tin.
Cài đặt được phép
Theo mặc định, tệp Puppet environment.conf chỉ được phép ghi đè bốn cài đặt trong cấu hình như được liệt kê.
- Modulepath
- Manifest
- Config_version
- Environment_timeout
Đường dẫn mô-đun
Đây là một trong những cài đặt quan trọng trong tệp môi trường.conf. Tất cả các giám đốc được xác định trong modulepath được tải theo mặc định bởi Puppet. Đây là vị trí đường dẫn từ nơi Puppet tải các mô-đun của nó. Người ta cần thiết lập điều này một cách rõ ràng. Nếu cài đặt trên không được đặt, đường dẫn mô-đun mặc định của bất kỳ môi trường nào trong Con rối sẽ là:
<MODULES DIRECTORY FROM ENVIRONMENT>:$basemodulepath
Rõ ràng
Điều này được sử dụng để xác định tệp kê khai chính, mà Puppet master sẽ sử dụng trong khi khởi động và biên dịch danh mục ra khỏi tệp kê khai đã xác định sẽ được sử dụng để định cấu hình môi trường. Trong điều này, chúng ta có thể xác định một tệp, danh sách tệp hoặc thậm chí một thư mục bao gồm nhiều tệp kê khai cần được đánh giá và biên dịch theo một trình tự bảng chữ cái xác định.
Người ta cần xác định rõ ràng cài đặt này trong tệp môi trường.conf. Nếu không, thì Puppet sẽ sử dụng thư mục tệp kê khai mặc định của môi trường làm tệp kê khai chính của nó.
Config_version
Config_version có thể được định nghĩa là một phiên bản xác định được sử dụng để xác định danh mục và sự kiện. Khi Puppet biên dịch bất kỳ tệp kê khai nào theo mặc định, nó sẽ thêm phiên bản cấu hình vào các danh mục đã tạo cũng như vào các báo cáo được tạo khi Puppet master áp dụng bất kỳ danh mục đã xác định nào trên các nút Puppet. Puppet chạy một tập lệnh để thực hiện tất cả các bước trên và sử dụng tất cả đầu ra được tạo dưới dạng Config_version.
Môi trường hết giờ
Nó được sử dụng để lấy thông tin chi tiết về lượng thời gian mà Puppet nên sử dụng để tải dữ liệu cho một môi trường nhất định. Nếu giá trị được xác định trong tệp rối.conf, thì các giá trị này sẽ ghi đè giá trị thời gian chờ mặc định.
Tệp môi trường.conf mẫu
[master]
manifest = $confdir/environments/$environment/manifests/site.pp
modulepath = $confdir/environments/$environment/modules
Trong đoạn mã trên $confdir là đường dẫn của thư mục, nơi chứa các tệp cấu hình môi trường. $environment là tên của môi trường mà cấu hình đang được thực hiện.
Tệp cấu hình môi trường sẵn sàng sản xuất
# The environment configuration file
# The main manifest directory or file where Puppet starts to evaluate code
# This is the default value. Works with just a site.pp file or any other
manifest = manifests/
# The directories added to the module path, looked in first match first used order:
# modules - Directory for external modules, populated by r10k based on Puppetfile
# $basemodulepath - As from: puppet config print basemodulepath modulepath = site:modules:$basemodulepath
# Set the cache timeout for this environment.
# This overrides what is set directly in puppet.conf for the whole Puppet server
# environment_timeout = unlimited
# With caching you need to flush the cache whenever new Puppet code is deployed
# This can also be done manually running: bin/puppet_flush_environment_cache.sh
# To disable catalog caching:
environment_timeout = 0
# Here we pass to one in the control repo the Puppet environment (and git branch)
# to get title and essential info of the last git commit
config_version = 'bin/config_script.sh $environment'
Trong Puppet, kiến trúc máy chủ khách của Puppet master được coi là cơ quan kiểm soát toàn bộ thiết lập. Puppet master hoạt động như một máy chủ trong quá trình thiết lập và kiểm soát tất cả các hoạt động trên tất cả các nút.
Đối với bất kỳ máy chủ nào cần hoạt động như Puppet master, nó phải chạy phần mềm máy chủ Puppet. Phần mềm máy chủ này là thành phần quan trọng kiểm soát tất cả các hoạt động trên các nút. Trong thiết lập này, một điểm chính cần nhớ là có quyền truy cập siêu người dùng vào tất cả các máy mà người đó sẽ sử dụng trong thiết lập. Sau đây là các bước để thiết lập Puppet master.
Điều kiện tiên quyết
Private Network DNS- Chuyển tiếp và quay lại phải được định cấu hình, trong đó mỗi máy chủ phải có một tên máy chủ duy nhất. Nếu một người không có cấu hình DNS, thì người ta có thể sử dụng một mạng riêng để liên lạc với cơ sở hạ tầng.
Firewall Open Port- Puppet master phải được mở trên một cổng cụ thể để nó có thể lắng nghe các yêu cầu đến trên một cổng cụ thể. Chúng ta có thể sử dụng bất kỳ cổng nào được mở trên tường lửa.
Tạo máy chủ chính của con rối
Puppet master mà chúng tôi đang tạo sẽ có trên máy CentOS 7 × 64 sử dụng Puppet làm tên máy chủ. Cấu hình hệ thống tối thiểu để tạo Puppet master là hai lõi CPU và 1GB bộ nhớ. Cấu hình cũng có thể có kích thước lớn hơn tùy thuộc vào số lượng nút mà chúng ta sẽ quản lý với cái này. Trong cơ sở hạ tầng, lớn hơn nó được cấu hình bằng RAM 2 GB.
Tên máy chủ | Vai trò | FQDN riêng |
---|---|---|
Brcleprod001 | Múa rối | bnrcleprod001.brcl.com |
Tiếp theo, người ta cần tạo chứng chỉ SSL chính của Puppet và tên của máy chủ sẽ được sao chép trong tệp cấu hình của tất cả các nút.
Cài đặt NTP
Vì Puppet master là cơ quan trung tâm cho các nút tác nhân trong bất kỳ thiết lập nhất định nào, nên một trong những trách nhiệm chính của Puppet master là duy trì thời gian chính xác của hệ thống để tránh các sự cố cấu hình tiềm ẩn có thể phát sinh khi nó cấp chứng chỉ tác nhân cho các nút.
Nếu vấn đề xung đột thời gian phát sinh, thì chứng chỉ có thể hết hạn nếu có sự khác biệt về thời gian giữa nút chính và nút. Giao thức thời gian mạng là một trong những cơ chế quan trọng để tránh những vấn đề như vậy.
Liệt kê các Múi giờ Có sẵn
$ timedatectl list-timezones
Lệnh trên sẽ cung cấp danh sách toàn bộ các múi giờ khả dụng. Nó sẽ cung cấp các khu vực có sẵn múi giờ.
Lệnh sau có thể được sử dụng để đặt múi giờ cần thiết trên máy.
$ sudo timedatectl set-timezone India/Delhi
Cài đặt NTP trên máy chủ Rối bằng tiện ích yum của máy CentOS.
$ sudo yum -y install ntp
Đồng bộ NTP với thời gian hệ thống mà chúng ta đã đặt trong các lệnh trên.
$ sudo ntpdate pool.ntp.org
Thông thường, chúng tôi sẽ cập nhật cấu hình NTP để sử dụng các nhóm chung có sẵn gần trung tâm dữ liệu máy hơn. Đối với điều này, chúng ta cần chỉnh sửa tệp ntp.conf trong/etc.
$ sudo vi /etc/ntp.conf
Thêm máy chủ thời gian từ múi giờ chung NTP có sẵn. Sau đây là cách tệp ntp.conf trông như thế nào.
brcleprod001.brcl.pool.ntp.org
brcleprod002.brcl.pool.ntp.org
brcleprod003.brcl.pool.ntp.org
brcleprod004.brcl.pool.ntp.org
Lưu cấu hình. Khởi động máy chủ và kích hoạt daemon.
$ sudo systemctl restart ntpd $ sudo systemctl enable ntpd
Thiết lập phần mềm máy chủ con rối
Phần mềm máy chủ con rối là một phần mềm chạy trên máy chủ Con rối. Nó là máy đẩy cấu hình sang các máy khác chạy phần mềm tác nhân Con rối.
Bật kho lưu trữ bộ sưu tập Puppet labs chính thức bằng lệnh sau.
$ sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el7.noarch.rpm
Cài đặt gói puppetserver.
$ sudo yum -y install puppetserver
Định cấu hình phân bổ bộ nhớ trên máy chủ con rối
Như chúng ta đã thảo luận, theo mặc định, máy chủ Con rối được cấu hình trên máy RAM 2GB. Người ta có thể tùy chỉnh thiết lập theo bộ nhớ trống trên máy và máy chủ sẽ quản lý bao nhiêu nút.
Chỉnh sửa cấu hình máy chủ rối ở chế độ vi
$ sudo vi /etc/sysconfig/puppetserver
Find the JAVA_ARGS and use the –Xms and –Xms options to set the memory allocation.
We will allocate 3GB of space
JAVA_ARGS="-Xms3g -Xmx3g"
Sau khi hoàn tất, hãy lưu và thoát khỏi chế độ chỉnh sửa.
Sau khi tất cả các thiết lập ở trên hoàn tất, chúng ta đã sẵn sàng khởi động máy chủ Con rối trên máy chủ bằng lệnh sau.
$ sudo systemctl start puppetserver
Tiếp theo, chúng ta sẽ thực hiện thiết lập để máy chủ rối khởi động bất cứ khi nào máy chủ chính khởi động.
$ sudo systemctl enable puppetserver
Phần chính của Puppet.conf
[master]
autosign = $confdir/autosign.conf { mode = 664 }
reports = foreman
external_nodes = /etc/puppet/node.rb
node_terminus = exec
ca = true
ssldir = /var/lib/puppet/ssl
certname = sat6.example.com
strict_variables = false
manifest =
/etc/puppet/environments/$environment/manifests/site.pp modulepath = /etc/puppet/environments/$environment/modules
config_version =
Tác nhân con rối là một ứng dụng phần mềm, được cung cấp bởi Puppet labs, chạy trên bất kỳ nút nào trong cụm Con rối. Nếu một người muốn quản lý bất kỳ máy chủ nào bằng cách sử dụng Puppet master, phần mềm tác nhân Puppet cần được cài đặt trên máy chủ cụ thể đó. Nói chung, tác nhân Con rối sẽ được cài đặt trên tất cả các máy, ngoại trừ máy chính Con rối trên bất kỳ cơ sở hạ tầng nhất định nào. Phần mềm tác nhân con rối có khả năng chạy trên hầu hết các máy Linux, UNIX và Windows. Trong các ví dụ sau, chúng tôi đang sử dụng phần mềm Puppet agent cài đặt máy CentOS trên đó.
Step 1 - Kích hoạt kho lưu trữ bộ sưu tập Puppet labs chính thức bằng lệnh sau.
$ sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el7.noarch.rpm
Step 2 - Cài đặt gói tác nhân Con rối.
$ sudo yum -y install puppet-agent
Step 3 - Sau khi cài đặt Puppet agent, hãy kích hoạt nó bằng lệnh sau.
$ sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable = true
Một tính năng chính của tác nhân Con rối là, lần đầu tiên khi tác nhân Con rối bắt đầu chạy, nó tạo chứng chỉ SSL và gửi chứng chỉ SSL và gửi đến người quản lý Con rối sẽ quản lý nó để ký và phê duyệt. Sau khi Puppet master chấp thuận yêu cầu chữ ký chứng chỉ của agent, nó sẽ có thể giao tiếp và quản lý nút agent.
Note - Người ta cần lặp lại các bước trên trên tất cả các nút cần được định cấu hình và quản lý bất kỳ một Puppet master nhất định.
Khi phần mềm tác nhân Con rối chạy lần đầu tiên trên bất kỳ nút Con rối nào, phần mềm này sẽ tạo chứng chỉ và gửi yêu cầu ký chứng chỉ đến phần mềm Con rối. Trước khi máy chủ Con rối có thể giao tiếp và kiểm soát các nút tác nhân, nó phải ký chứng chỉ của nút tác nhân cụ thể đó. Trong các phần sau, chúng tôi sẽ mô tả cách ký và kiểm tra yêu cầu ký.
Liệt kê các yêu cầu chứng chỉ hiện tại
Trên Puppet master, hãy chạy lệnh sau để xem tất cả các yêu cầu chứng chỉ chưa được ký.
$ sudo /opt/puppetlabs/bin/puppet cert list
Khi chúng tôi vừa thiết lập một nút tác nhân mới, chúng tôi sẽ thấy một yêu cầu phê duyệt. Sau đây sẽ làoutput.
"Brcleprod004.brcl.com" (SHA259)
15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:ll:
B5:1C:33:F7:76:67:F3:F6:45:AE:07:4B:F 6:E3:ss:04:11:8d
Nó không chứa bất kỳ dấu + (dấu) nào ở đầu, điều này cho biết rằng chứng chỉ vẫn chưa được ký.
Ký yêu cầu
Để ký yêu cầu chứng chỉ mới được tạo khi chạy tác nhân Con rối diễn ra trên nút mới, lệnh ký hiệu Chứng chỉ con rối sẽ được sử dụng, với tên máy chủ của chứng chỉ, được tạo bởi nút mới được định cấu hình cần để được ký kết. Khi chúng ta có chứng chỉ của Brcleprod004.brcl.com, chúng ta sẽ sử dụng lệnh sau.
$ sudo /opt/puppetlabs/bin/puppet cert sign Brcleprod004.brcl.com
Sau đây sẽ là output.
Notice: Signed certificate request for Brcle004.brcl.com
Notice: Removing file Puppet::SSL::CertificateRequest Brcle004.brcl.com at
'/etc/puppetlabs/puppet/ssl/ca/requests/Brcle004.brcl.com.pem'
Máy cắt con rối bây giờ có thể giao tiếp với nút, nơi thuộc về chứng chỉ ký hiệu.
$ sudo /opt/puppetlabs/bin/puppet cert sign --all
Thu hồi Máy chủ từ Thiết lập Con rối
Có các điều kiện về cấu hình xây dựng lại hạt nhân khi nó cần xóa máy chủ khỏi thiết lập và thêm lại nó. Đây là những điều kiện mà Puppet không thể quản lý được. Nó có thể được thực hiện bằng cách sử dụng lệnh sau.
$ sudo /opt/puppetlabs/bin/puppet cert clean hostname
Xem tất cả các yêu cầu đã ký
Lệnh sau sẽ tạo một danh sách các chứng chỉ đã ký với dấu + (dấu) cho biết rằng yêu cầu đã được chấp thuận.
$ sudo /opt/puppetlabs/bin/puppet cert list --all
Sau đây sẽ là output.
+ "puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:
BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:B
B:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:Brcle004.nyc3.example.com")
+ "Brcle004.brcl.com" (SHA259) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:
1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:F E:24:11:24:54:6A
+ " Brcle004.brcl.com" (SHA259) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3
Sau khi hoàn tất các bước trên, chúng ta đã sẵn sàng cơ sở hạ tầng, trong đó Puppet master hiện có khả năng quản lý các nút mới được thêm vào.
Trong Puppet, chúng tôi có một công cụ quản lý mã được gọi là r10k, giúp quản lý các cấu hình môi trường liên quan đến các loại môi trường khác nhau mà chúng tôi có thể định cấu hình trong Puppet như phát triển, thử nghiệm và sản xuất. Điều này giúp lưu trữ cấu hình liên quan đến môi trường trong kho mã nguồn. Sử dụng các nhánh repo điều khiển nguồn, r10k tạo môi trường trên máy chủ Puppet cài đặt và cập nhật môi trường bằng cách sử dụng các mô-đun có trong repo.
Tệp Gem có thể được sử dụng để cài đặt r10k trên bất kỳ máy nào nhưng đối với mô-đun và để có được phiên bản mới nhất, chúng tôi sẽ sử dụng trình quản lý gói rpm và rpm. Sau đây là một ví dụ cho tương tự.
$ urlgrabber -o /etc/yum.repos.d/timhughes-r10k-epel-6.repo
https://copr.fedoraproject.org/coprs/timhughes/yum -y install rubygem-r10k
Định cấu hình môi trường trong /etc/puppet/puppet.conf
[main]
environmentpath = $confdir/environments
Tạo tệp cấu hình cho cấu hình r10k
cat <<EOF >/etc/r10k.yaml
# The location to use for storing cached Git repos
:cachedir: '/var/cache/r10k'
# A list of git repositories to create
:sources:
# This will clone the git repository and instantiate an environment per
# branch in /etc/puppet/environments
:opstree:
#remote: 'https://github.com/fullstack-puppet/fullstackpuppet-environment.git'
remote: '/var/lib/git/fullstackpuppet-environment.git'
basedir: '/etc/puppet/environments'
EOF
Cài đặt Mô-đun và tệp kê khai con rối
r10k deploy environment -pv
Vì chúng tôi cần tiếp tục cập nhật môi trường sau mỗi 15 phút, chúng tôi sẽ tạo một công việc cron cho cùng một công việc.
cat << EOF > /etc/cron.d/r10k.conf
SHELL = /bin/bash
PATH = /sbin:/bin:/usr/sbin:/usr/bin
H/15 * * * * root r10k deploy environment -p
EOF
Thử nghiệm cài đặt
Để kiểm tra xem mọi thứ có hoạt động như được chấp nhận hay không, người ta cần biên dịch tệp kê khai Con rối cho mô-đun Con rối. Chạy lệnh sau và nhận được kết quả là đầu ra YAML.
curl --cert /etc/puppet/ssl/certs/puppet.corp.guest.pem \
--key /etc/puppet/ssl/private_keys/puppet.corp.guest.pem \
--cacert /etc/puppet/ssl/ca/ca_crt.pem \
-H 'Accept: yaml' \
https://puppet.corp.guest:8140/production/catalog/puppet.corp.guest
Trong Puppet, thiết lập có thể được kiểm tra cục bộ. Do đó, khi chúng ta đã thiết lập nút và nút chính của Con rối, đã đến lúc xác thực thiết lập cục bộ. Chúng ta cần cài đặt cục bộ Vagrant và Vagrant box, điều này giúp kiểm tra thiết lập cục bộ.
Thiết lập máy ảo
Vì chúng tôi đang thử nghiệm thiết lập cục bộ, chúng tôi thực sự không yêu cầu một trình điều khiển Con rối đang chạy. Điều này có nghĩa là không cần thực sự chạy Puppet master trên máy chủ, chúng ta có thể chỉ cần sử dụng Puppet để áp dụng lệnh xác thực thiết lập Puppet. Lệnh áp dụng con rối sẽ áp dụng các thay đổi từlocal/etc/puppet tùy thuộc vào tên máy ảo trong tệp cấu hình.
Bước đầu tiên chúng tôi cần thực hiện để kiểm tra thiết lập là xây dựng Vagrantfile và khởi động máy và lắp /etc/puppetthư mục vào vị trí. Tất cả các tệp được yêu cầu sẽ được đặt bên trong hệ thống kiểm soát phiên bản với cấu trúc sau.
Cấu trúc thư mục
- manifests
\- site.pp
- modules
\- your modules
- test
\- update-puppet.sh
\- Vagrantfile
- puppet.conf
Tệp Vagrant
# -*- mode: ruby -*-
# vi: set ft = ruby :
Vagrant.configure("2") do |config|
config.vm.box = "precise32"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", 1028, "--cpus", 2]
end
# Mount our repo onto /etc/puppet
config.vm.synced_folder "../", "/etc/puppet"
# Run our Puppet shell script
config.vm.provision "shell" do |s|
s.path = "update-puppet.sh"
end
config.vm.hostname = "localdev.example.com"
end
Trong đoạn mã trên, chúng ta đã sử dụng Shell provisioner, trong đó chúng ta đang cố gắng chạy tập lệnh Shell có tên update-puppet.sh. Tập lệnh có trong cùng thư mục nơi chứa tệp Vagrant và nội dung của tập lệnh được liệt kê bên dưới.
!/bin/bash
echo "Puppet version is $(puppet --version)" if [ $( puppet --version) != "3.4.1" ]; then
echo "Updating puppet"
apt-get install --yes lsb-release
DISTRIB_CODENAME = $(lsb_release --codename --short) DEB = "puppetlabs-release-${DISTRIB_CODENAME}.deb"
DEB_PROVIDES="/etc/apt/sources.list.d/puppetlabs.list"
if [ ! -e $DEB_PROVIDES ] then wget -q http://apt.puppetlabs.com/$DEB
sudo dpkg -i $DEB
fi
sudo apt-get update
sudo apt-get install -o Dpkg::Options:: = "--force-confold"
--force-yes -y puppet
else
echo "Puppet is up to date!"
fi
Xử lý thêm, người dùng cần tạo một tệp kê khai bên trong thư mục Manifests với tên site.pp sẽ cài đặt một số phần mềm trên VM.
node 'brclelocal03.brcl.com' {
package { ['vim','git'] :
ensure => latest
}
}
echo "Running puppet"
sudo puppet apply /etc/puppet/manifests/site.pp
Khi người dùng đã có sẵn tập lệnh trên với cấu hình tệp Vagrant được yêu cầu, người dùng có thể cd vào thư mục thử nghiệm và chạy vagrant up command. Thao tác này sẽ khởi động một máy ảo mới, Sau đó, hãy cài đặt Puppet và sau đó chạy nó bằng tập lệnh Shell.
Sau đây sẽ là đầu ra.
Notice: Compiled catalog for localdev.example.com in environment production in 0.09 seconds
Notice: /Stage[main]/Main/Node[brclelocal03.brcl.com]/Package[git]/ensure: created
Notice: /Stage[main]/Main/Node[brcllocal03.brcl.com]/Package[vim]/ensure: ensure changed 'purged' to 'latest'
Xác thực nhiều cấu hình máy
Nếu chúng ta cần kiểm tra cục bộ cấu hình của nhiều máy, có thể thực hiện đơn giản bằng cách thay đổi tệp cấu hình Vagrant.
Tệp Vagrant được định cấu hình mới
config.vm.define "brclelocal003" do |brclelocal003|
brclelocal03.vm.hostname = "brclelocal003.brcl.com"
end
config.vm.define "production" do |production|
production.vm.hostname = "brcleprod004.brcl.com"
end
Giả sử chúng ta có một máy chủ sản xuất mới, cần cài đặt tiện ích SSL. Chúng tôi chỉ cần mở rộng tệp kê khai cũ với cấu hình sau.
node 'brcleprod004.brcl.com' inherits 'brcleloacl003.brcl.com' {
package { ['SSL'] :
ensure => latest
}
}
Sau khi thực hiện các thay đổi cấu hình trong tệp kê khai, chúng tôi chỉ cần di chuyển đến thư mục thử nghiệm và chạy lệnh vagrant up cơ bản sẽ hiển thị cả hai brclelocal003.brcl.com và brcleprod004.brcl.commáy móc. Trong trường hợp của chúng tôi, chúng tôi đang cố gắng đưa ra máy sản xuất có thể được thực hiện bằng cách chạyvagrant up production command. Máy sẽ tạo một máy mới với tên sản xuất như được định nghĩa trong tệp Vagrant và nó sẽ có gói SSL được cài đặt trong đó.
Trong Puppet, kiểu mã hóa xác định tất cả các tiêu chuẩn mà người ta cần tuân theo trong khi cố gắng chuyển đổi cơ sở hạ tầng trên cấu hình máy thành mã. Con rối hoạt động và thực hiện tất cả các nhiệm vụ xác định của nó bằng cách sử dụng tài nguyên.
Định nghĩa ngôn ngữ của Puppet giúp xác định tất cả các tài nguyên theo cách có cấu trúc, được yêu cầu để quản lý bất kỳ máy mục tiêu nào cần được quản lý. Puppet sử dụng Ruby làm ngôn ngữ mã hóa của nó, có nhiều tính năng có sẵn giúp hoàn thành công việc rất dễ dàng với một cấu hình đơn giản về mặt mã.
Đơn vị cơ bản
Puppet sử dụng nhiều kiểu mã hóa cơ bản, dễ hiểu và dễ quản lý. Sau đây là danh sách một số ít.
Tài nguyên
Trong Puppet, tài nguyên được gọi là đơn vị mô hình cơ bản được sử dụng để quản lý hoặc sửa đổi bất kỳ hệ thống đích nào. Tài nguyên bao gồm tất cả các khía cạnh của hệ thống như tệp, dịch vụ và gói. Puppet đi kèm với một khả năng tích hợp trong đó nó cho phép người dùng hoặc nhà phát triển phát triển các tài nguyên tùy chỉnh, giúp quản lý bất kỳ đơn vị cụ thể nào của máy
Trong Puppet, tất cả các tài nguyên được tổng hợp lại với nhau bằng cách sử dụng “define” hoặc là “classes”. Các tính năng tổng hợp này giúp tổ chức một mô-đun. Sau đây là một tài nguyên mẫu bao gồm nhiều loại, tiêu đề và danh sách các thuộc tính mà Con rối có thể hỗ trợ nhiều thuộc tính. Mỗi tài nguyên trong Puppet đều có giá trị mặc định riêng, có thể được ghi đè khi cần thiết.
Tài nguyên con rối mẫu cho tệp
Trong lệnh sau, chúng tôi đang cố gắng chỉ định một quyền cho một tệp cụ thể.
file {
'/etc/passwd':
owner => superuser,
group => superuser,
mode => 644,
}
Bất cứ khi nào lệnh trên được thực thi trên bất kỳ máy nào, nó sẽ xác minh rằng tệp mật khẩu trong hệ thống được cấu hình như mô tả. Tệp trước: dấu hai chấm là tiêu đề của tài nguyên, có thể được gọi là tài nguyên trong các phần khác của cấu hình Con rối.
Chỉ định tên địa phương để bổ sung cho tiêu đề
file { 'sshdconfig':
name => $operaSystem ? {
solaris => '/usr/local/etc/ssh/sshd_config',
default => '/etc/ssh/sshd_config',
},
owner => superuser,
group => superuser,
mode => 644,
}
Bằng cách sử dụng tiêu đề luôn giống nhau, rất dễ dàng để tham khảo tài nguyên tệp trong cấu hình mà không cần phải lặp lại logic liên quan đến hệ điều hành.
Một ví dụ khác có thể là sử dụng một dịch vụ phụ thuộc vào một tệp.
service { 'sshd':
subscribe => File[sshdconfig],
}
Với sự phụ thuộc này, sshd dịch vụ sẽ luôn khởi động lại sau khi sshdconfigthay đổi tệp. Điểm cần nhớ ở đây làFile[sshdconfig] là một khai báo dưới dạng Tệp như trong trường hợp viết thường nhưng nếu chúng ta thay đổi nó thành FILE[sshdconfig] thì nó sẽ là một tài liệu tham khảo.
Một điểm cơ bản mà người ta cần ghi nhớ khi khai báo tài nguyên là, nó chỉ có thể được khai báo một lần cho mỗi tệp cấu hình. Việc khai báo cùng một tài nguyên nhiều lần sẽ gây ra lỗi. Thông qua khái niệm cơ bản này, Puppet đảm bảo rằng cấu hình được mô hình hóa tốt.
Chúng tôi thậm chí có khả năng quản lý sự phụ thuộc tài nguyên, điều này giúp quản lý nhiều mối quan hệ.
service { 'sshd':
require => File['sshdconfig', 'sshconfig', 'authorized_keys']
}
Metaparameters
Metaparameters được gọi là tham số toàn cục trong Puppet. Một trong những tính năng chính của tham số đo là nó hoạt động với bất kỳ loại tài nguyên nào trong Puppet.
Tài nguyên mặc định
Khi cần xác định một giá trị thuộc tính tài nguyên mặc định, Puppet cung cấp một tập hợp các cú pháp để lưu trữ nó, sử dụng đặc tả tài nguyên viết hoa không có tiêu đề.
Ví dụ, nếu chúng ta muốn đặt đường dẫn mặc định của tất cả tệp thực thi, nó có thể được thực hiện bằng lệnh sau.
Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin' }
exec { 'echo Testing mataparamaters.': }
Trong lệnh trên, câu lệnh đầu tiên Exec sẽ đặt giá trị mặc định cho tài nguyên thực thi. Tài nguyên thực thi yêu cầu một đường dẫn đủ điều kiện hoặc một đường dẫn trông giống như một tệp thực thi. Với điều này, người ta có thể xác định một đường dẫn mặc định duy nhất cho toàn bộ cấu hình. Mặc định hoạt động với bất kỳ loại tài nguyên nào trong Puppet.
Tuy nhiên, các giá trị mặc định không phải là giá trị toàn cục, chúng chỉ ảnh hưởng đến phạm vi mà chúng được xác định hoặc chính là biến tiếp theo của nó. Nếu ai đó muốn xác địnhdefault để có cấu hình hoàn chỉnh, sau đó chúng tôi xác định default và lớp học trong phần tiếp theo.
Bộ sưu tập tài nguyên
Tổng hợp là phương pháp thu thập mọi thứ lại với nhau. Con rối hỗ trợ một khái niệm tập hợp rất mạnh mẽ. Trong Puppet, tập hợp được sử dụng để nhóm tài nguyên là đơn vị cơ bản của Puppet với nhau. Khái niệm tổng hợp này trong Puppet đạt được bằng cách sử dụng hai phương pháp mạnh mẽ được gọi làclasses và definition.
Lớp và Định nghĩa
Các lớp chịu trách nhiệm mô hình hóa các khía cạnh cơ bản của nút. Họ có thể nói nút là một máy chủ web và nút cụ thể này là một trong số đó. Trong Puppet, các lớp lập trình là các lớp đơn và chúng có thể được đánh giá một lần cho mỗi nút.
Mặt khác, định nghĩa có thể được sử dụng nhiều lần trên một nút duy nhất. Chúng hoạt động tương tự như một người đã tạo ra loại Con rối của riêng mình bằng cách sử dụng ngôn ngữ. Chúng được tạo ra để sử dụng nhiều lần với các đầu vào khác nhau mỗi lần. Điều này có nghĩa là người ta có thể chuyển các giá trị biến vào định nghĩa.
Sự khác biệt giữa Lớp và Định nghĩa
Sự khác biệt chính duy nhất giữa lớp và định nghĩa là trong khi xác định cấu trúc xây dựng và phân bổ tài nguyên, lớp chỉ được đánh giá một lần cho mỗi nút, trong đó mặt khác, một định nghĩa được sử dụng nhiều lần trên cùng một nút.
Các lớp học
Các lớp trong Puppet được giới thiệu bằng cách sử dụng từ khóa class và nội dung của lớp cụ thể đó được bao bọc bên trong dấu ngoặc nhọn như trong ví dụ sau.
class unix {
file {
'/etc/passwd':
owner => 'superuser',
group => 'superuser',
mode => 644;
'/etc/shadow':
owner => 'vipin',
group => 'vipin',
mode => 440;
}
}
Trong ví dụ sau, chúng tôi đã sử dụng một số bàn tay ngắn tương tự như ở trên.
class unix {
file {
'/etc/passwd':
owner => 'superuser',
group => 'superuser',
mode => 644;
}
file {'/etc/shadow':
owner => 'vipin',
group => 'vipin',
mode => 440;
}
}
Kế thừa trong các lớp múa rối
Trong Puppet, khái niệm kế thừa OOP được hỗ trợ theo mặc định, trong đó các lớp có thể mở rộng chức năng của lớp trước đó mà không cần sao chép và dán lại bit mã hoàn chỉnh trong lớp mới được tạo. Kế thừa cho phép lớp con ghi đè cài đặt tài nguyên được xác định trong lớp cha. Một điều quan trọng cần lưu ý khi sử dụng kế thừa là, một lớp chỉ có thể kế thừa các tính năng từ một lớp cha, không nhiều hơn một.
class superclass inherits testsubclass {
File['/etc/passwd'] { group => wheel }
File['/etc/shadow'] { group => wheel }
}
Nếu cần hoàn tác một số logic được chỉ định trong lớp cha, chúng ta có thể sử dụng undef command.
class superclass inherits testsubcalss {
File['/etc/passwd'] { group => undef }
}
Cách sử dụng kế thừa thay thế
class tomcat {
service { 'tomcat': require => Package['httpd'] }
}
class open-ssl inherits tomcat {
Service[tomcat] { require +> File['tomcat.pem'] }
}
Lớp lồng nhau trong con rối
Puppet hỗ trợ khái niệm lồng các lớp trong đó nó cho phép sử dụng các lớp lồng nhau có nghĩa là một lớp bên trong lớp kia. Điều này giúp đạt được mô-đun và phạm vi.
class testclass {
class nested {
file {
'/etc/passwd':
owner => 'superuser',
group => 'superuser',
mode => 644;
}
}
}
class anotherclass {
include myclass::nested
}
Các lớp được tham số hóa
Trong Puppet, các lớp có thể mở rộng chức năng của chúng để cho phép truyền các tham số vào một lớp.
Để truyền một tham số trong một lớp, người ta có thể sử dụng cấu trúc sau:
class tomcat($version) {
... class contents ...
}
Một điểm quan trọng cần nhớ trong Puppet là, các lớp có tham số không được thêm vào bằng cách sử dụng hàm include, thay vào đó, lớp kết quả có thể được thêm vào dưới dạng định nghĩa.
node webserver {
class { tomcat: version => "1.2.12" }
}
Giá trị mặc định dưới dạng tham số trong lớp
class tomcat($version = "1.2.12",$home = "/var/www") {
... class contents ...
}
Các giai đoạn chạy
Puppet hỗ trợ khái niệm về giai đoạn chạy, có nghĩa là người dùng có thể thêm nhiều giai đoạn theo yêu cầu để quản lý bất kỳ tài nguyên cụ thể nào hoặc nhiều tài nguyên. Tính năng này rất hữu ích khi người dùng muốn phát triển một danh mục phức tạp. Trong một danh mục phức tạp, người ta có một số lượng lớn tài nguyên cần được biên dịch trong khi lưu ý rằng không nên tác động đến các phụ thuộc giữa các tài nguyên được xác định.
Giai đoạn chạy rất hữu ích trong việc quản lý phụ thuộc tài nguyên. Điều này có thể được thực hiện bằng cách thêm các lớp trong các giai đoạn xác định, trong đó một lớp cụ thể chứa một tập hợp các tài nguyên. Với giai đoạn chạy, Puppet đảm bảo rằng các giai đoạn đã xác định sẽ chạy theo thứ tự có thể dự đoán được chỉ định mỗi khi danh mục chạy và được áp dụng trên bất kỳ nút Puppet nào.
Để sử dụng điều này, người ta cần khai báo các giai đoạn bổ sung ngoài các giai đoạn đã có và sau đó Puppet có thể được định cấu hình để quản lý từng giai đoạn theo một thứ tự được chỉ định bằng cách sử dụng cùng một cú pháp quan hệ tài nguyên trước khi yêu cầu. “->” và “+>”. Mối quan hệ sau đó sẽ đảm bảo thứ tự của các lớp liên kết với mỗi giai đoạn.
Khai báo các giai đoạn bổ sung với cú pháp khai báo con rối
stage { "first": before => Stage[main] }
stage { "last": require => Stage[main] }
Khi các giai đoạn đã được khai báo, một lớp có thể được liên kết với giai đoạn khác với giai đoạn chính bằng cách sử dụng giai đoạn.
class {
"apt-keys": stage => first;
"sendmail": stage => main;
"apache": stage => last;
}
Tất cả các tài nguyên được liên kết với apt-key của lớp sẽ chạy trước. Tất cả các tài nguyên trong Sendmail sẽ là lớp chính và các tài nguyên liên kết với Apache sẽ là lớp cuối cùng.
Các định nghĩa
Trong Puppet, việc thu thập tài nguyên trong bất kỳ tệp kê khai nào được thực hiện bởi các lớp hoặc định nghĩa. Các định nghĩa rất giống với một lớp trong Puppet tuy nhiên chúng được giới thiệu vớidefine keyword (not class)và họ ủng hộ lập luận không kế thừa. Chúng có thể chạy nhiều lần trên cùng một hệ thống với các thông số khác nhau.
Ví dụ, nếu người ta muốn tạo một định nghĩa kiểm soát các kho mã nguồn nơi người ta đang cố gắng tạo nhiều kho lưu trữ trên cùng một hệ thống, thì người ta có thể sử dụng định nghĩa not class.
define perforce_repo($path) {
exec {
"/usr/bin/svnadmin create $path/$title":
unless => "/bin/test -d $path",
}
}
svn_repo { puppet_repo: path => '/var/svn_puppet' }
svn_repo { other_repo: path => '/var/svn_other' }
Điểm quan trọng cần lưu ý ở đây là cách một biến có thể được sử dụng với một định nghĩa. Chúng tôi sử dụng ($) biến dấu đô la. Ở trên, chúng tôi đã sử dụng$title. Definitions can have both a $tiêu đề và $name with which the name and the title can be represented. By default, $tiêu đề và $name are set to the same value, but one can set a title attribute and pass different name as a parameter. $title và $ name chỉ hoạt động trong định nghĩa, không hoạt động trong lớp hoặc tài nguyên khác.
Mô-đun
Một mô-đun có thể được định nghĩa là một tập hợp tất cả các cấu hình sẽ được sử dụng bởi Puppet master để áp dụng các thay đổi cấu hình trên bất kỳ nút Puppet cụ thể nào (tác nhân). Chúng còn được gọi là tập hợp di động của các loại cấu hình khác nhau, được yêu cầu để thực hiện một tác vụ cụ thể. Ví dụ, một mô-đun có thể chứa tất cả các tài nguyên cần thiết để cấu hình Postfix và Apache.
Điểm giao
Các nút rất đơn giản, bước còn lại là cách chúng tôi khớp những gì chúng tôi đã xác định (“đây là giao diện của một máy chủ web”) với những máy được chọn để thực hiện các hướng dẫn đó.
Định nghĩa nút chính xác trông giống như các lớp, bao gồm cả kế thừa hỗ trợ, tuy nhiên chúng đặc biệt đến mức khi một nút (một máy tính được quản lý chạy một máy khách con rối) kết nối với daemon chủ Puppet, tên của nó sẽ được tìm thấy trong danh sách các nút đã xác định. Thông tin được xác định sẽ được đánh giá cho nút, và sau đó nút sẽ gửi cấu hình đó.
Tên nút có thể là tên máy chủ lưu trữ ngắn gọn hoặc tên miền đủ điều kiện (FQDN).
node 'www.vipin.com' {
include common
include apache, squid
}
Định nghĩa trên tạo ra một nút có tên là www.vipin.com và bao gồm chung, Apache và Squid classe
Chúng ta có thể gửi cùng một cấu hình đến các nút khác nhau bằng cách phân tách từng nút bằng dấu phẩy.
node 'www.testing.com', 'www.testing2.com', 'www3.testing.com' {
include testing
include tomcat, squid
}
Biểu thức chính quy cho các nút phù hợp
node /^www\d+$/ {
include testing
}
Kế thừa nút
Node hỗ trợ một mô hình kế thừa hạn chế. Giống như các lớp, các nút chỉ có thể kế thừa từ một nút khác.
node 'www.testing2.com' inherits 'www.testing.com' {
include loadbalancer
}
Trong đoạn mã trên, www.testing2.com kế thừa tất cả các chức năng từ www.testing.com ngoài một lớp loadbalancer bổ sung.
Các tính năng được hỗ trợ nâng cao
Quoting- Trong hầu hết các trường hợp, chúng ta không cần trích dẫn một chuỗi trong Puppet. Bất kỳ chuỗi số alpha nào bắt đầu bằng một chữ cái sẽ được để lại mà không cần trích dẫn. Tuy nhiên, cách tốt nhất là trích dẫn một chuỗi cho bất kỳ giá trị không âm nào.
Nội suy biến với dấu ngoặc kép
Cho đến nay chúng ta đã đề cập đến biến về mặt định nghĩa. Nếu một người cần sử dụng các biến đó với một chuỗi, hãy sử dụng dấu ngoặc kép, không phải dấu nháy đơn. Chuỗi dấu ngoặc kép sẽ không thực hiện bất kỳ phép nội suy biến nào, chuỗi dấu ngoặc kép sẽ thực hiện. Biến có thể được đặt trong ngoặc đơn{} giúp chúng dễ sử dụng cùng nhau và dễ hiểu hơn.
$value = "${one}${two}"
Thực tiễn tốt nhất, người ta nên sử dụng dấu ngoặc kép cho tất cả các chuỗi không yêu cầu nội suy chuỗi.
viết hoa
Viết hoa là một quá trình được sử dụng để tham chiếu, kế thừa và thiết lập các thuộc tính mặc định của một tài nguyên cụ thể. Về cơ bản có hai cách cơ bản để sử dụng nó.
Referencing- Là cách tham chiếu đến một tài nguyên đã được tạo sẵn. Nó chủ yếu được sử dụng cho các mục đích phụ thuộc, người ta phải viết hoa tên của tài nguyên. Ví dụ: request => file [sshdconfig]
Inheritance- Khi ghi đè cài đặt cho lớp cha từ lớp con, hãy sử dụng phiên bản viết hoa của tên tài nguyên. Sử dụng phiên bản viết thường sẽ dẫn đến lỗi.
Setting Default Attribute Value - Sử dụng tài nguyên được viết hoa không có tiêu đề có tác dụng thiết lập mặc định của tài nguyên.
Mảng
Con rối cho phép sử dụng các mảng trong nhiều lĩnh vực [Một, hai, ba].
Một số thành viên kiểu, chẳng hạn như bí danh trong định nghĩa máy chủ lưu trữ chấp nhận các mảng trong giá trị của chúng. Một tài nguyên máy chủ có nhiều bí danh sẽ giống như sau.
host { 'one.vipin.com':
alias => [ 'satu', 'dua', 'tiga' ],
ip => '192.168.100.1',
ensure => present,
}
Đoạn mã trên sẽ thêm một máy chủ ‘one.brcletest.com’ vào danh sách máy chủ lưu trữ với ba bí danh ‘satu’ ‘dua’ ‘tiga’. Nếu một người muốn thêm nhiều tài nguyên vào một tài nguyên, nó có thể được thực hiện như trong ví dụ sau.
resource { 'baz':
require => [ Package['rpm'], File['testfile'] ],
}
Biến
Puppet hỗ trợ nhiều biến giống như hầu hết các ngôn ngữ lập trình khác. Các biến con rối được biểu thị bằng$.
$content = 'some content\n' file { '/tmp/testing': content => $content }
Như đã nói trước đó Puppet là một ngôn ngữ khai báo, có nghĩa là phạm vi và quy tắc gán của nó khác với ngôn ngữ mệnh lệnh. Sự khác biệt cơ bản là người ta không thể thay đổi biến trong một phạm vi duy nhất, vì chúng dựa vào thứ tự trong tệp để xác định giá trị của một biến. Thứ tự không quan trọng trong ngôn ngữ khai báo.
$user = root file { '/etc/passwd': owner => $user,
}
$user = bin file { '/bin': owner => $user,
recurse => true,
}
Phạm vi biến đổi
Phạm vi biến xác định nếu tất cả các biến được xác định là hợp lệ. Cũng như các tính năng mới nhất, Puppet hiện đang được xác định phạm vi động, theo thuật ngữ Con rối có nghĩa là tất cả các biến được xác định sẽ được đánh giá trên phạm vi của chúng chứ không phải vị trí mà chúng được xác định.
$test = 'top' class Testclass { exec { "/bin/echo $test": logoutput => true }
}
class Secondtestclass {
$test = 'other'
include myclass
}
include Secondtestclass
Biến đủ điều kiện
Puppet hỗ trợ việc sử dụng các biến đủ điều kiện bên trong một lớp hoặc một định nghĩa. Điều này rất hữu ích khi người dùng muốn sử dụng cùng một biến trong các lớp khác mà anh ta đã xác định hoặc sắp định nghĩa.
class testclass {
$test = 'content'
}
class secondtestclass {
$other = $myclass::test
}
Trong đoạn mã trên, giá trị của $ biến khác đánh giá nội dung.
Điều kiện
Điều kiện là các tình huống khi người dùng muốn thực hiện một tập hợp các câu lệnh hoặc mã khi điều kiện xác định hoặc điều kiện bắt buộc được thỏa mãn. Con rối hỗ trợ hai loại điều kiện.
Điều kiện bộ chọn chỉ có thể được sử dụng trong các tài nguyên đã xác định để chọn giá trị chính xác của máy.
Điều kiện tuyên bố là các điều kiện được sử dụng rộng rãi hơn trong tệp kê khai giúp bao gồm các lớp bổ sung mà người dùng muốn đưa vào cùng một tệp kê khai. Xác định một tập hợp tài nguyên riêng biệt trong một lớp hoặc đưa ra các quyết định cấu trúc khác.
Bộ chọn
Bộ chọn hữu ích khi người dùng muốn chỉ định một thuộc tính tài nguyên và các biến khác với các giá trị mặc định dựa trên các dữ kiện hoặc các biến khác. Trong Puppet, chỉ mục bộ chọn hoạt động giống như một toán tử ba chiều nhiều giá trị. Bộ chọn cũng có khả năng xác định các giá trị mặc định tùy chỉnh mà không có giá trị nào được xác định trong tệp kê khai và phù hợp với điều kiện.
$owner = $Sysoperenv ? {
sunos => 'adm',
redhat => 'bin',
default => undef,
}
Trong các phiên bản mới hơn của Puppet 0.25.0, các bộ chọn có thể được sử dụng làm biểu thức chính quy.
$owner = $Sysoperenv ? {
/(Linux|Ubuntu)/ => 'bin',
default => undef,
}
Trong ví dụ trên, bộ chọn $Sysoperenv giá trị khớp với Linux hoặc Ubuntu, thì bin sẽ là kết quả được chọn, nếu không người dùng sẽ được đặt là không xác định.
Điều kiện tuyên bố
Câu lệnh điều kiện là một loại câu lệnh điều kiện khác trong Puppet, rất giống với điều kiện trường hợp chuyển đổi trong tập lệnh Shell. Trong đó, một tập hợp nhiều câu lệnh trường hợp được xác định và các giá trị đầu vào đã cho được khớp với mỗi điều kiện.
Câu lệnh case phù hợp với điều kiện đầu vào đã cho sẽ được thực thi. Điều kiện câu lệnh trường hợp này không có bất kỳ giá trị trả lại nào. Trong Puppet, một trường hợp sử dụng rất phổ biến cho câu lệnh điều kiện là chạy một tập hợp các bit mã dựa trên hệ điều hành cơ bản.
case $ Sysoperenv {
sunos: { include solaris }
redhat: { include redhat }
default: { include generic}
}
Case Statement cũng có thể chỉ định nhiều điều kiện bằng cách phân tách chúng bằng dấu phẩy.
case $Sysoperenv {
development,testing: { include development } testing,production: { include production }
default: { include generic }
}
Câu lệnh If-Else
Con rối hỗ trợ khái niệm hoạt động dựa trên điều kiện. Để đạt được điều đó, câu lệnh If / else cung cấp các tùy chọn phân nhánh dựa trên giá trị trả về của điều kiện. Như thể hiện trong ví dụ sau:
if $Filename {
file { '/some/file': ensure => present }
} else {
file { '/some/other/file': ensure => present }
}
Phiên bản mới nhất của Puppet hỗ trợ biểu thức biến trong đó câu lệnh if cũng có thể phân nhánh dựa trên giá trị của một biểu thức.
if $machine == 'production' {
include ssl
} else {
include nginx
}
Để đạt được sự đa dạng hơn trong mã và thực hiện các hoạt động có điều kiện phức tạp, Puppet hỗ trợ câu lệnh if / else lồng nhau như thể hiện trong đoạn mã sau.
if $ machine == 'production' { include ssl } elsif $ machine == 'testing' {
include nginx
} else {
include openssl
}
Tài nguyên ảo
Tài nguyên ảo là những tài nguyên không được gửi đến máy khách trừ khi được nhận ra.
Sau đây là cú pháp sử dụng tài nguyên ảo trong Puppet.
@user { vipin: ensure => present }
Trong ví dụ trên, vipin người dùng được định nghĩa hầu như để nhận ra định nghĩa mà người ta có thể sử dụng trong bộ sưu tập.
User <| title == vipin |>
Bình luận
Chú thích được sử dụng trong bất kỳ bit mã nào để tạo một nút bổ sung về tập hợp các dòng mã và chức năng của nó. Trong Puppet, hiện có hai loại bình luận được hỗ trợ.
- Nhận xét về kiểu shell Unix. Chúng có thể nằm trên dòng riêng của chúng hoặc dòng tiếp theo.
- Nhiều dòng bình luận kiểu c.
Sau đây là một ví dụ về nhận xét kiểu shell.
# this is a comment
Sau đây là một ví dụ về nhận xét nhiều dòng.
/*
This is a comment
*/
ưu tiên điều hành
Mức độ ưu tiên của toán tử Con rối tuân theo mức độ ưu tiên tiêu chuẩn trong hầu hết các hệ thống, từ cao nhất đến thấp nhất.
Sau đây là danh sách các biểu thức
- ! = không
- / = lần và chia
- - + = trừ, cộng
- << >> = dịch trái và dịch phải
- ==! = = không bằng nhau, bằng nhau
- > = <=> <= lớn hơn bằng, nhỏ hơn hoặc bằng, lớn hơn, nhỏ hơn
Biểu thức so sánh
Biểu thức so sánh được sử dụng khi người dùng muốn thực hiện một tập hợp các câu lệnh khi điều kiện đã cho được thỏa mãn. Biểu thức so sánh bao gồm các bài kiểm tra tính bình đẳng bằng cách sử dụng biểu thức ==.
if $environment == 'development' {
include openssl
} else {
include ssl
}
Ví dụ không bình đẳng
if $environment != 'development' {
$otherenvironment = 'testing' } else { $otherenvironment = 'production'
}
Biểu thức số học
$one = 1 $one_thirty = 1.30
$two = 2.034e-2 $result = ((( $two + 2) / $one_thirty) + 4 * 5.45) -
(6 << ($two + 4)) + (0×800 + -9)
Biểu thức Boolean
Biểu thức boolean có thể sử dụng hoặc, và, & không.
$one = 1
$two = 2 $var = ( $one < $two ) and ( $one + 1 == $two )
Biểu hiện thông thường
Con rối hỗ trợ so khớp biểu thức chính quy bằng cách sử dụng = ~ (khớp) và! ~ (Không khớp).
if $website =~ /^www(\d+)\./ { notice('Welcome web server #$1')
}
Giống như trường hợp và bộ chọn đối sánh regex tạo ra biến phạm vi giới hạn cho mỗi regex.
exec { "Test":
command => "/bin/echo now we don’t have openssl installed on machine > /tmp/test.txt",
unless => "/bin/which php"
}
Tương tự, chúng ta có thể sử dụng trừ khi, trừ khi thực hiện lệnh mọi lúc, ngoại trừ lệnh dưới, trừ khi thoát thành công.
exec { "Test":
command => "/bin/echo now we don’t have openssl installed on machine > /tmp/test.txt",
unless => "/bin/which php"
}
Làm việc với các mẫu
Các mẫu được sử dụng khi một người muốn có một cấu trúc được xác định trước sẽ được sử dụng trên nhiều mô-đun trong Puppet và các mô-đun đó sẽ được phân phối trên nhiều máy. Bước đầu tiên để sử dụng mẫu là tạo một mẫu hiển thị nội dung mẫu bằng các phương thức mẫu.
file { "/etc/tomcat/sites-available/default.conf":
ensure => "present",
content => template("tomcat/vhost.erb")
}
Puppet đưa ra một số giả định khi xử lý các tệp cục bộ để thực thi tổ chức và mô đun. Con rối tìm kiếm mẫu vhost.erb bên trong thư mục apache / templates, bên trong thư mục mô-đun.
Dịch vụ xác định và kích hoạt
Trong Puppet, nó có một tài nguyên gọi là dịch vụ có khả năng quản lý vòng đời của tất cả các dịch vụ đang chạy trên bất kỳ máy hoặc môi trường cụ thể nào. Tài nguyên dịch vụ được sử dụng để đảm bảo các dịch vụ được khởi tạo và kích hoạt. Chúng cũng được sử dụng để khởi động lại dịch vụ.
Ví dụ, trong mẫu trước của tomcat mà chúng ta có nơi chúng ta đặt máy chủ ảo apache. Nếu muốn đảm bảo apache được khởi động lại sau khi thay đổi máy chủ ảo, chúng ta cần tạo tài nguyên dịch vụ cho dịch vụ apache bằng lệnh sau.
service { 'tomcat':
ensure => running,
enable => true
}
Khi xác định tài nguyên, chúng tôi cần bao gồm tùy chọn thông báo để kích hoạt khởi động lại.
file { "/etc/tomcat/sites-available/default.conf":
ensure => "present",
content => template("vhost.erb"),
notify => Service['tomcat']
}
Trong Puppet, tất cả các chương trình được viết bằng ngôn ngữ lập trình Ruby và được lưu với phần mở rộng là .pp được gọi là manifests. Nói chung, tất cả các chương trình Con rối được xây dựng với mục đích tạo hoặc quản lý bất kỳ máy chủ đích nào được gọi là tệp kê khai. Tất cả các chương trình được viết bằng Puppet đều tuân theo kiểu mã hóa Puppet.
Cốt lõi của Puppet là cách các tài nguyên được khai báo và cách các tài nguyên này đại diện cho trạng thái của chúng. Trong bất kỳ tệp kê khai nào, người dùng có thể có một bộ sưu tập các loại tài nguyên khác nhau được nhóm lại với nhau bằng cách sử dụng lớp và định nghĩa.
Trong một số trường hợp, tệp kê khai Con rối thậm chí có thể có một câu lệnh điều kiện để đạt được trạng thái mong muốn. Tuy nhiên, cuối cùng tất cả đều đi xuống để đảm bảo rằng tất cả các tài nguyên được xác định và sử dụng đúng cách và tệp kê khai được xác định khi được áp dụng sau khi được chuyển đổi thành danh mục có khả năng thực hiện nhiệm vụ mà nó đã được thiết kế.
Quy trình làm việc của tệp kê khai
Tệp kê khai con rối bao gồm các thành phần sau:
Files (đây là các tệp đơn giản mà Puppet không liên quan gì đến chúng, chỉ cần chọn chúng và đặt chúng vào vị trí đích)
Resources
Templates (chúng có thể được sử dụng để xây dựng các tệp cấu hình trên nút).
Nodes (tất cả các định nghĩa liên quan đến một nút khách hàng được xác định ở đây)
Classes
Điểm cần lưu ý
Trong Puppet, tất cả các tệp kê khai sử dụng Ruby làm ngôn ngữ mã hóa của chúng và được lưu bằng .pp sự mở rộng.
Câu lệnh "Nhập" trong nhiều tệp kê khai được sử dụng để tải tệp khi Con rối khởi động.
Để nhập tất cả các tệp có trong một thư mục, bạn có thể sử dụng câu lệnh nhập theo cách khác như nhập 'khách hàng / *'. Điều này sẽ nhập tất cả.pp các tệp bên trong thư mục đó.
Viết Manifests
Làm việc với các biến
Trong khi viết tệp kê khai, người dùng có thể xác định một biến mới hoặc sử dụng một biến hiện có tại bất kỳ điểm nào trong tệp kê khai. Puppet hỗ trợ các loại biến khác nhau nhưng một vài trong số chúng được sử dụng thường xuyên như chuỗi và mảng chuỗi. Ngoài chúng, các định dạng khác cũng được hỗ trợ.
Ví dụ về biến chuỗi
$package = "vim" package { $package:
ensure => "installed"
}
Sử dụng vòng lặp
Vòng lặp được sử dụng khi một người muốn trải qua nhiều lần lặp lại trên cùng một bộ mã cho đến khi một điều kiện xác định được đáp ứng. Chúng cũng được sử dụng để thực hiện các nhiệm vụ lặp đi lặp lại với các bộ giá trị khác nhau. Tạo 10 nhiệm vụ cho 10 thứ khác nhau. Người ta có thể tạo một tác vụ duy nhất và sử dụng một vòng lặp để lặp lại tác vụ với các gói khác nhau mà người ta muốn cài đặt.
Thông thường nhất, một mảng được sử dụng để lặp lại một thử nghiệm với các giá trị khác nhau.
$packages = ['vim', 'git', 'curl'] package { $packages:
ensure => "installed"
}
Sử dụng Điều kiện
Puppet hỗ trợ hầu hết các cấu trúc điều kiện có thể được tìm thấy trong các ngôn ngữ lập trình truyền thống. Điều kiện có thể được sử dụng để xác định động xem có nên thực hiện một tác vụ cụ thể hay một bộ mã sẽ được thực thi hay không. Giống như if / else và các câu lệnh trường hợp. Ngoài ra, các điều kiện như thực thi cũng sẽ hỗ trợ các thuộc tính hoạt động như điều kiện, nhưng chỉ chấp nhận đầu ra lệnh như một điều kiện.
if $OperatingSystem != 'Linux' {
warning('This manifest is not supported on this other OS apart from linux.')
} else {
notify { 'the OS is Linux. We are good to go!': }
}
Trong Puppet, một mô-đun có thể được định nghĩa là một tập hợp các tài nguyên, lớp, tệp, định nghĩa và mẫu. Puppet hỗ trợ dễ dàng phân phối lại các mô-đun, điều này rất hữu ích trong tính mô-đun của mã vì người ta có thể viết một mô-đun chung được chỉ định và có thể sử dụng nó nhiều lần với rất ít thay đổi mã đơn giản. Ví dụ: điều này sẽ kích hoạt cấu hình trang web mặc định trong / etc / rối, với các mô-đun được vận chuyển bởi Puppet thích hợp trong / etc / share / rối.
Cấu hình mô-đun
Trong bất kỳ mô-đun Puppet nào, chúng tôi có hai phân vùng giúp xác định cấu trúc của mã và kiểm soát các mẫu số.
Đường dẫn tìm kiếm của các mô-đun được định cấu hình bằng cách sử dụng danh sách các thư mục được phân tách bằng dấu hai chấm trong puppetmasterd hoặc là masterd, phần sau của tệp cấu hình chính của Puppet với modulepath tham số.
[puppetmasterd]
...
modulepath = /var/lib/puppet/modules:/data/puppet/modules
Cài đặt kiểm soát truy cập cho mô-đun máy chủ tệp trong fileserver.conf, cấu hình đường dẫn cho mô-đun đó luôn bị bỏ qua và việc chỉ định đường dẫn sẽ tạo ra cảnh báo.
Đường dẫn tìm kiếm có thể được thêm vào trong thời gian chạy bằng cách đặt biến môi trường PUPPETLAB cũng phải là danh sách các biến được phân tách bằng dấu hai chấm.
Nguồn mô-đun
Con rối hỗ trợ một vị trí khác để lưu trữ các mô-đun. Bất kỳ mô-đun nào cũng có thể được lưu trữ trong hệ thống tệp khác nhau của bất kỳ máy cụ thể nào. Tuy nhiên, tất cả các đường dẫn nơi mô-đun được lưu trữ phải được chỉ định trong biến cấu hình được gọi làmodulepath nói chung, một biến đường dẫn nơi Puppet quét tất cả các thư mục mô-đun và tải chúng lên khi nó đang khởi động.
Một đường dẫn mặc định hợp lý có thể được định cấu hình là:
/etc/puppet/modules:/usr/share/puppet:/var/lib/modules.
Ngoài ra, thư mục / etc / rối có thể được thiết lập như một mô-đun ẩn danh đặc biệt, luôn được tìm kiếm đầu tiên.
Đặt tên mô-đun
Con rối tuân theo cùng một tiêu chuẩn đặt tên của một mô-đun cụ thể, trong đó tên mô-đun phải là các từ bình thường, khớp với [- \\ w +] (chữ cái, từ, số, dấu gạch dưới và dấu gạch ngang) và không chứa dấu phân cách vùng tên:: hoặc /. Mặc dù nó có thể được phép liên quan đến phân cấp mô-đun, nhưng đối với các mô-đun mới, nó không thể được lồng vào nhau.
Mô-đun Tổ chức nội bộ
Khi người dùng tạo một mô-đun mới trong Puppet, nó sẽ tuân theo cùng một cấu trúc và chứa tệp kê khai, tệp phân phối, plugin và mẫu được sắp xếp theo cấu trúc thư mục cụ thể như được hiển thị trong đoạn mã sau.
MODULE_PATH/
downcased_module_name/
files/
manifests/
init.pp
lib/
puppet/
parser/
functions
provider/
type/
facter/
templates/
README
Bất cứ khi nào một mô-đun được tạo, nó chứa init.pptệp kê khai tại vị trí sửa chữa được chỉ định bên trong thư mục tệp kê khai. Tệp kê khai này là tệp mặc định thực thi đầu tiên trong bất kỳ mô-đun cụ thể nào và chứa tập hợp tất cả các lớp được liên kết với mô-đun cụ thể đó. Bổ sung.pptệp có thể được thêm trực tiếp trong thư mục tệp kê khai. Nếu chúng tôi đang thêm các tệp .pp bổ sung, chúng phải được đặt tên theo lớp.
Một trong những tính năng chính đạt được khi sử dụng mô-đun là chia sẻ mã. Về bản chất, một mô-đun phải là độc lập có nghĩa là người ta có thể bao gồm bất kỳ mô-đun nào từ bất kỳ đâu và thả nó vào đường dẫn mô-đun, được tải khi Puppet khởi động. Với sự trợ giúp của các mô-đun, người ta có được tính mô-đun trong mã hóa cơ sở hạ tầng Con rối.
Thí dụ
Hãy xem xét mô-đun autofs cài đặt bản đồ auto.homes cố định và tạo auto.master từ các mẫu.
class autofs {
package { autofs: ensure => latest }
service { autofs: ensure => running }
file { "/etc/auto.homes":
source => "puppet://$servername/modules/autofs/auto.homes"
}
file { "/etc/auto.master":
content => template("autofs/auto.master.erb")
}
}
Hệ thống tệp sẽ có các tệp sau.
MODULE_PATH/
autofs/
manifests/
init.pp
files/
auto.homes
templates/
auto.master.erb
Tra cứu mô-đun
Con rối tuân theo một cấu trúc được xác định trước, trong đó nó chứa nhiều thư mục và thư mục con trong một cấu trúc xác định. Các thư mục này chứa các loại tệp khác nhau được mô-đun yêu cầu để thực hiện các hành động nhất định. Một chút phép thuật hậu trường đảm bảo rằng tệp phù hợp được liên kết với ngữ cảnh phù hợp. Tất cả các tìm kiếm mô-đun đều nằm trong đường dẫn mô-đun, một danh sách các thư mục được phân tách bằng dấu hai chấm.
Đối với tham chiếu tệp trên máy chủ tệp, một tham chiếu tương tự được sử dụng để tham chiếu đến con rối: //$servername/modules/autofs/auto.homes phân giải tệp autofs / files / auto.homes trong đường dẫn của mô-đun.
Để làm cho một mô-đun có thể sử dụng được với cả máy khách dòng lệnh và trình điều khiển con rối, người ta có thể sử dụng một URL của đường dẫn từ con rối: ///. tức là một URL không có tên máy chủ rõ ràng. URL như vậy được xử lý hơi khác bởiPuppet và puppetd. Con rối tìm kiếm URL không máy chủ trong hệ thống tệp cục bộ.
Tệp mẫu được tìm kiếm theo cách tương tự như tệp kê khai và tệp: việc đề cập đến mẫu (“autofs / auto.master.erb”) sẽ khiến người quản lý rối tìm kiếm tệp đầu tiên trong $templatedir/autofs/auto.master.erb và sau đó autofs/templates/auto.master.erbtrên đường dẫn mô-đun. Với các phiên bản Con rối của mọi thứ trong Con rối, nó có sẵn để sử dụng. Điều này được gọi là tự động tải mô-đun. Con rối sẽ cố gắng tự động tải các lớp và định nghĩa từ mô-đun.
Puppet tuân theo khái niệm máy khách và máy chủ trong đó một máy trong một thiết lập hoạt động như máy chủ với phần mềm máy chủ Puppet đang chạy trên đó và máy còn lại hoạt động như máy khách với phần mềm tác nhân Puppet chạy trên đó. Tính năng này của máy chủ tệp giúp sao chép tệp xung quanh nhiều máy. Tính năng này của chức năng phục vụ tệp trong Puppet là một phần của daemon Puppet trung tâm. Puppetmasterd và hàm khách hàng đóng vai trò quan trọng trong việc tìm nguồn cung cấp các thuộc tính tệp làm đối tượng tệp.
class { 'java':
package => 'jdk-8u25-linux-x64',
java_alternative => 'jdk1.8.0_25',
java_alternative_path => '/usr/java/jdk1.8.0_25/jre/bin/java'
}
Như trong đoạn mã trên, các chức năng phân phát tệp của Puppet tóm tắt cấu trúc liên kết hệ thống tệp cục bộ bằng cách hỗ trợ mô-đun dịch vụ tệp. Chúng tôi sẽ chỉ định mô-đun phục vụ tệp theo cách sau.
“puppet://server/modules/module_name/sudoers”
Định dạng tệp
Trong cấu trúc thư mục Con rối, theo mặc định, cấu hình máy chủ tệp được đặt dưới /etc/puppet/fileserver.config thư mục, nếu người dùng muốn thay đổi đường dẫn tệp cấu hình mặc định này, nó có thể được thực hiện bằng cách sử dụng cờ cấu hình mới để puppetmasterd. Tệp cấu hình giống tệp INI nhưng không hoàn toàn giống nhau.
[module]
path /path/to/files
allow *.domain.com
deny *.wireless.domain.com
Như được hiển thị trong đoạn mã trên, tất cả ba tùy chọn đều được thể hiện trong tệp cấu hình. Tên mô-đun phần nào nằm trong dấu ngoặc. Đường dẫn là lựa chọn bắt buộc duy nhất. Tùy chọn bảo mật mặc định là từ chối tất cả quyền truy cập, vì vậy nếu không có dòng cho phép nào được chỉ định, thì mô-đun sẽ được định cấu hình sẽ khả dụng cho bất kỳ ai.
Đường dẫn có thể chứa bất kỳ hoặc tất cả% d,% h và% H được thay thế động bằng tên miền, tên máy chủ và tên máy chủ đủ điều kiện. Tất cả đều được lấy từ chứng chỉ SSL của khách hàng (vì vậy hãy cẩn thận nếu có một tên máy chủ và tên chứng chỉ không khớp). Điều này hữu ích là tạo các mô-đun nơi các tệp của mỗi máy khách được giữ hoàn toàn riêng biệt. Ví dụ, đối với khóa máy chủ riêng.
[private]
path /data/private/%h
allow *
Trong đoạn mã trên, mã đang cố gắng tìm kiếm tệp /private/file.txt từ máy khách client1.vipin.com. Nó sẽ tìm kiếm nó trong /data/private/client1/file.txt, trong khi yêu cầu tương tự cho client2.vipin.com sẽ cố gắng truy xuất tệp /data/private/client2/file.txt trên máy chủ tệp.
Bảo vệ
Puppet hỗ trợ hai khái niệm cơ bản về bảo mật tệp trên máy chủ tệp Puppet. Điều này đạt được bằng cách cho phép truy cập vào các tệp cụ thể và từ chối quyền truy cập vào những tệp không bắt buộc. Theo mặc định, Puppet không cho phép truy cập vào bất kỳ tệp nào. Nó cần được định nghĩa một cách rõ ràng. Định dạng có thể được sử dụng trong các tệp để cho phép hoặc từ chối quyền truy cập bằng cách sử dụng địa chỉ IP, tên hoặc cho phép chung.
Nếu máy khách không được kết nối trực tiếp với máy chủ tệp Con rối, chẳng hạn như sử dụng proxy ngược và Mongrel, thì máy chủ tệp sẽ thấy tất cả các kết nối đến từ máy chủ proxy chứ không phải máy khách Con rối. Trong các trường hợp trên, hạn chế tên máy chủ trên cơ sở tên máy chủ là cách tốt nhất.
Một điểm chính cần lưu ý khi xác định cấu trúc tệp là, tất cả các câu lệnh từ chối đều được phân tích cú pháp trước câu lệnh allow. Do đó, nếu bất kỳ câu lệnh từ chối nào khớp với một máy chủ, thì máy chủ đó sẽ bị từ chối và nếu không có câu lệnh allow nào được viết trong các tệp sắp tới thì máy chủ đó sẽ bị từ chối. Tính năng này giúp thiết lập mức độ ưu tiên của bất kỳ trang web cụ thể nào.
Tên máy chủ
Trong bất kỳ cấu hình máy chủ tệp nào, tên máy chủ tệp có thể được chỉ định theo hai cách bằng cách sử dụng tên máy chủ hoàn chỉnh hoặc chỉ định toàn bộ tên miền bằng cách sử dụng ký tự đại diện * như trong ví dụ sau.
[export]
path /usr
allow brcleprod001.brcl.com
allow *.brcl.com
deny brcleprod002.brcl.com
Địa chỉ IP
Trong bất kỳ cấu hình máy chủ tệp nào, địa chỉ tệp có thể được chỉ định tương tự như tên máy chủ lưu trữ, sử dụng địa chỉ IP hoàn chỉnh hoặc địa chỉ ký tự đại diện. Người ta cũng có thể sử dụng ký hiệu hệ thống CIDR.
[export]
path /usr
allow 127.0.0.1
allow 172.223.30.*
allow 172.223.30.0/24
Cho phép toàn cầu
Cho phép toàn cầu được sử dụng khi người dùng muốn mọi người có thể truy cập vào một mô-đun cụ thể. Để làm điều này, một ký tự đại diện duy nhất giúp cho phép mọi người truy cập vào mô-đun.
[export]
path /export
allow *
Con rối hỗ trợ giữ nhiều giá trị như một biến môi trường. Tính năng này được hỗ trợ trong Puppet bằng cách sử dụngfacter. Trong Puppet, facter là một công cụ độc lập chứa biến mức môi trường. Có thể coi In tương tự như biến env của Bash hoặc Linux. Đôi khi có thể có sự trùng lặp giữa thông tin được lưu trữ trong dữ kiện và biến môi trường của máy. Trong Con rối, cặp khóa-giá trị được gọi là "sự thật". Mỗi tài nguyên có các dữ kiện riêng và trong Puppet, người dùng có đòn bẩy để xây dựng các dữ kiện tùy chỉnh của riêng họ.
# facter
Facter commandcó thể được sử dụng để liệt kê tất cả các biến môi trường khác nhau và các giá trị liên quan của nó. Bộ sưu tập các dữ kiện này đi kèm với các dữ kiện bên ngoài và được gọi là dữ kiện cốt lõi. Người ta có thể thêm các dữ kiện tùy chỉnh vào bộ sưu tập.
Nếu một người chỉ muốn xem một biến. Nó có thể được thực hiện bằng cách sử dụng lệnh sau.
# facter {Variable Name}
Example
[root@puppetmaster ~]# facter virtual
virtualbox
Lý do tại sao facter quan trọng đối với Puppet là vì facter và các dữ kiện có sẵn trong mã Puppet như “global variable”, có nghĩa là nó có thể được sử dụng trong mã tại bất kỳ thời điểm nào mà không cần tham chiếu nào khác.
Ví dụ để kiểm tra
[root@puppetmaster modules]# tree brcle_account
brcle_account
└── manifests └── init.pp [root@puppetmaster modules]# cat brcle_account/manifests/init.pp
class brcle_account {
user { 'G01063908':
ensure => 'present',
uid => '121',
shell => '/bin/bash',
home => '/home/G01063908',
}
file {'/tmp/userfile.txt':
ensure => file,
content => "the value for the 'OperatingSystem' fact is: $OperatingSystem \n",
}
}
Kiểm tra nó
[root@puppetmaster modules]# puppet agent --test
Notice: /Stage[main]/Activemq::Service/Service[activemq]/ensure:
ensure changed 'stopped' to 'running'
Info: /Stage[main]/Activemq::Service/Service[activemq]:
Unscheduling refresh on Service[activemq]
Notice: Finished catalog run in 4.09 seconds
[root@puppetmaster modules]# cat /tmp/testfile.txt
the value for the 'OperatingSystem' fact is: Linux
[root@puppetmaster modules]# facter OperatingSystem
Linux
Như chúng ta có thể nhận thấy trong đoạn mã trên, chúng tôi chưa xác định OperatingSystem. Chúng tôi vừa thay thế giá trị bằng giá trị được mã hóa mềm$OperatingSystem như biến bình thường.
Trong Puppet, có ba loại dữ kiện có thể được sử dụng và xác định -
- Sự kiện cốt lõi
- Sự kiện tùy chỉnh
- Sự kiện bên ngoài
Sự kiện cốt lõi được xác định ở cấp cao nhất và tất cả mọi người đều có thể truy cập vào bất kỳ điểm nào trong mã.
Sự kiện về con rối
Ngay trước khi tác nhân yêu cầu một danh mục từ chủ, trước tiên tác nhân phải biên soạn một danh sách đầy đủ thông tin có sẵn dưới dạng một cặp giá trị khóa. Thông tin về tác nhân được thu thập bằng một công cụ có tên là facter và mỗi cặp khóa-giá trị được gọi là một dữ kiện. Sau đây là kết quả chung của các dữ kiện về một đại lý.
[root@puppetagent1 ~]# facter
architecture => x86_64
augeasversion => 1.0.0
bios_release_date => 13/09/2012
bios_vendor => innotek GmbH
bios_version => VirtualBox
blockdevice_sda_model => VBOX HARDDISK
blockdevice_sda_size => 22020587520
blockdevice_sda_vendor => ATA
blockdevice_sr0_model => CD-ROM
blockdevice_sr0_size => 1073741312
blockdevice_sr0_vendor => VBOX
blockdevices => sda,sr0
boardmanufacturer => Oracle Corporation
boardproductname => VirtualBox
boardserialnumber => 0
domain => codingbee.dyndns.org
facterversion => 2.1.0
filesystems => ext4,iso9660
fqdn => puppetagent1.codingbee.dyndns.org
hardwareisa => x86_64
hardwaremodel => x86_64
hostname => puppetagent1
id => root
interfaces => eth0,lo
ipaddress => 172.228.24.01
ipaddress_eth0 => 172.228.24.01
ipaddress_lo => 127.0.0.1
is_virtual => true
kernel => Linux
kernelmajversion => 2.6
kernelrelease => 2.6.32-431.23.3.el6.x86_64
kernelversion => 2.6.32
lsbdistcodename => Final
lsbdistdescription => CentOS release 6.5 (Final)
lsbdistid => CentOS
lsbdistrelease => 6.5
lsbmajdistrelease => 6
lsbrelease => :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0noarch:graphics-4.0-amd64:
graphics-4.0-noarch:printing-4.0-amd64:printing-4.0noarch
macaddress => 05:00:22:47:H9:77
macaddress_eth0 => 05:00:22:47:H9:77
manufacturer => innotek GmbH
memoryfree => 125.86 GB
memoryfree_mb => 805.86
memorysize => 500 GB
memorysize_mb => 996.14
mtu_eth0 => 1500
mtu_lo => 16436
netmask => 255.255.255.0
netmask_eth0 => 255.255.255.0
network_lo => 127.0.0.0
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.5
osfamily => RedHat
partitions => {"sda1"=>{
"uuid"=>"d74a4fa8-0883-4873-8db0-b09d91e2ee8d", "size" =>"1024000",
"mount" => "/boot", "filesystem" => "ext4"}, "sda2"=>{"size" => "41981952",
"filesystem" => "LVM2_member"}
}
path => /usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
physicalprocessorcount => 1
processor0 => Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
processor1 => Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
processor2 => Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
processorcount => 3
productname => VirtualBox
ps => ps -ef
puppetversion => 3.6.2
rubysitedir => /usr/lib/ruby/site_ruby/1.8
rubyversion => 1.8.7
selinux => true
selinux_config_mode => enforcing
selinux_config_policy => targeted
selinux_current_mode => enforcing
selinux_enforced => true
selinux_policyversion => 24
serialnumber => 0
sshdsakey => AAAAB3NzaC1kc3MAAACBAK5fYwRM3UtOs8zBCtRTjuHLw56p94X/E0UZBZwFR3q7
WH0x5+MNsjfmdCxKvpY/WlIIUcFJzvlfjXm4qDaTYalbzSZJMT266njNbw5WwLJcJ74KdW92ds76pjgm
CsjAh+R9YnyKCEE35GsYjGH7whw0gl/rZVrjvWYKQDOmJA2dAAAAFQCoYABgjpv3EkTWgjLIMnxA0Gfud
QAAAIBM4U6/nerfn6Qvt43FC2iybvwVo8ufixJl5YSEhs92uzsW6jiw68aaZ32q095/gEqYzeF7a2knr
OpASgO9xXqStYKg8ExWQVaVGFTR1NwqhZvz0oRSbrN3h3tHgknoKETRAg/imZQ2P6tppAoQZ8wpuLrXU
CyhgJGZ04Phv8hinAAAAIBN4xaycuK0mdH/YdcgcLiSn8cjgtiETVzDYa+jF
swapfree => 3.55 GB
swapfree_mb => 2015.99
swapsize => 3.55 GB
swapsize_mb => 2015.99
timezone => GMT
type => Other
uniqueid => a8c0af01
uptime => 45:012 hours
uptime_days => 0
uptime_hours => 6
uptime_seconds => 21865
uuid => BD8B9D85-1BFD-4015-A633-BF71D9A6A741
virtual => virtualbox
Trong đoạn mã trên, chúng ta có thể thấy một số dữ liệu trùng lặp với một số thông tin có sẵn trong biến bash “env”. Con rối trực tiếp không sử dụng dữ liệu, thay vào đó nó sử dụng dữ liệu thừa, dữ liệu Facter được coi là biến toàn cục.
Các dữ kiện sau đó có sẵn dưới dạng biến cấp cao nhất và người điều khiển Con rối có thể sử dụng chúng để biên dịch danh mục Con rối cho tác nhân yêu cầu. Các yếu tố được gọi trong tệp kê khai dưới dạng biến bình thường với tiền tố $.
Thí dụ
if ($OperatingSystem == "Linux") {
$message = "This machine OS is of the type $OperatingSystem \n"
} else {
$message = "This machine is unknown \n" } file { "/tmp/machineOperatingSystem.txt": ensure => file, content => "$message"
}
Tệp kê khai ở trên chỉ làm phiền về một tệp duy nhất được gọi là machineOperatingSystem.txt, trong đó nội dung của tệp này được khấu trừ bởi thực tế được gọi là OperatingSystem.
[root@puppetagent1 /]# facter OperatingSystem
Linux
[root@puppetagent1 /]# puppet apply /tmp/ostype.pp
Notice: Compiled catalog for puppetagent1.codingbee.dyndns.org
in environment production in 0.07 seconds
Notice: /Stage[main]/Main/File[/tmp/machineOperatingSystem.txt]/ensure:
defined content as '{md5}f59dc5797d5402b1122c28c6da54d073'
Notice: Finished catalog run in 0.04 seconds
[root@puppetagent1 /]# cat /tmp/machinetype.txt
This machine OS is of the type Linux
Sự kiện tùy chỉnh
Tất cả những sự thật mà chúng ta đã thấy ở trên đều là những sự thật cốt lõi của máy. Người ta có thể thêm dữ kiện tùy chỉnh này vào nút theo những cách sau:
- Sử dụng cú pháp “export FACTER…”
- Sử dụng cài đặt $ LOAD_PATH
- FACTERLIB
- Pluginsync
Sử dụng cú pháp "export FACTER"
Người ta có thể thêm dữ kiện theo cách thủ công bằng cú pháp export FACTER_ {fact's name}.
Thí dụ
[root@puppetagent1 facter]# export FACTER_tallest_mountain="Everest"
[root@puppetagent1 facter]# facter tallest_mountain Everest
Sử dụng Cài đặt $ LOAD_PATH
Trong Ruby, $LOAD_PATH is equivalent to Bash special parameter. Although it is similar to bash $Biến PATH, trong thực tế $ LOAD_PATH không phải là một biến môi trường, thay vào đó nó là một biến được xác định trước.
$ LOAD_PATH có từ đồng nghĩa “$:”. Biến này là một mảng để tìm kiếm và tải các giá trị.
[root@puppetagent1 ~]# ruby -e 'puts $LOAD_PATH'
# note you have to use single quotes.
/usr/lib/ruby/site_ruby/1.6
/usr/lib64/ruby/site_ruby/1.6
/usr/lib64/ruby/site_ruby/1.6/x86_64-linux
/usr/lib/ruby/site_ruby
/usr/lib64/ruby/site_ruby
/usr/lib64/site_ruby/1.6
/usr/lib64/site_ruby/1.6/x86_64-linux
/usr/lib64/site_ruby
/usr/lib/ruby/1.6
/usr/lib64/ruby/1.6
/usr/lib64/ruby/1.6/x86_64-linux
Hãy lấy một ví dụ về việc tạo một thừa số thư mục và thêm một .pp tệp và nối một nội dung vào đó.
[root@puppetagent1 ~]# cd /usr/lib/ruby/site_ruby/
[root@puppetagent1 site_ruby]# mkdir facter
[root@puppetagent1 site_ruby]# cd facter/
[root@puppetagent1 facter]# ls
[root@puppetagent1 facter]# touch newadded_facts.rb
Thêm nội dung sau vào tệp custom_facts.rb.
[root@puppetagent1 facter]# cat newadded_facts.rb
Facter.add('tallest_mountain') do
setcode "echo Everest"
end
Facter hoạt động theo phương pháp quét qua tất cả các thư mục được liệt kê trong $ LOAD_PATH và tìm kiếm một giám đốc có tên là facter. Khi nó tìm thấy thư mục cụ thể đó, nó sẽ tải chúng ở bất kỳ đâu trong cấu trúc thư mục. Nếu nó tìm thấy thư mục này thì nó sẽ tìm kiếm bất kỳ tệp Ruby nào trong thư mục facter đó và tải tất cả các dữ kiện đã xác định về bất kỳ cấu hình cụ thể nào trong bộ nhớ.
Sử dụng FACTERLIB
Trong Puppet, FACTERLIB hoạt động rất giống với $ LOAD_PATH nhưng chỉ có một điểm khác biệt chính, đó là một tham số môi trường cấp hệ điều hành chứ không phải là một biến đặc biệt của Ruby. Theo mặc định, biến môi trường có thể không được đặt.
[root@puppetagent1 facter]# env | grep "FACTERLIB"
[root@puppetagent1 facter]#
Để kiểm tra FACTERLIB, chúng ta cần thực hiện các bước sau.
Tạo một thư mục có tên test_facts theo cấu trúc sau.
[root@puppetagent1 tmp]# tree /tmp/test_facts/
/tmp/some_facts/
├── vipin
│ └── longest_river.rb
└── testing
└── longest_wall.rb
Thêm nội dung sau vào tệp .rb.
[root@puppetagent1 vipin]# cat longest_river.rb
Facter.add('longest_river') do
setcode "echo Nile"
end
[root@puppetagent1 testing]# cat longest_wall.rb
Facter.add('longest_wall') do
setcode "echo 'China Wall'"
end
Sử dụng câu lệnh xuất.
[root@puppetagent1 /]# export
FACTERLIB = "/tmp/some_facts/river:/tmp/some_facts/wall"
[root@puppetagent1 /]# env | grep "FACTERLIB"
FACTERLIB = /tmp/some_facts/river:/tmp/some_facts/wall
Kiểm tra nhân tố mới.
[root@puppetagent1 /]# facter longest_river
Nile
[root@puppetagent1 /]# facter longest_wall
China Wall
Sự kiện bên ngoài
Dữ kiện bên ngoài rất hữu ích khi người dùng muốn áp dụng một số dữ kiện mới được tạo tại thời điểm cung cấp. Dữ liệu bên ngoài là một trong những cách chính để áp dụng siêu dữ liệu cho máy ảo ở giai đoạn cung cấp (ví dụ: sử dụng vSphere, OpenStack, AWS, v.v.)
Tất cả siêu dữ liệu và các chi tiết của nó được tạo ra có thể được Puppet sử dụng để xác định những chi tiết nào nên có trong danh mục sẽ được áp dụng.
Tạo sự thật bên ngoài
Trên máy đại lý, chúng ta cần tạo một thư mục như đề cập bên dưới.
$ mkdir -p /etc/facter/facts.d
Tạo một tập lệnh Shell trong thư mục với nội dung sau.
$ ls -l /etc/facter/facts.d
total 4
-rwxrwxrwx. 1 root root 65 Sep 18 13:11 external-factstest.sh
$ cat /etc/facter/facts.d/external-factstest.sh
#!/bin/bash
echo "hostgroup = dev"
echo "environment = development"
Thay đổi quyền của tệp script.
$ chmod u+x /etc/facter/facts.d/external-facts.sh
Sau khi hoàn tất, bây giờ chúng ta có thể thấy biến hiện diện với cặp khóa / giá trị.
$ facter hostgroup dev $ facter environment
development
Người ta có thể viết các dữ kiện tùy chỉnh trong Puppet. Để tham khảo, hãy sử dụng liên kết sau từ trang Con rối.
https://docs.puppet.com/facter/latest/fact_overview.html#writing-structured-facts
Tài nguyên là một trong những đơn vị cơ bản quan trọng của Puppet được sử dụng để thiết kế và xây dựng bất kỳ cơ sở hạ tầng cụ thể hoặc máy móc nào. Chúng chủ yếu được sử dụng để mô hình hóa và duy trì cấu hình hệ thống. Puppet có nhiều loại tài nguyên, có thể được sử dụng để xác định kiến trúc hệ thống hoặc người dùng có đòn bẩy để xây dựng và xác định một tài nguyên mới.
Khối mã Puppet trong tệp kê khai hoặc bất kỳ tệp nào khác được gọi là khai báo tài nguyên. Khối mã được viết bằng ngôn ngữ gọi là Ngôn ngữ mô hình hóa khai báo (DML). Sau đây là một ví dụ về cách nó trông như thế nào.
user { 'vipin':
ensure => present,
uid => '552',
shell => '/bin/bash',
home => '/home/vipin',
}
Trong Puppet, khai báo tài nguyên cho bất kỳ loại tài nguyên cụ thể nào được thực hiện trong khối mã. Trong ví dụ sau, người dùng được tạo thành chủ yếu từ bốn tham số được xác định trước.
Resource Type - Trong đoạn mã trên, đó là người dùng.
Resource Parameter - Trong đoạn mã trên, nó là Vipin.
Attributes - Trong đoạn mã trên, nó là ensure, uid, shell, home.
Values - Đây là các giá trị tương ứng với từng thuộc tính.
Mỗi loại tài nguyên có cách xác định định nghĩa và tham số riêng và người dùng có đặc quyền chọn và chọn cách họ muốn tài nguyên của mình trông như thế nào.
Loại tài nguyên
Có nhiều loại tài nguyên khác nhau có sẵn trong Puppet có cách hoạt động của riêng chúng. Có thể xem các loại tài nguyên này bằng lệnh “description” cùng với tùy chọn “-list”.
[root@puppetmaster ~]# puppet describe --list
These are the types known to puppet:
augeas - Apply a change or an array of changes to the ...
computer - Computer object management using DirectorySer ...
cron - Installs and manages cron jobs
exec - Executes external commands
file - Manages files, including their content, owner ...
filebucket - A repository for storing and retrieving file ...
group - Manage groups
host - Installs and manages host entries
interface - This represents a router or switch interface
k5login - Manage the ‘.k5login’ file for a user
macauthorization - Manage the Mac OS X authorization database
mailalias - .. no documentation ..
maillist - Manage email lists
mcx - MCX object management using DirectoryService ...
mount - Manages mounted filesystems, including puttin ...
nagios_command - The Nagios type command
nagios_contact - The Nagios type contact
nagios_contactgroup - The Nagios type contactgroup
nagios_host - The Nagios type host
nagios_hostdependency - The Nagios type hostdependency
nagios_hostescalation - The Nagios type hostescalation
nagios_hostextinfo - The Nagios type hostextinfo
nagios_hostgroup - The Nagios type hostgroup
nagios_service - The Nagios type service
nagios_servicedependency - The Nagios type servicedependency
nagios_serviceescalation - The Nagios type serviceescalation
nagios_serviceextinfo - The Nagios type serviceextinfo
nagios_servicegroup - The Nagios type servicegroup
nagios_timeperiod - The Nagios type timeperiod
notify - .. no documentation ..
package - Manage packages
resources - This is a metatype that can manage other reso ...
router - .. no documentation ..
schedule - Define schedules for Puppet
scheduled_task - Installs and manages Windows Scheduled Tasks
selboolean - Manages SELinux booleans on systems with SELi ...
service - Manage running services
ssh_authorized_key - Manages SSH authorized keys
sshkey - Installs and manages ssh host keys
stage - A resource type for creating new run stages
tidy - Remove unwanted files based on specific crite ...
user - Manage users
vlan - .. no documentation ..
whit - Whits are internal artifacts of Puppet's curr ...
yumrepo - The client-side description of a yum reposito ...
zfs - Manage zfs
zone - Manages Solaris zones
zpool - Manage zpools
Tiêu đề tài nguyên
Trong đoạn mã trên, chúng tôi có tiêu đề tài nguyên là vipin, tiêu đề này là duy nhất cho mỗi tài nguyên được sử dụng trong cùng một tệp của mã. Đây là một tiêu đề duy nhất cho loại tài nguyên người dùng này. Chúng ta không thể có một tài nguyên trùng tên vì nó sẽ gây ra xung đột.
Lệnh Resource có thể được sử dụng để xem danh sách tất cả các tài nguyên bằng cách sử dụng type user.
[root@puppetmaster ~]# puppet resource user
user { 'abrt':
ensure => 'present',
gid => '173',
home => '/etc/abrt',
password => '!!',
password_max_age => '-1',
password_min_age => '-1',
shell => '/sbin/nologin',
uid => '173',
}
user { 'admin':
ensure => 'present',
comment => 'admin',
gid => '444',
groups => ['sys', 'admin'],
home => '/var/admin',
password => '*',
password_max_age => '99999',
password_min_age => '0',
shell => '/sbin/nologin',
uid => '55',
}
user { 'tomcat':
ensure => 'present',
comment => 'tomcat',
gid => '100',
home => '/var/www',
password => '!!',
password_max_age => '-1',
password_min_age => '-1',
shell => '/sbin/nologin',
uid => '100',
}
Liệt kê các tài nguyên của một người dùng cụ thể
[root@puppetmaster ~]# puppet resource user tomcat
user { 'apache':
ensure => 'present',
comment => 'tomcat',
gid => '100',
home => '/var/www',
password => '!!',
password_max_age => '-1',
password_min_age => '-1',
shell => '/sbin/nologin',
uid => '100’,
}
Thuộc tính & Giá trị
Phần chính của bất kỳ tài nguyên nào được tạo thành từ một tập hợp các cặp giá trị-thuộc tính. Ở đây người ta có thể chỉ định các giá trị cho thuộc tính của một tài nguyên nhất định. Mỗi loại tài nguyên có một bộ thuộc tính riêng có thể được định cấu hình bằng các cặp khóa-giá trị.
Mô tả lệnh con có thể được sử dụng để biết thêm chi tiết về một thuộc tính tài nguyên cụ thể. Trong ví dụ sau, chúng ta có các chi tiết về tài nguyên người dùng cùng với tất cả các thuộc tính có thể định cấu hình của nó.
[root@puppetmaster ~]# puppet describe user
user
====
Manage users. This type is mostly built to manage system users,
so it is lacking some features useful for managing normal users.
This resource type uses the prescribed native tools for creating groups
and generally uses POSIX APIs for retrieving information about them.
It does not directly modify ‘/etc/passwd’ or anything.
**Autorequires:** If Puppet is managing the user's primary group
(as provided in the ‘gid’ attribute),
the user resource will autorequire that group.
If Puppet is managing any role accounts corresponding to the user's roles,
the user resource will autorequire those role accounts.
Parameters
----------
- **allowdupe**
Whether to allow duplicate UIDs. Defaults to ‘false’.
Valid values are ‘true’, ‘false’, ‘yes’, ‘no’.
- **attribute_membership**
Whether specified attribute value pairs should be treated as the
**complete list** (‘inclusive’) or the **minimum list** (‘minimum’) of
attribute/value pairs for the user. Defaults to ‘minimum’.
Valid values are ‘inclusive’, ‘minimum’.
- **auths**
The auths the user has. Multiple auths should be
specified as an array.
Requires features manages_solaris_rbac.
- **comment**
A description of the user. Generally the user's full name.
- **ensure**
The basic state that the object should be in.
Valid values are ‘present’, ‘absent’, ‘role’.
- **expiry**
The expiry date for this user. Must be provided in
a zero-padded YYYY-MM-DD format --- e.g. 2010-02-19.
If you want to make sure the user account does never
expire, you can pass the special value ‘absent’.
Valid values are ‘absent’. Values can match ‘/^\d{4}-\d{2}-\d{2}$/’. Requires features manages_expiry. - **forcelocal** Forces the mangement of local accounts when accounts are also being managed by some other NSS - **gid** The user's primary group. Can be specified numerically or by name. This attribute is not supported on Windows systems; use the ‘groups’ attribute instead. (On Windows, designating a primary group is only meaningful for domain accounts, which Puppet does not currently manage.) - **groups** The groups to which the user belongs. The primary group should not be listed, and groups should be identified by name rather than by GID. Multiple groups should be specified as an array. - **home** The home directory of the user. The directory must be created separately and is not currently checked for existence. - **ia_load_module** The name of the I&A module to use to manage this user. Requires features manages_aix_lam. - **iterations** This is the number of iterations of a chained computation of the password hash (http://en.wikipedia.org/wiki/PBKDF2). This parameter is used in OS X. This field is required for managing passwords on OS X >= 10.8. Requires features manages_password_salt. - **key_membership** - **managehome** Whether to manage the home directory when managing the user. This will create the home directory when ‘ensure => present’, and delete the home directory when ‘ensure => absent’. Defaults to ‘false’. Valid values are ‘true’, ‘false’, ‘yes’, ‘no’. - **membership** Whether specified groups should be considered the **complete list** (‘inclusive’) or the **minimum list** (‘minimum’) of groups to which the user belongs. Defaults to ‘minimum’. Valid values are ‘inclusive’, ‘minimum’. - **name** The user name. While naming limitations vary by operating system, it is advisable to restrict names to the lowest common denominator, which is a maximum of 8 characters beginning with a letter. Note that Puppet considers user names to be case-sensitive, regardless of the platform's own rules; be sure to always use the same case when referring to a given user. - **password** The user's password, in whatever encrypted format the local system requires. * Most modern Unix-like systems use salted SHA1 password hashes. You can use Puppet's built-in ‘sha1’ function to generate a hash from a password. * Mac OS X 10.5 and 10.6 also use salted SHA1 hashes. Windows API for setting the password hash. [stdlib]: https://github.com/puppetlabs/puppetlabs-stdlib/ Be sure to enclose any value that includes a dollar sign ($) in single
quotes (') to avoid accidental variable interpolation.
Requires features manages_passwords.
- **password_max_age**
The maximum number of days a password may be used before it must be changed.
Requires features manages_password_age.
- **password_min_age**
The minimum number of days a password must be used before it may be changed.
Requires features manages_password_age.
- **profile_membership**
Whether specified roles should be treated as the **complete list**
(‘inclusive’) or the **minimum list** (‘minimum’) of roles
of which the user is a member. Defaults to ‘minimum’.
Valid values are ‘inclusive’, ‘minimum’.
- **profiles**
The profiles the user has. Multiple profiles should be
specified as an array.
Requires features manages_solaris_rbac.
- **project**
The name of the project associated with a user.
Requires features manages_solaris_rbac.
- **uid**
The user ID; must be specified numerically. If no user ID is
specified when creating a new user, then one will be chosen
automatically. This will likely result in the same user having
different UIDs on different systems, which is not recommended. This is
especially noteworthy when managing the same user on both Darwin and
other platforms, since Puppet does UID generation on Darwin, but
the underlying tools do so on other platforms.
On Windows, this property is read-only and will return the user's
security identifier (SID).
Trong Puppet, Lớp trừu tượng tài nguyên (RAL) có thể được coi là mô hình được khái niệm hóa cốt lõi mà trên đó toàn bộ cơ sở hạ tầng và thiết lập Puppet hoạt động. Trong RAL, mỗi bảng chữ cái có ý nghĩa riêng được định nghĩa như sau.
Tài nguyên [R]
Một tài nguyên có thể được coi là tất cả các tài nguyên được sử dụng để mô hình hóa bất kỳ cấu hình nào trong Puppet. Về cơ bản, chúng là các tài nguyên có sẵn, mặc định có trong Puppet. Chúng có thể được coi là một tập hợp các tài nguyên thuộc loại tài nguyên được xác định trước. Chúng tương tự như khái niệm OOP trong bất kỳ ngôn ngữ lập trình nào khác, trong đó đối tượng là một thể hiện của lớp. Trong Puppet, tài nguyên của nó là một thể hiện của một loại tài nguyên.
Tóm tắt [A]
Tính trừu tượng có thể được coi là một tính năng chính trong đó các tài nguyên được định nghĩa độc lập với hệ điều hành đích. Nói cách khác, trong khi viết bất kỳ tệp kê khai nào, người dùng không cần phải lo lắng về máy đích hoặc hệ điều hành có trên máy cụ thể đó. Trong trừu tượng, các tài nguyên cung cấp đủ thông tin về những gì cần tồn tại trên tác nhân Con rối.
Puppet sẽ đảm nhận tất cả các chức năng hoặc phép thuật xảy ra ở hậu trường. Không phụ thuộc vào tài nguyên và hệ điều hành, Puppet sẽ đảm nhận việc triển khai cấu hình trên máy mục tiêu, trong đó người dùng không cần lo lắng về cách Puppet hoạt động ở hậu trường.
Nói một cách trừu tượng, Puppet phân tách các tài nguyên ra khỏi việc triển khai nó. Cấu hình nền tảng cụ thể này tồn tại từ các nhà cung cấp. Chúng ta có thể sử dụng nhiều lệnh con cùng với các trình cung cấp của nó.
Lớp [L]
Có thể người ta định nghĩa toàn bộ thiết lập và cấu hình máy về mặt thu thập tài nguyên và nó có thể được xem và quản lý thông qua giao diện CLI của Puppet.
Ví dụ cho loại tài nguyên người dùng
[root@puppetmaster ~]# puppet describe user --providers
user
====
Manage users.
This type is mostly built to manage systemusers,
so it is lacking some features useful for managing normalusers.
This resource type uses the prescribed native tools for
creating groups and generally uses POSIX APIs for retrieving informationabout them.
It does not directly modify '/etc/passwd' or anything.
- **comment**
A description of the user. Generally the user's full name.
- **ensure**
The basic state that the object should be in.
Valid values are 'present', 'absent', 'role'.
- **expiry**
The expiry date for this user.
Must be provided in a zero-padded YYYY-MM-DD format --- e.g. 2010-02-19.
If you want to make sure the user account does never expire,
you can pass the special value 'absent'.
Valid values are 'absent'.
Values can match '/^\d{4}-\d{2}-\d{2}$/'. Requires features manages_expiry. - **forcelocal** Forces the management of local accounts when accounts are also being managed by some other NSS Valid values are 'true', 'false', 'yes', 'no'. Requires features libuser. - **gid** The user's primary group. Can be specified numerically or by name. This attribute is not supported on Windows systems; use the ‘groups’ attribute instead. (On Windows, designating a primary group is only meaningful for domain accounts, which Puppet does not currently manage.) - **groups** The groups to which the user belongs. The primary group should not be listed, and groups should be identified by name rather than by GID. Multiple groups should be specified as an array. - **home** The home directory of the user. The directory must be created separately and is not currently checked for existence. - **ia_load_module** The name of the I&A module to use to manage this user. Requires features manages_aix_lam. - **iterations** This is the number of iterations of a chained computation of the password hash (http://en.wikipedia.org/wiki/PBKDF2). This parameter is used in OS X. This field is required for managing passwords on OS X >= 10.8. - **key_membership** Whether specified key/value pairs should be considered the **complete list** ('inclusive') or the **minimum list** ('minimum') of the user's attributes. Defaults to 'minimum'. Valid values are 'inclusive', 'minimum'. - **keys** Specify user attributes in an array of key = value pairs. Requires features manages_solaris_rbac. - **managehome** Whether to manage the home directory when managing the user. This will create the home directory when 'ensure => present', and delete the home directory when ‘ensure => absent’. Defaults to ‘false’. Valid values are ‘true’, ‘false’, ‘yes’, ‘no’. - **membership** Whether specified groups should be considered the **complete list** (‘inclusive’) or the **minimum list** (‘minimum’) of groups to which the user belongs. Defaults to ‘minimum’. Valid values are ‘inclusive’, ‘minimum’. - **name** The user name. While naming limitations vary by operating system, it is advisable to restrict names to the lowest common denominator. - **password** The user's password, in whatever encrypted format the local system requires. * Most modern Unix-like systems use salted SHA1 password hashes. You can use Puppet's built-in ‘sha1’ function to generate a hash from a password. * Mac OS X 10.5 and 10.6 also use salted SHA1 hashes. * Mac OS X 10.7 (Lion) uses salted SHA512 hashes. The Puppet Labs [stdlib][] module contains a ‘str2saltedsha512’ function which can generate password hashes for Lion. * Mac OS X 10.8 and higher use salted SHA512 PBKDF2 hashes. When managing passwords on these systems the salt and iterations properties need to be specified as well as the password. [stdlib]: https://github.com/puppetlabs/puppetlabs-stdlib/ Be sure to enclose any value that includes a dollar sign ($) in single
quotes (') to avoid accidental variable interpolation.
Requires features manages_passwords.
- **password_max_age**
The maximum number of days a password may be used before it must be changed.
Requires features manages_password_age.
- **password_min_age**
The minimum number of days a password must be used before it may be changed.
Requires features manages_password_age.
- **profile_membership**
Whether specified roles should be treated as the **complete list**
(‘inclusive’) or the **minimum list** (‘minimum’) of roles
of which the user is a member. Defaults to ‘minimum’.
Valid values are ‘inclusive’, ‘minimum’.
- **profiles**
The profiles the user has. Multiple profiles should be
specified as an array.
Requires features manages_solaris_rbac.
- **project**
The name of the project associated with a user.
Requires features manages_solaris_rbac.
- **purge_ssh_keys**
Purge ssh keys authorized for the user
if they are not managed via ssh_authorized_keys.
When true, looks for keys in .ssh/authorized_keys in the user's home directory.
Possible values are true, false, or an array of
paths to file to search for authorized keys.
If a path starts with ~ or %h, this token is replaced with the user's home directory.
Valid values are ‘true’, ‘false’.
- **role_membership**
Whether specified roles should be considered the **complete list**
(‘inclusive’) or the **minimum list** (‘minimum’) of roles the user has.
Defaults to ‘minimum’.
Valid values are ‘inclusive’, ‘minimum’.
- **roles**
The roles the user has. Multiple roles should be
specified as an array.
Requires features manages_solaris_rbac.
- **salt**
This is the 32 byte salt used to generate the PBKDF2 password used in
OS X. This field is required for managing passwords on OS X >= 10.8.
Requires features manages_password_salt.
- **shell**
The user's login shell. The shell must exist and be
executable.
This attribute cannot be managed on Windows systems.
Requires features manages_shell.
- **system**
Whether the user is a system user, according to the OS's criteria;
on most platforms, a UID less than or equal to 500 indicates a system
user. Defaults to ‘false’.
Valid values are ‘true’, ‘false’, ‘yes’, ‘no’.
- **uid**
The user ID; must be specified numerically. If no user ID is
specified when creating a new user, then one will be chosen
automatically. This will likely result in the same user having
different UIDs on different systems, which is not recommended.
This is especially noteworthy when managing the same user on both Darwin and
other platforms, since Puppet does UID generation on Darwin, but
the underlying tools do so on other platforms.
On Windows, this property is read-only and will return the user's
security identifier (SID).
Providers
---------
- **aix**
User management for AIX.
* Required binaries: '/bin/chpasswd', '/usr/bin/chuser',
'/usr/bin/mkuser', '/usr/sbin/lsgroup', '/usr/sbin/lsuser',
'/usr/sbin/rmuser'.
* Default for ‘operatingsystem’ == ‘aix’.
* Supported features: ‘manages_aix_lam’, ‘manages_expiry’,
‘manages_homedir’, ‘manages_password_age’, ‘manages_passwords’,
‘manages_shell’.
- **directoryservice**
User management on OS X.
* Required binaries: ‘/usr/bin/dscacheutil’, ‘/usr/bin/dscl’,
‘/usr/bin/dsimport’, ‘/usr/bin/plutil’, ‘/usr/bin/uuidgen’.
* Default for ‘operatingsystem’ == ‘darwin’.
* Supported features: ‘manages_password_salt’, ‘manages_passwords’,
‘manages_shell’.
- **hpuxuseradd**
User management for HP-UX. This provider uses the undocumented ‘-F’
switch to HP-UX's special ‘usermod’ binary to work around the fact that
its standard ‘usermod’ cannot make changes while the user is logged in.
* Required binaries: ‘/usr/sam/lbin/useradd.sam’,
‘/usr/sam/lbin/userdel.sam’, ‘/usr/sam/lbin/usermod.sam’.
* Default for ‘operatingsystem’ == ‘hp-ux’.
* Supported features: ‘allows_duplicates’, ‘manages_homedir’,
‘manages_passwords’.
- **ldap**
User management via LDAP.
This provider requires that you have valid values for all of the
LDAP-related settings in ‘puppet.conf’, including ‘ldapbase’.
You will almost definitely need settings for ‘ldapuser’ and ‘ldappassword’ in order
for your clients to write to LDAP.
* Supported features: ‘manages_passwords’, ‘manages_shell’.
- **pw**
User management via ‘pw’ on FreeBSD and DragonFly BSD.
* Required binaries: ‘pw’.
* Default for ‘operatingsystem’ == ‘freebsd, dragonfly’.
* Supported features: ‘allows_duplicates’, ‘manages_expiry’,
‘manages_homedir’, ‘manages_passwords’, ‘manages_shell’.
- **user_role_add**
User and role management on Solaris, via ‘useradd’ and ‘roleadd’.
* Required binaries: ‘passwd’, ‘roleadd’, ‘roledel’, ‘rolemod’,
‘useradd’, ‘userdel’, ‘usermod’.
* Default for ‘osfamily’ == ‘solaris’.
* Supported features: ‘allows_duplicates’, ‘manages_homedir’,
‘manages_password_age’, ‘manages_passwords’, ‘manages_solaris_rbac’.
- **useradd**
User management via ‘useradd’ and its ilk. Note that you will need to
install Ruby's shadow password library (often known as ‘ruby-libshadow’)
if you wish to manage user passwords.
* Required binaries: ‘chage’, ‘luseradd’, ‘useradd’, ‘userdel’, ‘usermod’.
* Supported features: ‘allows_duplicates’, ‘libuser’, ‘manages_expiry’,
‘manages_homedir’, ‘manages_password_age’, ‘manages_passwords’,
‘manages_shell’, ‘system_users’.
- **windows_adsi**
Local user management for Windows.
* Default for 'operatingsystem' == 'windows'.
* Supported features: 'manages_homedir', 'manages_passwords'.
Tài nguyên thử nghiệm
Trong Puppet, việc kiểm tra tài nguyên trực tiếp chỉ ra rằng trước tiên người ta cần áp dụng tài nguyên mà người ta muốn sử dụng để định cấu hình nút đích, để trạng thái của máy thay đổi tương ứng.
Để thử nghiệm, chúng tôi sẽ áp dụng tài nguyên cục bộ. Như chúng ta có một tài nguyên được xác định trước ở trên vớiuser = vipin. Một cách áp dụng tài nguyên là CLI. Điều này có thể được thực hiện bằng cách viết lại tài nguyên hoàn chỉnh thành một lệnh duy nhất và sau đó chuyển nó đến một lệnh con tài nguyên.
puppet resource user vipin ensure = present uid = '505'
shell = '/bin/bash' home = '/home/vipin'
Kiểm tra tài nguyên được áp dụng.
[root@puppetmaster ~]# cat /etc/passwd | grep "vipin"
vipin:x:505:501::/home/vipin:/bin/bash
Kết quả trên cho thấy rằng tài nguyên được áp dụng cho hệ thống và chúng ta có một người dùng mới được tạo với tên là Vipin. Bạn nên tự mình kiểm tra điều này vì tất cả các mã trên đều đã được kiểm tra và là mã hoạt động.
Templatinglà một phương pháp lấy mọi thứ ở định dạng chuẩn, có thể được sử dụng ở nhiều vị trí. Trong Puppet, tạo khuôn mẫu và các mẫu được hỗ trợ bằng cách sử dụng erb, một phần của thư viện Ruby chuẩn, có thể được sử dụng trên các dự án khác ngoài Ruby như trong các dự án Ruby on Rails. Như một cách thực hành tiêu chuẩn, người ta cần có hiểu biết cơ bản về Ruby. Tạo khuôn mẫu rất hữu ích khi người dùng đang cố gắng quản lý nội dung của tệp mẫu. Mẫu đóng một vai trò quan trọng khi không thể quản lý cấu hình bằng loại Con rối tích hợp.
Đánh giá mẫu
Các mẫu được đánh giá bằng các chức năng đơn giản.
$value = template ("testtemplate.erb")
Người ta có thể chỉ định đường dẫn đầy đủ của một mẫu hoặc người ta có thể kéo tất cả các mẫu trong khuôn mẫu của Puppet, thường được đặt tại / var / rối / mẫu. Người ta có thể tìm thấy vị trí thư mục bằng cách chạy con rối –-configprint templatedir.
Các mẫu luôn được đánh giá bởi trình phân tích cú pháp, không phải ứng dụng khách, có nghĩa là nếu một người đang sử dụng rốimasterd, thì mẫu chỉ cần ở trên máy chủ và người ta không bao giờ cần tải chúng xuống ứng dụng khách. Không có sự khác biệt về cách khách hàng nhìn thấy giữa việc sử dụng một mẫu và chỉ định tất cả nội dung của một tệp dưới dạng chuỗi. Điều này chỉ ra rõ ràng rằng các biến dành riêng cho khách hàng được học trước bởi Rốimasterd trong giai đoạn khởi động rối.
Sử dụng Mẫu
Sau đây là một ví dụ về việc tạo cấu hình tomcat cho các trang web thử nghiệm.
define testingsite($cgidir, $tracdir) { file { "testing-$name":
path => "/etc/tomcat/testing/$name.conf", owner => superuser, group => superuser, mode => 644, require => File[tomcatconf], content => template("testsite.erb"), notify => Service[tomcat] } symlink { "testsym-$name":
path => "$cgidir/$name.cgi",
ensure => "/usr/share/test/cgi-bin/test.cgi"
}
}
Sau đây là định nghĩa mẫu.
<Location "/cgi-bin/ <%= name %>.cgi">
SetEnv TEST_ENV "/export/svn/test/<%= name %>"
</Location>
# You need something like this to authenticate users
<Location "/cgi-bin/<%= name %>.cgi/login">
AuthType Basic
AuthName "Test"
AuthUserFile /etc/tomcat/auth/svn
Require valid-user
</Location>
Điều này đẩy mỗi tệp mẫu thành một tệp riêng biệt và sau đó người ta chỉ cần yêu cầu Apache tải các tệp cấu hình này.
Include /etc/apache2/trac/[^.#]*
Kết hợp các mẫu
Có thể dễ dàng kết hợp hai mẫu bằng lệnh sau.
template('/path/to/template1','/path/to/template2')
Lặp lại trong Mẫu
Mẫu con rối cũng hỗ trợ lặp lại mảng. Nếu biến mà người ta đang truy cập là một mảng, thì người ta có thể lặp qua nó.
$values = [val1, val2, otherval]
Chúng tôi có thể có các mẫu như sau.
<% values.each do |val| -%>
Some stuff with <%= val %>
<% end -%>
Lệnh trên sẽ cho kết quả như sau.
Some stuff with val1
Some stuff with val2
Some stuff with otherval
Điều kiện trong Mẫu
Các erbtemplating hỗ trợ các điều kiện. Cấu trúc sau là một cách nhanh chóng và dễ dàng để đưa một nội dung vào tệp có điều kiện.
<% if broadcast != "NONE" %> broadcast <%= broadcast %> <% end %>
Mẫu và biến
Người ta có thể sử dụng các mẫu để điền vào các biến ngoài việc điền nội dung tệp.
testvariable = template('/var/puppet/template/testvar')
Biến không xác định
Nếu một người cần kiểm tra xem biến có được xác định trước khi sử dụng hay không, thì lệnh sau sẽ hoạt động.
<% if has_variable?("myvar") then %>
myvar has <%= myvar %> value
<% end %>
Biến ngoài phạm vi
Người ta có thể tìm kiếm biến ngoài phạm vi một cách rõ ràng với hàm lookupvar.
<%= scope.lookupvar('apache::user') %>
Mẫu dự án mẫu
<#Autogenerated by puppet. Do not edit.
[default]
#Default priority (lower value means higher priority)
priority = <%= @priority %>
#Different types of backup. Will be done in the same order as specified here.
#Valid options: rdiff-backup, mysql, command
backups = <% if @backup_rdiff %>rdiff-backup,
<% end %><% if @backup_mysql %>mysql,
<% end %><% if @backup_command %>command<% end %>
<% if @backup_rdiff -%>
[rdiff-backup]
<% if @rdiff_global_exclude_file -%>
global-exclude-file = <%= @rdiff_global_exclude_file %>
<% end -%>
<% if @rdiff_user -%>
user = <%= @rdiff_user %>
<% end -%>
<% if @rdiff_path -%>
path = <%= @rdiff_path %>
<% end -%>
#Optional extra parameters for rdiff-backup
extra-parameters = <%= @rdiff_extra_parameters %>
#How long backups are going to be kept
keep = <%= @rdiff_keep %>
<% end -%>
<% if @backup_mysql -%>%= scope.lookupvar('apache::user') %>
[mysql]
#ssh user to connect for running the backup
sshuser = <%= @mysql_sshuser %>
#ssh private key to be used
sshkey = <%= @backup_home %>/<%= @mysql_sshkey %>
<% end -%>
<% if @backup_command -%>
[command]
#Run a specific command on the backup server after the backup has finished
command = <%= @command_to_execute %>
<% end -%>
Các lớp con rối được định nghĩa là một tập hợp các tài nguyên, được nhóm lại với nhau để có được một nút hoặc máy đích ở trạng thái mong muốn. Các lớp này được định nghĩa bên trong tệp kê khai Con rối nằm bên trong mô-đun Con rối. Mục đích chính của việc sử dụng một lớp là giảm sự lặp lại mã giống nhau bên trong bất kỳ tệp kê khai nào hoặc bất kỳ mã Rối nào khác.
Sau đây là một ví dụ về lớp Puppet.
[root@puppetmaster manifests]# cat site.pp
class f3backup (
$backup_home = '/backup',
$backup_server = 'default', $myname = $::fqdn, $ensure = 'directory',
) {
include '::f3backup::common'
if ( $myname == '' or $myname == undef ) {
fail('myname must not be empty')
}
@@file { "${backup_home}/f3backup/${myname}":
# To support 'absent', though force will be needed
ensure => $ensure, owner => 'backup', group => 'backup', mode => '0644', tag => "f3backup-${backup_server}",
}
}
Trong ví dụ trên, chúng ta có hai ứng dụng khách mà người dùng cần tồn tại. Có thể nhận thấy rằng chúng tôi đã lặp lại cùng một tài nguyên hai lần. Một cách không làm cùng một nhiệm vụ trong việc kết hợp hai nút.
[root@puppetmaster manifests]# cat site.pp
node 'Brcleprod001','Brcleprod002' {
user { 'vipin':
ensure => present,
uid => '101',
shell => '/bin/bash',
home => '/home/homer',
}
}
Việc hợp nhất các nút theo kiểu này để thực hiện cấu hình không phải là một thực tiễn tốt. Điều này có thể đạt được đơn giản bằng cách tạo một lớp và bao gồm lớp đã tạo trong các nút được hiển thị như sau.
class vipin_g01063908 {
user { 'g01063908':
ensure => present,
uid => '101',
shell => '/bin/bash',
home => '/home/g01063908',
}
}
node 'Brcleprod001' {
class {vipin_g01063908:}
}
node 'Brcleprod002' {
class {vipin_g01063908:}
}
Điểm cần chú ý là cấu trúc lớp trông như thế nào và cách chúng tôi thêm một tài nguyên mới bằng cách sử dụng từ khóa lớp. Mỗi cú pháp trong Puppet đều có một tính năng riêng. Do đó, cú pháp mà người ta chọn phụ thuộc vào các điều kiện.
Lớp tham số hóa
Như trong ví dụ trên, chúng ta đã thấy cách tạo một lớp và đưa nó vào một nút. Bây giờ có những tình huống khi chúng ta cần có các cấu hình khác nhau trên mỗi nút chẳng hạn như khi một nút cần có những người dùng khác nhau trên mỗi nút sử dụng cùng một lớp. Tính năng này được cung cấp trong Puppet bằng cách sử dụng lớp tham số hóa. Cấu hình cho một lớp mới sẽ giống như trong ví dụ sau.
[root@puppetmaster ~]# cat /etc/puppet/manifests/site.pp
class user_account ($username){ user { $username:
ensure => present,
uid => '101',
shell => '/bin/bash',
home => "/home/$username",
}
}
node 'Brcleprod002' {
class { user_account:
username => "G01063908",
}
}
node 'Brcleprod002' {
class {user_account:
username => "G01063909",
}
}
Khi chúng tôi áp dụng tệp kê khai site.pp ở trên trên các nút, thì đầu ra cho mỗi nút sẽ giống như sau.
Brcleprod001
[root@puppetagent1 ~]# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetagent1.testing.dyndns.org
Info: Applying configuration version '1419452655'
Notice: /Stage[main]/User_account/User[homer]/ensure: created
Notice: Finished catalog run in 0.15 seconds
[root@brcleprod001 ~]# cat /etc/passwd | grep "vipin"
G01063908:x:101:501::/home/G01063909:/bin/bash
Brcleprod002
[root@Brcleprod002 ~]# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetagent2.testing.dyndns.org
Info: Applying configuration version '1419452725'
Notice: /Stage[main]/User_account/User[bart]/ensure: created
Notice: Finished catalog run in 0.19 seconds
[root@puppetagent2 ~]# cat /etc/passwd | grep "varsha"
G01063909:x:101:501::/home/G01063909:/bin/bash
Người ta cũng có thể đặt giá trị mặc định của một tham số lớp như được hiển thị trong đoạn mã sau.
[root@puppetmaster ~]# cat /etc/puppet/manifests/site.pp
class user_account ($username = ‘g01063908'){
user { $username: ensure => present, uid => '101', shell => '/bin/bash', home => "/home/$username",
}
}
node 'Brcleprod001' {
class {user_account:}
}
node 'Brcleprod002' {
class {user_account:
username => "g01063909",
}
}
Puppet hỗ trợ các chức năng như bất kỳ ngôn ngữ lập trình nào khác vì ngôn ngữ phát triển cơ bản của Puppet là Ruby. Nó hỗ trợ hai loại chức năng được biết đến với tênstatement và rvalue chức năng.
Statementsđứng riêng và chúng không có bất kỳ loại trả lại nào. Chúng được sử dụng để thực hiện các tác vụ độc lập như nhập các mô-đun Con rối khác trong tệp kê khai mới.
Rvalue trả về giá trị và chỉ có thể được sử dụng khi câu lệnh yêu cầu một giá trị, chẳng hạn như một phép gán hoặc một câu lệnh trường hợp.
Chìa khóa đằng sau việc thực thi chức năng trong Puppet là, nó chỉ thực thi trên Puppet master và chúng không thực thi trên máy khách hoặc tác nhân Puppet. Do đó, họ chỉ có quyền truy cập vào các lệnh và dữ liệu có sẵn trên Puppet master. Có nhiều loại chức năng khác nhau đã có sẵn và thậm chí người dùng có đặc quyền tạo các chức năng tùy chỉnh theo yêu cầu. Một số chức năng sẵn có được liệt kê dưới đây.
Hàm tệp
Chức năng tệp của tài nguyên tệp là tải một mô-đun trong Puppet và trả về kết quả đầu ra mong muốn dưới dạng một chuỗi. Các đối số mà nó tìm kiếm là, tham chiếu <module name> / <file>, giúp tải mô-đun từ thư mục tệp của mô-đun Puppet.
Giống như script / tesingscript.sh sẽ tải các tệp từ <tên mô-đun> /script/files/testingscript.sh. Hàm có khả năng đọc và chấp nhận một đường dẫn tuyệt đối, giúp tải tệp từ bất kỳ đâu trên đĩa.
Bao gồm chức năng
Trong Puppet, hàm bao gồm rất giống với hàm bao gồm trong bất kỳ ngôn ngữ lập trình nào khác. Nó được sử dụng để khai báo một hoặc nhiều lớp, dẫn đến việc đánh giá tất cả các tài nguyên có bên trong các lớp đó và cuối cùng thêm chúng vào một danh mục. Cách thức hoạt động của nó là, hàm include chấp nhận một tên lớp, danh sách các lớp hoặc một danh sách các tên lớp được phân tách bằng dấu phẩy.
Một điều cần ghi nhớ khi sử dụng includelà, nó có thể được sử dụng nhiều lần trong một lớp nhưng có giới hạn là chỉ bao gồm một lớp duy nhất một lần. Nếu lớp được bao gồm chấp nhận một tham số, hàm bao gồm sẽ tự động tìm kiếm các giá trị cho chúng bằng cách sử dụng <tên lớp> :: <tên tham số> làm khóa tra cứu.
Hàm bao gồm không làm cho một lớp được chứa trong lớp khi chúng được khai báo, vì vậy chúng ta cần sử dụng một hàm chứa. Nó thậm chí không tạo ra sự phụ thuộc vào lớp đã khai báo và các lớp xung quanh nó.
Trong hàm include, chỉ cho phép tên đầy đủ của một lớp, không cho phép các tên tương đối.
Chức năng xác định
Trong Puppet, hàm được định nghĩa giúp xác định vị trí của một lớp hoặc loại tài nguyên nhất định được xác định và trả về giá trị Boolean hay không. Người ta cũng có thể sử dụng định nghĩa để xác định xem một tài nguyên cụ thể được định nghĩa hay biến được định nghĩa có giá trị. Điểm chính cần lưu ý khi sử dụng hàm đã định nghĩa là, hàm này nhận ít nhất một đối số chuỗi, có thể là tên lớp, tên kiểu, tham chiếu tài nguyên hoặc tham chiếu biến có dạng “$ name”.
Xác định kiểm tra chức năng cho cả loại chức năng gốc và được xác định, bao gồm các loại được cung cấp bởi mô-đun. Loại và lớp được khớp với tên của chúng. Hàm khớp với sự giảm tốc tài nguyên bằng cách sử dụng tham chiếu tài nguyên.
Xác định các khớp chức năng
# Matching resource types
defined("file")
defined("customtype")
# Matching defines and classes
defined("testing")
defined("testing::java")
# Matching variables
defined('$name')
# Matching declared resources
defined(File['/tmp/file'])
Như đã mô tả trong chương trước, hàm cung cấp cho người dùng đặc quyền phát triển các hàm tùy chỉnh. Con rối có thể mở rộng khả năng diễn giải của nó bằng cách sử dụng các chức năng tùy chỉnh. Chức năng tùy chỉnh giúp tăng và mở rộng sức mạnh của các mô-đun Con rối và tệp kê khai.
Viết chức năng tùy chỉnh
Có một số điều cần phải ghi nhớ trước khi viết một hàm.
Trong Puppet, các hàm được thực thi bởi trình biên dịch, có nghĩa là tất cả các hàm đều chạy trên Puppet master và chúng không cần phải xử lý như vậy với bất kỳ ứng dụng Puppet nào. Các chức năng chỉ có thể tương tác với các tác nhân, thông tin được cung cấp ở dạng dữ kiện.
Puppet master bắt các chức năng tùy chỉnh có nghĩa là người ta cần khởi động lại Puppet master, nếu có một số thay đổi trong chức năng Puppet.
Hàm sẽ được thực thi trên máy chủ có nghĩa là bất kỳ tệp nào mà hàm cần phải có trên máy chủ và người ta không thể làm gì nếu hàm yêu cầu quyền truy cập trực tiếp vào máy khách.
Có sẵn hai loại hàm hoàn toàn khác nhau, một là hàm Rvalue trả về giá trị và hàm câu lệnh không trả về bất kỳ thứ gì.
Tên của tệp chứa hàm phải giống với tên của hàm trong tệp. Nếu không, nó sẽ không được tải tự động.
Vị trí để đặt chức năng tùy chỉnh
Tất cả các chức năng tùy chỉnh được triển khai riêng biệt .rbvà được phân phối giữa các mô-đun. Người ta cần đặt các hàm tùy chỉnh trong lib / rối / phân tích cú pháp / hàm. Các chức năng có thể được tải từ.rb tập tin từ các vị trí sau.
- $libdir/puppet/parser/functions
- thư mục con rối / phân tích cú pháp / chức năng trong Ruby $ LOAD_PATH của bạn
Tạo một chức năng mới
Các chức năng mới được tạo hoặc xác định bằng cách sử dụng newfunction phương pháp bên trong puppet::parser::Functionsmô-đun. Người ta cần chuyển tên hàm làm ký hiệu chonewfunctionvà mã để chạy dưới dạng một khối. Ví dụ sau là một hàm, được sử dụng để ghi một chuỗi vào tệp bên trong thư mục / user.
module Puppet::Parser::Functions
newfunction(:write_line_to_file) do |args|
filename = args[0]
str = args[1]
File.open(filename, 'a') {|fd| fd.puts str }
end
end
Khi người dùng đã khai báo hàm, nó có thể được sử dụng trong tệp kê khai như hình dưới đây.
write_line_to_file('/user/vipin.txt, "Hello vipin!")
Trong mô hình phân phối và phát triển phần mềm, có nhiều loại môi trường thử nghiệm khác nhau được sử dụng để thử nghiệm một sản phẩm hoặc một dịch vụ cụ thể. Theo thông lệ tiêu chuẩn, chủ yếu có ba loại môi trường là phát triển, thử nghiệm và sản xuất, trong đó mỗi loại môi trường đều có cấu hình thiết lập riêng.
Puppet hỗ trợ quản lý nhiều môi trường cùng dòng với Ruby on Rails. Yếu tố chính đằng sau việc tạo ra các môi trường này là cung cấp một cơ chế dễ dàng để quản lý ở các cấp độ khác nhau của thỏa thuận SLA. Trong một số trường hợp, máy luôn cần hoạt động mà không cần dung nạp và sử dụng phần mềm cũ. Trong đó các môi trường khác được cập nhật và được sử dụng cho mục đích thử nghiệm. Chúng được sử dụng để nâng cấp cho các máy quan trọng hơn.
Puppet khuyên bạn nên gắn bó với cấu hình môi trường sản xuất, thử nghiệm và phát triển tiêu chuẩn, tuy nhiên, ở đây nó thậm chí còn cung cấp cho người dùng đòn bẩy để tạo môi trường tùy chỉnh theo yêu cầu.
Mục tiêu Môi trường
Mục tiêu chính của việc thiết lập được phân chia theo môi trường là Con rối có thể có các nguồn khác nhau cho các mô-đun và tệp kê khai. Sau đó, người ta có thể kiểm tra những thay đổi trong cấu hình trong môi trường thử nghiệm mà không ảnh hưởng đến các nút sản xuất. Các môi trường này cũng có thể được sử dụng để triển khai cơ sở hạ tầng trên các nguồn mạng khác nhau.
Sử dụng Môi trường trên Puppet Master
Mục đích của môi trường là kiểm tra tệp kê khai, mô-đun, mẫu nào của tệp cần được gửi đến máy khách. Do đó, Puppet phải được định cấu hình để cung cấp nguồn dành riêng cho môi trường cho những thông tin này.
Môi trường con rối được thực hiện đơn giản bằng cách thêm các phần trước môi trường vào con rối.conf của máy chủ và chọn nguồn cấu hình khác nhau cho mỗi môi trường. Các phần tiền môi trường này sau đó được sử dụng ưu tiên cho phần chính.
[main]
manifest = /usr/testing/puppet/site.pp
modulepath = /usr/testing/puppet/modules
[development]
manifest = /usr/testing/puppet/development/site.pp
modulepath = /usr/testing/puppet/development/modules
Trong đoạn mã trên, bất kỳ ứng dụng khách nào trong môi trường phát triển sẽ sử dụng tệp kê khai site.pp nằm trong thư mục /usr/share/puppet/development và Puppet sẽ tìm kiếm bất kỳ mô-đun nào trong /usr/share/puppet/development/modules directory.
Chạy Puppet có hoặc không có bất kỳ môi trường nào sẽ mặc định là tệp site.pp và thư mục được chỉ định trong các giá trị tệp kê khai và đường dẫn mô-đun trong phần cấu hình chính.
Chỉ có một số cấu hình thực sự có ý nghĩa khi được cấu hình trước môi trường và tất cả các thông số đó đều xoay quanh việc chỉ định tệp nào sẽ sử dụng để biên dịch cấu hình của máy khách.
Sau đây là các thông số.
Modulepath- Trong Puppet, là chế độ tiêu chuẩn cơ bản, tốt nhất nên có một thư mục mô-đun tiêu chuẩn mà tất cả môi trường chia sẻ và sau đó là một thư mục tiền môi trường nơi mô-đun tùy chỉnh có thể được lưu trữ. Đường dẫn mô-đun là vị trí mà Puppet tìm kiếm tất cả các tệp cấu hình liên quan đến môi trường.
Templatedir- Thư mục mẫu là nơi lưu tất cả các phiên bản của các mẫu liên quan. Mô-đun nên được ưu tiên cho các cài đặt này, tuy nhiên nó cho phép một mô-đun có các phiên bản khác nhau của một mẫu nhất định trong mỗi môi trường.
Manifest - Điều này xác định cấu hình nào sẽ sử dụng làm tập lệnh entrypoint.
Với nhiều mô-đun, Con rối giúp nhận được mô-đun cho các cấu hình. Người ta có thể sử dụng nhiều môi trường trong Puppet, điều này hoạt động tốt hơn nhiều nếu một người phụ thuộc phần lớn vào các mô-đun. Việc di chuyển các thay đổi sang môi trường dễ dàng hơn bằng cách đóng gói các thay đổi trong mô-đun. Máy chủ tệp sử dụng đường dẫn mô-đun môi trường cụ thể; nếu một người phân phát tệp từ các mô-đun, thay vì các thư mục được gắn kết riêng biệt, môi trường này sẽ có thể nhận các tệp dành riêng cho môi trường và cuối cùng môi trường hiện tại cũng sẽ có sẵn trong biến $ môi trường trong tệp kê khai.
Thiết lập Môi trường Khách hàng
Tất cả các cấu hình liên quan đến cấu hình môi trường được thực hiện trên tệp rối.conf. Để chỉ định môi trường nào mà ứng dụng Puppet nên sử dụng, người ta có thể chỉ định một giá trị cho biến cấu hình môi trường trong tệp rối.conf của ứng dụng khách.
[puppetd]
environment = Testing
Định nghĩa trên trong tệp cấu hình xác định môi trường tệp cấu hình trong trường hợp của chúng tôi là thử nghiệm.
Người ta cũng có thể chỉ định điều này trên dòng lệnh bằng cách sử dụng:
#puppetd -–environment = testing
Ngoài ra, Puppet cũng hỗ trợ việc sử dụng các giá trị động trong cấu hình môi trường. Thay vì xác định các giá trị tĩnh, nhà phát triển có đòn bẩy để tạo các dữ kiện tùy chỉnh nhằm tạo ra môi trường máy khách dựa trên một số thuộc tính máy khách khác hoặc nguồn dữ liệu bên ngoài. Cách ưa thích để làm điều đó là sử dụng một công cụ tùy chỉnh. Các công cụ này có khả năng chỉ định môi trường của nút và nói chung là tốt hơn nhiều trong việc chỉ định thông tin về nút.
Đường dẫn tìm kiếm con rối
Puppet sử dụng một đường dẫn tìm kiếm đơn giản để xác định cấu hình nào cần được áp dụng trên máy đích. Tương tự như vậy, đường dẫn tìm kiếm trong Puppet rất hữu ích khi nó đang cố gắng chọn các giá trị thích hợp cần được áp dụng. Có nhiều vị trí như được liệt kê bên dưới nơi Con rối tìm kiếm các giá trị cần được áp dụng.
- Giá trị được chỉ định trong dòng lệnh
- Giá trị được chỉ định trong phần môi trường cụ thể
- Giá trị được chỉ định trong một phần cụ thể có thể thực thi
- Các giá trị được chỉ định trong phần chính
Các loại con rối được sử dụng để quản lý cấu hình riêng lẻ. Con rối có nhiều loại khác nhau như loại dịch vụ, loại gói, loại nhà cung cấp, v.v. Trong đó mỗi loại có các nhà cung cấp. Nhà cung cấp xử lý cấu hình trên các nền tảng hoặc công cụ khác nhau. Ví dụ: loại gói có các nhà cung cấp aptitude, yum, rpm và DGM. Có rất nhiều loại và Puppet bao hàm một mục quản lý cấu hình phổ tốt cần được quản lý.
Puppet sử dụng Ruby làm ngôn ngữ cơ sở của nó. Tất cả các loại Puppet và các trình cung cấp hiện tại đều được viết bằng ngôn ngữ Ruby. Vì nó tuân theo định dạng mã hóa tiêu chuẩn, người ta có thể chỉ cần tạo chúng như được hiển thị trong ví dụ cho kho lưu trữ quản lý kho. Ở đây, chúng ta sẽ tạo kiểu repo và svn và git của nhà cung cấp. Phần đầu tiên của loại repo là loại chính nó. Các loại thường được lưu trữ trong lib / con rối / loại. Đối với điều này, chúng tôi sẽ tạo một tệp có tênrepo.rb.
$ touch repo.rb
Thêm nội dung sau vào tệp.
Puppet::Type.newtype(:repo) do
@doc = "Manage repos"
Ensurable
newparam(:source) do
desc "The repo source"
validate do |value|
if value =~ /^git/
resource[:provider] = :git
else
resource[:provider] = :svn
end
end
isnamevar
end
newparam(:path) do
desc "Destination path"
validate do |value|
unless value =~ /^\/[a-z0-9]+/
raise ArgumentError , "%s is not a valid file path" % value
end
end
end
end
Trong tập lệnh trên, chúng tôi đã tạo một khối "Puppet::Type.newtype(:repo) do"sẽ tạo ra một kiểu mới với tên repo. Sau đó, chúng tôi có @doc giúp thêm bất kỳ mức chi tiết nào mà người ta muốn thêm. Câu lệnh tiếp theo là Ensurable; nó tạo thuộc tính ensure cơ bản. Loại rối ensure thuộc tính để xác định trạng thái của mục cấu hình.
Thí dụ
service { "sshd":
ensure => present,
}
Câu lệnh ensure cho Puppet biết ngoại trừ ba phương thức: tạo, hủy và tồn tại trong trình cung cấp. Các phương pháp này cung cấp các tính năng sau:
- Lệnh tạo tài nguyên
- Lệnh xóa tài nguyên
- Lệnh kiểm tra sự tồn tại của tài nguyên
Tất cả những gì chúng ta cần làm là chỉ định các phương thức này và nội dung của chúng. Con rối tạo ra cơ sở hạ tầng hỗ trợ xung quanh chúng.
Tiếp theo, chúng tôi xác định một tham số mới được gọi là nguồn.
newparam(:source) do
desc "The repo source"
validate do |value|
if value =~ /^git/
resource[:provider] = :git
else
resource[:provider] = :svn
end
end
isnamevar
end
Nguồn sẽ cho loại kho lưu trữ nơi lấy / sao chép / kiểm tra kho lưu trữ nguồn. Trong đó, chúng tôi cũng đang sử dụng một hook có tên là validate. Trong phần nhà cung cấp, chúng tôi đã định nghĩa git và svn để kiểm tra tính hợp lệ của kho lưu trữ mà chúng tôi đã xác định.
Cuối cùng, trong đoạn mã, chúng ta đã xác định thêm một tham số gọi là đường dẫn.
newparam(:path) do
desc "Destination path"
validate do |value|
unless value =~ /^\/[a-z0-9]+/
raise ArgumentError , "%s is not a valid file path" % value
end
Đây là kiểu giá trị chỉ định nơi đặt mã mới được truy xuất. Ở đây, một lần nữa sử dụng hook validate để tạo một khối kiểm tra giá trị của sự phù hợp.
Trường hợp sử dụng của Nhà cung cấp Subversion
Hãy bắt đầu với nhà cung cấp subversion bằng cách sử dụng kiểu đã tạo ở trên.
require 'fileutils'
Puppet::Type.type(:repo).provide(:svn) do
desc "SVN Support"
commands :svncmd => "svn"
commands :svnadmin => "svnadmin"
def create
svncmd "checkout", resource[:name], resource[:path]
end
def destroy
FileUtils.rm_rf resource[:path]
end
def exists?
File.directory? resource[:path]
end
end
Trong đoạn mã trên, chúng tôi đã xác định trước rằng chúng tôi cần fileutils thư viện, yêu cầu 'fileutils' mà chúng tôi sẽ sử dụng phương pháp từ.
Tiếp theo, chúng ta đã định nghĩa trình cung cấp là khối Puppet :: Type.type (: repo) .provide (: svn) làm điều này cho Puppet biết rằng đây là trình cung cấp cho kiểu được gọi là repo.
Sau đó, chúng tôi đã thêm desccho phép thêm một số tài liệu vào nhà cung cấp. Chúng tôi cũng đã xác định lệnh mà nhà cung cấp này sẽ sử dụng. Trong dòng tiếp theo, chúng tôi đang kiểm tra các tính năng của tài nguyên như tạo, xóa và tồn tại.
Tạo tài nguyên
Khi tất cả những điều trên được thực hiện, chúng tôi sẽ tạo một tài nguyên sẽ được sử dụng trong các lớp và tệp kê khai của chúng tôi như được hiển thị trong đoạn mã sau.
repo { "wp":
source => "http://g01063908.git.brcl.org/trunk/",
path => "/var/www/wp",
ensure => present,
}
Puppet sử dụng RESTful API làm kênh giao tiếp giữa Puppet master và Puppet agent. Sau đây là URL cơ bản để truy cập API RESTful này.
https://brcleprod001:8140/{environment}/{resource}/{key}
https://brcleprod001:8139/{environment}/{resource}/{key}
REST API Security
Puppet thường đảm nhận việc bảo mật và quản lý chứng chỉ SSL. Tuy nhiên, nếu muốn sử dụng RESTful API bên ngoài cụm, người đó cần tự quản lý chứng chỉ khi cố gắng kết nối với một máy. Chính sách bảo mật cho Puppet có thể được định cấu hình thông qua tệp authconfig còn lại.
Kiểm tra API REST
Tiện ích Curl có thể được sử dụng như một tiện ích cơ bản để phục hồi kết nối API RESTful. Sau đây là một ví dụ về cách chúng ta có thể truy xuất danh mục của nút bằng cách sử dụng lệnh curl API REST.
curl --cert /etc/puppet/ssl/certs/brcleprod001.pem --key
/etc/puppet/ssl/private_keys/brcleprod001.pem
Trong nhóm lệnh sau, chúng tôi chỉ thiết lập chứng chỉ SSL, chứng chỉ này sẽ khác nhau tùy thuộc vào vị trí của thư mục SSL và tên của nút đang được sử dụng. Ví dụ, hãy xem lệnh sau.
curl --insecure -H 'Accept: yaml'
https://brcleprod002:8140/production/catalog/brcleprod001
Trong lệnh trên, chúng tôi chỉ gửi một tiêu đề xác định định dạng hoặc các định dạng mà chúng tôi muốn quay lại và một URL RESTful để tạo danh mục brcleprod001 trong môi trường sản xuất, sẽ tạo ra một đầu ra sau đây.
--- &id001 !ruby/object:Puppet::Resource::Catalog
aliases: {}
applying: false
classes: []
...
Hãy giả sử một ví dụ khác, nơi chúng ta muốn lấy lại chứng chỉ CA từ Puppet master. Nó không yêu cầu phải được xác thực bằng chứng chỉ SSL đã ký riêng vì đó là thứ cần thiết trước khi được xác thực.
curl --insecure -H 'Accept: s' https://brcleprod001:8140/production/certificate/ca
-----BEGIN CERTIFICATE-----
MIICHTCCAYagAwIBAgIBATANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDDAxwdXBw
Tham chiếu API được chia sẻ của đại lý và kỹ sư con rối
GET /certificate/{ca, other}
curl -k -H "Accept: s" https://brcelprod001:8140/production/certificate/ca
curl -k -H "Accept: s" https://brcleprod002:8139/production/certificate/brcleprod002
Tham chiếu API chính của con rối
Tài nguyên được xác thực (Yêu cầu chứng chỉ hợp lệ, đã ký).
Danh mục
GET /{environment}/catalog/{node certificate name}
curl -k -H "Accept: pson" https://brcelprod001:8140/production/catalog/myclient
Danh sách thu hồi chứng chỉ
GET /certificate_revocation_list/ca
curl -k -H "Accept: s" https://brcleprod001:8140/production/certificate/ca
Yêu cầu chứng chỉ
GET /{environment}/certificate_requests/{anything} GET
/{environment}/certificate_request/{node certificate name}
curl -k -H "Accept: yaml" https://brcelprod001:8140/production/certificate_requests/all
curl -k -H "Accept: yaml" https://brcleprod001:8140/production/certificate_request/puppetclient
Báo cáo Gửi báo cáo
PUT /{environment}/report/{node certificate name}
curl -k -X PUT -H "Content-Type: text/yaml" -d "{key:value}" https://brcleprod002:8139/production
Node - Sự thật về một nút cụ thể
GET /{environment}/node/{node certificate name}
curl -k -H "Accept: yaml" https://brcleprod002:8140/production/node/puppetclient
Trạng thái - Được sử dụng để thử nghiệm
GET /{environment}/status/{anything}
curl -k -H "Accept: pson" https://brcleprod002:8140/production/certificate_request/puppetclient
Tham chiếu API tác nhân con rối
Khi một tác nhân mới được thiết lập trên bất kỳ máy nào, theo mặc định, tác nhân Con rối không lắng nghe yêu cầu HTTP. Nó cần được kích hoạt trong Puppet bằng cách thêm “nghe = true” trong tệp rối.conf. Điều này sẽ cho phép tác nhân Con rối lắng nghe yêu cầu HTTP khi tác nhân con rối đang khởi động.
Sự thật
GET /{environment}/facts/{anything}
curl -k -H "Accept: yaml" https://brcelprod002:8139/production/facts/{anything}
Run - Làm cho khách hàng cập nhật như rối hoặc đá rối.
PUT /{environment}/run/{node certificate name}
curl -k -X PUT -H "Content-Type: text/pson" -d "{}"
https://brcleprod002:8139/production/run/{anything}
Để thực hiện thử nghiệm trực tiếp việc áp dụng cấu hình và tệp kê khai trên nút Con rối, chúng tôi sẽ sử dụng bản trình diễn hoạt động trực tiếp. Điều này có thể được sao chép và dán trực tiếp để kiểm tra cách cấu hình hoạt động. Nếu người dùng muốn sử dụng cùng một bộ mã, anh ta cần có cùng một quy ước đặt tên như được hiển thị trong các đoạn mã như sau.
Hãy bắt đầu với việc tạo một mô-đun mới.
Tạo một mô-đun mới
Bước đầu tiên trong việc thử nghiệm và áp dụng cấu hình httpd là tạo một mô-đun. Để làm điều này, người dùng cần thay đổi thư mục làm việc của mình thành thư mục mô-đun Puppet và tạo cấu trúc mô-đun cơ bản. Việc tạo cấu trúc có thể được thực hiện thủ công hoặc bằng cách sử dụng Puppet để tạo bảng mẫu cho mô-đun.
# cd /etc/puppet/modules
# puppet module generate Live-module
Note - Lệnh tạo mô-đun con rối yêu cầu tên mô-đun có định dạng [tên người dùng] - [mô-đun] để tuân thủ các thông số kỹ thuật của Puppet forge.
Mô-đun mới chứa một số tệp cơ bản, bao gồm cả thư mục kê khai. Thư mục đã chứa tệp kê khai có tên init.pp, là tệp kê khai chính của mô-đun. Đây là một khai báo lớp trống cho mô-đun.
class live-module {
}
Mô-đun cũng chứa một thư mục thử nghiệm chứa một tệp kê khai được gọi là init.pp. Tệp kê khai thử nghiệm này chứa tham chiếu đến lớp mô-đun trực tiếp trong tệp kê khai / init.pp:
include live-module
Puppet sẽ sử dụng mô-đun kiểm tra này để kiểm tra tệp kê khai. Bây giờ chúng tôi đã sẵn sàng để thêm cấu hình vào mô-đun.
Cài đặt Máy chủ HTTP
Mô-đun con rối sẽ cài đặt các gói cần thiết để chạy máy chủ http. Điều này yêu cầu một định nghĩa tài nguyên xác định cấu hình của gói httpd.
Trong thư mục kê khai của mô-đun, hãy tạo một tệp kê khai mới có tên là httpd.pp
# touch test-module/manifests/httpd.pp
Tệp kê khai này sẽ chứa tất cả cấu hình HTTP cho mô-đun của chúng tôi. Vì mục đích tách biệt, chúng tôi sẽ giữ tệp httpd.pp tách biệt với tệp kê khai init.pp
Chúng tôi cần đặt mã sau vào tệp kê khai httpd.pp.
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
}
Đoạn mã này định nghĩa một lớp con của mô-đun thử nghiệm được gọi là httpd, sau đó định nghĩa một khai báo tài nguyên gói cho gói httpd. Thuộc tính ensure => install sẽ kiểm tra xem gói yêu cầu đã được cài đặt chưa. Nếu chưa được cài đặt, Puppet sử dụng tiện ích yum để cài đặt nó. Tiếp theo, là đưa lớp con này vào tệp kê khai chính của chúng tôi. Chúng tôi cần chỉnh sửa tệp kê khai init.pp.
class test-module {
include test-module::httpd
}
Bây giờ, đã đến lúc kiểm tra mô-đun có thể được thực hiện như sau
# puppet apply test-module/tests/init.pp --noop
Lệnh áp dụng con rối áp dụng cấu hình có trong tệp kê khai trên hệ thống đích. Ở đây, chúng tôi đang sử dụng init.pp thử nghiệm đề cập đến init.pp chính. –Noop thực hiện chạy khô cấu hình, nó chỉ hiển thị đầu ra nhưng thực tế không làm gì cả.
Sau đây là đầu ra.
Notice: Compiled catalog for puppet.example.com in environment
production in 0.59 seconds
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 1
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.67 seconds
Dòng đánh dấu là kết quả của thuộc tính ensure => install. Không có giá trị current_value có nghĩa là Puppet đã phát hiện gói httpd được cài đặt. Nếu không có tùy chọn –noop, Puppet sẽ cài đặt gói httpd.
Chạy máy chủ httpd
Sau khi cài đặt máy chủ httpd, chúng tôi cần khởi động dịch vụ bằng cách sử dụng giảm tốc tài nguyên khác:
Chúng tôi cần chỉnh sửa tệp kê khai httpd.pp và chỉnh sửa nội dung sau.
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
service { 'httpd':
ensure => running,
enable => true,
require => Package["httpd"],
}
}
Sau đây là danh sách các mục tiêu mà chúng tôi đã đạt được từ đoạn mã trên.
Các ensure => trạng thái đang chạy kiểm tra xem dịch vụ có đang chạy hay không, nếu không thì nó sẽ kích hoạt.
Các enable => Thuộc tính true đặt dịch vụ chạy khi hệ thống khởi động.
Các require => Package["httpd"]thuộc tính xác định mối quan hệ sắp xếp giữa giảm tốc tài nguyên này và tài nguyên khác. Trong trường hợp trên, nó đảm bảo rằng dịch vụ httpd bắt đầu sau khi gói http được cài đặt. Điều này tạo ra sự phụ thuộc giữa dịch vụ và gói tương ứng.
Chạy lệnh áp dụng con rối để kiểm tra lại các thay đổi.
# puppet apply test-module/tests/init.pp --noop
Notice: Compiled catalog for puppet.example.com in environment
production in 0.56 seconds
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 2
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.41 seconds
Cấu hình máy chủ httpd
Khi các bước trên hoàn tất, chúng ta sẽ cài đặt và kích hoạt máy chủ HTTP. Bước tiếp theo là cung cấp một số cấu hình cho máy chủ. Theo mặc định, httpd cung cấp một số cấu hình mặc định trong /etc/httpd/conf/httpd.conf cung cấp cổng máy chủ web 80. Chúng tôi sẽ thêm một số máy chủ bổ sung để cung cấp một số tiện ích dành riêng cho người dùng cho máy chủ web.
Một mẫu sẽ được sử dụng để cung cấp cổng bổ sung vì nó yêu cầu một đầu vào biến đổi. Chúng tôi sẽ tạo một thư mục có tên là mẫu và thêm một tệp có tên là test-server.config.erb trong đạo diễn mới và thêm nội dung sau.
Listen <%= @httpd_port %>
NameVirtualHost *:<% = @httpd_port %>
<VirtualHost *:<% = @httpd_port %>>
DocumentRoot /var/www/testserver/
ServerName <% = @fqdn %>
<Directory "/var/www/testserver/">
Options All Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Mẫu trên tuân theo định dạng cấu hình máy chủ apache-tomcat tiêu chuẩn. Sự khác biệt duy nhất là việc sử dụng ký tự thoát Ruby để đưa các biến từ mô-đun. Chúng tôi có FQDN lưu trữ đầy đủ tên miền đủ tiêu chuẩn của hệ thống. Điều này được gọi làsystem fact.
Dữ kiện hệ thống được thu thập từ mỗi hệ thống trước khi tạo danh mục con rối của mỗi hệ thống tương ứng. Puppet sử dụng lệnh facter để lấy thông tin này và người ta có thể sử dụng facter để lấy các chi tiết khác liên quan đến hệ thống. Chúng tôi cần thêm các dòng đánh dấu trong tệp kê khai httpd.pp.
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
service { 'httpd':
ensure => running,
enable => true,
require => Package["httpd"],
}
file {'/etc/httpd/conf.d/testserver.conf':
notify => Service["httpd"],
ensure => file,
require => Package["httpd"],
content => template("test-module/testserver.conf.erb"),
}
file { "/var/www/myserver":
ensure => "directory",
}
}
Điều này giúp đạt được những điều sau:
Điều này thêm một khai báo tài nguyên tệp cho tệp cấu hình máy chủ (/etc/httpd/conf.d/test-server.conf). Nội dung của tệp này là mẫu test-serverconf.erb đã được tạo trước đó. Chúng tôi cũng kiểm tra gói httpd được cài đặt trước khi thêm tệp này.
Điều này thêm khai báo tài nguyên tệp thứ hai tạo một thư mục (/ var / www / test-server) cho máy chủ web.
Tiếp theo, chúng tôi thêm mối quan hệ giữa tệp cấu hình và dịch vụ https bằng cách sử dụng notify => Service["httpd"]attribute. Điều này sẽ kiểm tra xem có bất kỳ thay đổi tệp cấu hình nào không. Nếu có, sau đó Puppet khởi động lại dịch vụ.
Tiếp theo là đưa httpd_port vào tệp kê khai chính. Đối với điều này, chúng tôi cần phải kết thúc tệp kê khai init.pp chính và bao gồm nội dung sau.
class test-module (
$http_port = 80
) {
include test-module::httpd
}
Thao tác này đặt cổng httpd thành giá trị mặc định là 80. Tiếp theo là chạy lệnh Puppet apply.
Sau đây sẽ là đầu ra.
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for puppet.example.com in environment
production in 0.84 seconds
Notice: /Stage[main]/test-module::Httpd/File[/var/www/myserver]/ensure:
current_value absent, should be directory (noop)
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice:
/Stage[main]/test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensure:
current_value absent, should be file (noop)
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 4
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.51 seconds
Cấu hình tường lửa
Để giao tiếp với máy chủ, người ta yêu cầu một cổng mở. Vấn đề ở đây là các loại hệ điều hành khác nhau sử dụng các phương pháp khác nhau để kiểm soát tường lửa. Trong trường hợp Linux, các phiên bản dưới 6 sử dụng iptables và phiên bản 7 sử dụng firewalld.
Quyết định sử dụng một dịch vụ thích hợp này phần nào được Puppet xử lý bằng cách sử dụng các dữ kiện hệ thống và logic của nó. Đối với điều này, trước tiên chúng ta cần kiểm tra hệ điều hành và sau đó chạy lệnh tường lửa thích hợp.
Để đạt được điều này, chúng ta cần thêm đoạn mã sau vào trong lớp testmodule :: http.
if $operatingsystemmajrelease <= 6 {
exec { 'iptables':
command => "iptables -I INPUT 1 -p tcp -m multiport --ports
${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT && iptables-save > /etc/sysconfig/iptables", path => "/sbin", refreshonly => true, subscribe => Package['httpd'], } service { 'iptables': ensure => running, enable => true, hasrestart => true, subscribe => Exec['iptables'], } } elsif $operatingsystemmajrelease == 7 {
exec { 'firewall-cmd':
command => "firewall-cmd --zone=public --addport = $ {
httpd_port}/tcp --permanent",
path => "/usr/bin/",
refreshonly => true,
subscribe => Package['httpd'],
}
service { 'firewalld':
ensure => running,
enable => true,
hasrestart => true,
subscribe => Exec['firewall-cmd'],
}
}
Đoạn mã trên thực hiện như sau:
Sử dụng operatingsystemmajrelease xác định xem hệ điều hành được sử dụng là phiên bản 6 hay 7.
Nếu phiên bản là 6, thì nó sẽ chạy tất cả các lệnh cấu hình cần thiết để cấu hình phiên bản Linux 6.
Nếu phiên bản hệ điều hành là 7, thì nó sẽ chạy tất cả các lệnh bắt buộc cần thiết để cấu hình tường lửa.
Đoạn mã cho cả hệ điều hành chứa một logic đảm bảo rằng cấu hình chỉ chạy sau khi gói http được cài đặt.
Cuối cùng, chạy lệnh Puppet apply.
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for puppet.example.com in environment
production in 0.82 seconds
Notice: /Stage[main]/test-module::Httpd/Exec[iptables]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/test-module::Httpd/Service[iptables]: Would have
triggered 'refresh' from 1 events
Định cấu hình SELinux
Vì chúng tôi đang làm việc trên máy Linux phiên bản 7 trở lên, do đó chúng tôi cần phải cấu hình nó để thực hiện giao tiếp http. SELinux hạn chế quyền truy cập không chuẩn vào máy chủ HTTP theo mặc định. Nếu chúng ta xác định một cổng tùy chỉnh, thì chúng ta cần định cấu hình SELinux để cung cấp quyền truy cập vào cổng đó.
Con rối chứa một số loại tài nguyên để quản lý các hàm SELinux, chẳng hạn như Booleans và mô-đun. Ở đây, chúng ta cần thực hiện lệnh semanage để quản lý cài đặt cổng. Công cụ này là một phần của gói Policycoreutils-python, không được cài đặt trên máy chủ mũ đỏ theo mặc định. Để đạt được những điều trên, chúng ta cần thêm đoạn mã sau vào bên trong lớp test-module :: http.
exec { 'semanage-port':
command => "semanage port -a -t http_port_t -p tcp ${httpd_port}",
path => "/usr/sbin",
require => Package['policycoreutils-python'],
before => Service ['httpd'],
subscribe => Package['httpd'],
refreshonly => true,
}
package { 'policycoreutils-python':
ensure => installed,
}
Đoạn mã trên thực hiện như sau:
Yêu cầu => Gói ['Policycoreutils-python'] đảm bảo rằng chúng tôi đã cài đặt mô-đun python cần thiết.
Puppet sử dụng semanage để mở cổng bằng cách sử dụng httpd_port như một tệp có thể xác minh.
Dịch vụ before => đảm bảo thực thi lệnh này trước khi dịch vụ httpd bắt đầu. Nếu HTTPD bắt đầu trước lệnh SELinux, thì SELinux yêu cầu dịch vụ và yêu cầu dịch vụ không thành công.
Cuối cùng, chạy lệnh Puppet apply
# puppet apply test-module/tests/init.pp --noop
...
Notice: /Stage[main]/test-module::Httpd/Package[policycoreutilspython]/
ensure: current_value absent, should be present (noop)
...
Notice: /Stage[main]/test-module::Httpd/Exec[semanage-port]/returns:
current_value notrun, should be 0 (noop)
...
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Puppet cài đặt mô-đun python trước rồi định cấu hình quyền truy cập cổng và cuối cùng khởi động dịch vụ httpd.
Sao chép tệp HTML trong máy chủ web
Với các bước trên chúng ta đã hoàn thành cấu hình máy chủ http. Bây giờ, chúng tôi có một nền tảng sẵn sàng để cài đặt một ứng dụng dựa trên web, mà Puppet cũng có thể định cấu hình. Để kiểm tra, chúng tôi sẽ sao chép một số trang web chỉ mục html mẫu vào máy chủ.
Tạo tệp index.html bên trong thư mục tệp.
<html>
<head>
<title>Congratulations</title>
<head>
<body>
<h1>Congratulations</h1>
<p>Your puppet module has correctly applied your configuration.</p>
</body>
</html>
Tạo một tệp kê khai app.pp bên trong thư mục tệp kê khai và thêm nội dung sau.
class test-module::app {
file { "/var/www/test-server/index.html":
ensure => file,
mode => 755,
owner => root,
group => root,
source => "puppet:///modules/test-module/index.html",
require => Class["test-module::httpd"],
}
}
Lớp mới này chứa một sự giảm tốc tài nguyên duy nhất. Thao tác này sao chép một tệp từ thư mục tệp của mô-đun vào máy chủ web và đặt quyền của nó. Thuộc tính bắt buộc đảm bảo lớp test-module :: http hoàn tất cấu hình thành công trước khi áp dụng test-module :: app.
Cuối cùng, chúng ta cần đưa một tệp kê khai mới vào tệp kê khai init.pp chính của mình.
class test-module (
$http_port = 80
) {
include test-module::httpd
include test-module::app
}
Bây giờ, hãy chạy lệnh áp dụng để thực sự kiểm tra những gì đang xảy ra. Sau đây sẽ là đầu ra.
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for brcelprod001.brcle.com in environment
production in 0.66 seconds
Notice: /Stage[main]/Test-module::Httpd/Exec[iptables]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/Test-module::Httpd/Package[policycoreutilspython]/
ensure: current_value absent, should be present (noop)
Notice: /Stage[main]/Test-module::Httpd/Service[iptables]: Would have
triggered 'refresh' from 1 events
Notice: /Stage[main]/Test-module::Httpd/File[/var/www/myserver]/ensure:
current_value absent, should be directory (noop)
Notice: /Stage[main]/Test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice:
/Stage[main]/Test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensur
e: current_value absent, should be file (noop)
Notice: /Stage[main]/Test-module::Httpd/Exec[semanage-port]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/Test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 8
Notice:
/Stage[main]/test-module::App/File[/var/www/myserver/index.html]/ensur:
current_value absent, should be file (noop)
Notice: Class[test-module::App]: Would have triggered 'refresh' from 1
Notice: Stage[main]: Would have triggered 'refresh' from 2 events Notice:
Finished catalog run in 0.74 seconds
Dòng được đánh dấu hiển thị kết quả của tệp index.html được sao chép vào máy chủ web.
Hoàn thiện mô-đun
Với tất cả các bước trên, mô-đun mới mà chúng tôi đã tạo đã sẵn sàng để sử dụng. Nếu chúng ta muốn tạo một kho lưu trữ của mô-đun, nó có thể được thực hiện bằng cách sử dụng lệnh sau.
# puppet module build test-module