如何使用Rex管理您的服务器 - 最佳实践
(R)?ex是服务器编排和配置管理工具。 通过(R)?ex,您可以通过配置管理和软件部署的完整过程从中心点管理所有的盒子。
简而言之,Rex就像Make一样。 有一个中央的Rexfile,您可以在其中定义任务。 这些任务通过ssh在远程机器上执行。 这些任务是用简单的Perl编写的。
您可以从其网站http://rexify.org/获取(R)?ex。
前言
在本指南中,我将使用Subversion来管理所有的Tasks。 您也可以使用任何其他SCM系统,只要它支持类似于Subversion的外部指令。 我使用的是Ubuntu 12.04,但是您也可以使用其他发行版。
我不会在每个命令上附加“sudo”,请在适用的地方使用“sudo”。
在本指南中,我将创建两个示例项目。 一个项目被称为“网站”,另一个名为“数据库”,因为在较大的公司中,系统管理员和数据库管理员之间经常会出现分裂。 这两个项目都将使用可以从中央运营团队管理的“常见任务”。
我会使用多台服务器:
- Subversion服务器,
svn01
- 数据库服务器,
db01
- Web服务器,
web01
- 工作站,
wks01
设置代码库
首先你必须安装所有需要的软件包。 在Subversion服务器上执行此命令。
svn01# apt-get install libapache2-svn subversion apache2-mpm-prefork
现在编辑文件/etc/apache2/mods-enabled/dav_svn.conf
并将以下代码粘贴到其中(替换现有内容)。
<Location /svn> DAV svn SVNParentPath /var/lib/svn AuthType Basic AuthName "Subversion Repository" AuthUserFile /etc/apache2/dav_svn.passwd <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>
现在创建目录/ var / lib / svn
和所有需要的存储库。 稍后将介绍这些存储库的内容。
svn01# mkdir /var/lib/svn
svn01# cd /var/lib/svn
svn01 /var/lib/svn# svnadmin create common
svn01 /var/lib/svn# svnadmin create service
svn01 /var/lib/svn# svnadmin create database
svn01 /var/lib/svn# svnadmin create website
svn01 /var/lib/svn# chown -R www-data: .
在创建存储库之后,我们需要设置apache的身份验证。
svn01# htpasswd -c /etc/apache2/dav_svn.passwd your-user-name
现在是时候重启apache了。
svn01# service apache2 restart
恭喜你 您的Subversion服务器现已准备就绪。 让你的工作站和检查存储库。
写任务
在您的工作站,您现在可以检出存储库。
wks01# svn co http://svn01/svn/common Common
wks01# svn co http://svn01/svn/service Service
wks01# svn co http://svn01/svn/database
wks01# svn co http://svn01/svn/website
首先,我们将添加一个常见任务来设置NTP。 在这里,您可以稍后再添加其他常见任务。 所以改为Common
目录并创建一个名为NTP.pm
的文件。
wks01# cd Common
# Common/NTP.pm package Common::NTP; use Rex -base; task prepare => sub { install "ntp"; file "/etc/ntp.conf", source => "files/ntp.conf", on_change => sub { service ntp => "restart"; }; }; 1;
这将创建一个名为“prepare”的任务。 此任务在“命名空间” NTP中注册 。 如果尚未安装该软件包“ntp”,则会将该配置文件上传到服务器。 如果文件的内容发生变化,将重新启动ntp服务。 现在,您需要创建ntp.conf
文件。
bash Common# mkdir files
粘贴到文件/ ntp.conf文件
。 这是一个简单的默认ntp.conf
文件。 当然,您可以更改此套件以满足您的需求:)
# /etc/ntp.conf, managed with rex driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable server 0.ubuntu.pool.ntp.org server 1.ubuntu.pool.ntp.org server 2.ubuntu.pool.ntp.org server 3.ubuntu.pool.ntp.org # Use Ubuntu's ntp server as a fallback. server ntp.ubuntu.com restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1
一开始这就够了 所以现在您可以将新文件添加到存储库。
wks01 Common# svn add NTP.pm files
wks01 Common# svn ci -m "added NTP task"
现在我们将向服务
存储库添加一些内容。
wks01 Common# cd ../Service
wks01 Service# touch Apache.pm MySQL.pm
现在将以下代码粘贴到Apache.pm
模块中。
package Service::Apache; use Rex -base; task prepare => sub { install "apache2"; }; task configure => sub { my $param = shift; file "/etc/apache2/apache2.conf", owner => "root", mode => 644, content => template("templates/apache2/apache2.conf.tpl", %{ $param }); file "/etc/apache2/conf.d/security", owner => "root", mode => 644, content => template("templates/apache2/conf.d/security.tpl", %{ $param }); }; 1;
并创建此模块使用的模板。
wks01 Service# mkdir -p templates/apache2/conf.d
templates / apache2 / apache2.conf.tpl
的内容。 我删除了所有评论。
LockFile /var/run/apache2/accept.lock PidFile /var/run/apache2.pid Timeout <%= is_defined($::timeout, "300") %> KeepAlive <%= is_defined($::keepalive, "On") %> MaxKeepAliveRequests <%= is_defined($::max_keepalive_requests, "100") %> KeepAliveTimeout <%= is_defined($::keepalive_timeout, "5") %> <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule> <IfModule mpm_worker_module> StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxClients 150 MaxRequestsPerChild 0 </IfModule> <IfModule mpm_event_module> StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxClients 150 MaxRequestsPerChild 0 </IfModule> User <%= is_defined($::user, "www-data") %> Group <%= is_defined($::group, "www-data") %> AccessFileName .htaccess <Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy all </Files> DefaultType None HostnameLookups <%= is_defined($::hostname_lookups, "Off") %> ErrorLog <%= is_defined($::error_log, "/var/log/apache2/error.log") %> LogLevel <%= is_defined($::log_level, "warn") %> Include mods-enabled/*.load Include mods-enabled/*.conf Include httpd.conf Include ports.conf LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent Include conf.d/ Include sites-enabled/
templates / apache2 / conf.d / security.tpl的内容
。 我删除了所有评论。
ServerTokens <%= is_defined($::server_tokens, "Prod") %> ServerSignature <%= is_defined($::server_signature, "Off") %> TraceEnable <%= is_defined($::trace_enable, "Off") %>
现在我们将继续使用MySQL模块。 打开文件MySQL.pm并添加以下内容。
package Service::MySQL; use Rex -base; task prepare => sub { install "mysql-server"; }; task configure => sub { my $param = shift; file "/etc/mysql/my.cnf", owner => "root", mode => 644, content => template("templates/mysql/my.cnf.tpl", %{ $param }); }; 1;
并创建文件模板/ mysql / my.cnf.tpl
。
[mysqld] user = <%= is_defined($::user, "mysql") %> pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = <%= is_defined($::port, "3306") %> basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking bind-address = <%= $::eth0_ip %> key_buffer = <%= is_defined($::key_buffer, "16M") %> max_allowed_packet = <%= is_defined($::max_allowed_packet, "16M") %> thread_stack = <%= is_defined($::thread_stack, "192K") %> thread_cache_size = <%= is_defined($::thread_cache_size, "8") %> myisam-recover = BACKUP query_cache_limit = <%= is_defined($::query_cache_limit, "1M") %> query_cache_size = <%= is_defined($::query_cache_size, "16M") %> expire_logs_days = <%= is_defined($::expire_logs_days, "10") %> max_binlog_size = <%= is_defined($::max_binlog_size, "100M") %> [mysqldump] quick quote-names max_allowed_packet = <%= is_defined($::max_allowed_packet, "16M") %> [mysql] [isamchk] key_buffer = <%= is_defined($::key_buffer, "16M") %> !includedir /etc/mysql/conf.d/
现在将所有文件添加到存储库。
wks01 Service# svn add *
wks01 Service# svn ci -m "inital commit of apache and mysql service"
好的,现在你有你的第一个常见的模块。 现在是时候为数据库项目创建任务了。