Unix-like · 2017-02-01 0

利用SaltStack批量安装httpd服务

背景

在上一篇文章【自动化运维工具SaltStack安装部署教程】中,我们已经安装完成SaltStack,并且简单的使用SaltStack管理minion。在本文章中,将实现对两台web服务器自动安装httpd服务,然后启动。并且能够批量修改配置文件,当配置文件有更改的时候,自动重启httpd服务。


脚本准备:

我们现在已经最小化安装好了两台web服务器,已安装好salt-minion,完成认证。

1、为minion进行分组

在这里,我们的两台web服务器名字为m-node1和1和m-node2,我们将他们分组到web中。
修改/etc/salt/master 将nodegroups 设置成如下

  nodegroups:
   web: 'E@m-node[12]'

同时设置file_roots如下

file_roots:
  base:        
    - /srv/salt

2、编写sls文件

/srv/salt目录下,新建一个install_httpd.sls,内容如下

install_httpd:
  pkg.installed:
  - names: 
    - httpd

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://file/httpd.conf
    - user: root
    - group: root
    - require: 
      - pkg: install_httpd

start_httpd:
  service.running:
  - names: 
    - httpd
  - require: 
    - file: '/etc/httpd/conf/httpd.conf'
  - watch:
    - file: '/etc/httpd/conf/httpd.conf'
   

我们来解释下这个文件

文件是采用YAML的格式,每个冒号后面如果有文字,必须有空格,横杆后面必须有空格,空格不能用tab代替。如果是多个项,用多个横杆并排表示。

  • 第一段:
install_httpd:
  pkg.installed:
  - names: 
    - httpd

这一段的意思是安装httpd包相当于

yum -y install httpd

第一行表示ID

第二行表示利用pkg模块的installed方法,保证包是安装上的

第三行表示安装的包名,这里是httpd,如果是只安装一个包,可以将names改成name,格式如下

install_httpd:
  pkg.installed:
  - name: httpd

  • 第二段:
/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://file/httpd.conf
    - user: root
    - group: root
    - require: 
      - pkg: install_httpd

这一段的意思是在ID为install_httpd中的包安装成功后,将sls文件的相对路径下./file/httpd.conf拷贝到各个web主机的/etc/httpd/conf/httpd.conf下面。如果httpd安装失败,将不进行文件管理。

第一行表示ID,file 模块如果没有指定name的话默认是管理名为ID的文件

第二行表示利用file模块的managed方法,保证文件和master所在主机的文件一致。

第三行表示源文件,就是Master主机上sls文件相对的路径,salt://为必须跟上的,然后在sls所在目录下,file文件夹里面的httpd.conf文件。

第六行的require表示管理该文件需要ID为install_httpd里面的安装的包成功后才可以执行。

  • 第三段:
start_httpd:
  service.running:
  - names: 
    - httpd
  - require: 
    - file: '/etc/httpd/conf/httpd.conf'
  - watch:
    - file: '/etc/httpd/conf/httpd.conf'
    

这一段的意思是启动httpd服务,启动之前需要保证第二段的配置文件拷贝成功。同时如果配置文件有变化,将重启httpd服务。

第一行表示ID

第二行表示利用service模块的running方法,保证服务运行

第三行表示服务名,同理,如果是一个服务可以直接写 - name: httpd

第七行的watch表示如果/etc/httpd/conf/httpd.conf 文件如果有变化,就调用本模块,重启服务

3、配置httpd.conf

mkdir -p /srv/salt/file

将修改好的httpd.conf 复制到/srv/salt/file目录下


演示

当两台web服务器都还没有安装httpd的时候。

root@rht6-mysql /srv/salt # salt -N web state.sls install_httpd

m-node1:
----------
          ID: install_httpd
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: The following packages were installed/updated: httpd
     Started: 19:53:00.592456
    Duration: 11747.134 ms
     Changes:   
              ----------
              httpd:
                  ----------
                  new:
                      2.2.15-56.el6.centos.3
                  old:
