Con rối - Dự án trực tiếp
Để 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 một 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
Con rối sẽ sử dụng mô-đun kiểm tra này để kiểm tra tệp kê khai. Bây giờ chúng ta đã 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 cấu hình khô, 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 nó.
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
Sau 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 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 để chèn 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 bổ sung 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 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ó 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 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ì yêu cầu dịch vụ SELinux 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 ứ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 tệp từ thư mục tệp của mô-đun sang 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 bao gồm một tệp kê khai mới trong tệp kê khai init.pp chính của chúng ta.
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