背景
在上一篇文章【自动化运维工具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文件,测试,然后批量分发,能够大大的降低以后的重复劳动,同时还能够促进服务器各种路径、配置等的标准化。
近期评论