----------
          ID: /etc/httpd/conf/httpd.conf
    Function: file.managed
      Result: True
     Comment: File /etc/httpd/conf/httpd.conf updated
     Started: 19:53:12.341938
    Duration: 17.258 ms
     Changes:   
              ----------
              diff:
                  ---  
                  +++  
                  @@ -273,7 +273,7 @@
                   # You will have to access it by its address anyway, and this will make 
                   # redirections work in a sensible way.
                   #
                  -#ServerName www.example.com:80
                  +ServerName fordba.com
                   
                   #
                   # UseCanonicalName: Determines how Apache constructs self-referencing 
----------
          ID: start_httpd
    Function: service.running
        Name: httpd
      Result: True
     Comment: Started Service httpd
     Started: 19:53:12.361256
    Duration: 86.416 ms
     Changes:   
              ----------
              httpd:
                  True

Summary
------------
Succeeded: 3 (changed=3)
Failed:    0
------------
Total states run:     3

为了减少冗余,m-node2的结果就不贴了。

我们可以看到他新安装了httpd服务器,且将配置文件进行了更新File /etc/httpd/conf/httpd.conf updated,之后启动服务Started Service httpd

那么我们再一次执行这个salt命令会怎么样呢?

root@rht6-mysql /srv/salt # salt -N web state.sls install_httpd

m-node1:
----------
          ID: install_httpd
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: Package httpd is already installed.
     Started: 19:55:48.157334
    Duration: 346.091 ms
     Changes:   
----------
          ID: /etc/httpd/conf/httpd.conf
    Function: file.managed
      Result: True
     Comment: File /etc/httpd/conf/httpd.conf is in the correct state
     Started: 19:55:48.505351
    Duration: 3.249 ms
     Changes:   
----------
          ID: start_httpd
    Function: service.running
        Name: httpd
      Result: True
     Comment: The service httpd is already running
     Started: 19:55:48.509440
    Duration: 22.137 ms
     Changes:   

Summary
------------
Succeeded: 3
Failed:    0
------------
Total states run:     3

我们可以看到,他提示Package httpd is already installed. ,文件管理部分提示File /etc/httpd/conf/httpd.conf is in the correct state,说明文件保持一致的,在服务运行部分,他提示 The service httpd is already running,因为第一次命令中已经将httpd服务启动了,他发现配置文件没有变化,所以提示已经启动。

如果我们将配置文件进行一定的修改,我们试着添加一个空行看看,然后再运行salt命令,看看会怎么样。

root@rht6-mysql /srv/salt # salt -N web state.sls install_httpd

m-node1:
----------
          ID: install_httpd
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: Package httpd is already installed.
     Started: 19:58:04.861450
    Duration: 330.592 ms
     Changes:   
----------
          ID: /etc/httpd/conf/httpd.conf
    Function: file.managed
      Result: True
     Comment: File /etc/httpd/conf/httpd.conf updated
     Started: 19:58:05.194077
    Duration: 16.727 ms
     Changes:   
              ----------
              diff:
                  ---  
                  +++  
                  @@ -291,6 +291,7 @@
                   #
                   DocumentRoot "/var/www/html"
                   
                  +
                   #
                   # Each directory to which Apache has access can be configured with respect
                   # to which services and features are allowed and/or disabled in that
----------
          ID: start_httpd
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service restarted
     Started: 19:58:05.225745
    Duration: 156.396 ms
     Changes:   
              ----------
              httpd:
                  True

Summary
------------
Succeeded: 3 (changed=2)
Failed:    0
------------
Total states run:     3

在安装包部分,提示同样的已经安装,但是在配置文件管理部分,提示File /etc/httpd/conf/httpd.conf updated,他比较得到了差异,更新了配置文件。在服务运行模块,我们看到Service restarted,是因为配置文件有更改,他watch到了,因此重启了服务。


小结

我们仅利用一个sls文件,就实现了批量web服务管理,同时能够在配置文件有变动的时候自动重启web服务,对于其他服务,也可以利用类似的脚本,实现相同的功能。

SaltStack在自动化运维方面存在很多很强大的功能,需要我们编写各种sls文件,测试,然后批量分发,能够大大的降低以后的重复劳动,同时还能够促进服务器各种路径、配置等的标准化。