如何使用Rex管理服务器 - 最佳实践

如何使用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"

好的,现在你有你的第一个常见的模块。 现在是时候为数据库项目创建任务了。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