10-saltstack(6)_用highstate复合主机状态_一

前言

上轮学习了grains、pillar和jinja2语言来扩展文件和模板文件。在highstate里,将学习如何组织主机状态,把多个主机状态配置根据不同规则进行复合,进而对整个服务器集群进行整体管控

  • 生产状态中会存在许多主机角色,如果我们像前面部署lamp一台主机一个state.sls文件,那么就会使得维护好管理变得困难繁琐。我们需要通过拆分和复用让状态文件更加模块化。对此,saltstack为我们提供了highstate模块。

用top.sls文件管理状态文件

top.sls也可以用来在状态系统中将不同的状态文件定义到不同的minion中

# mkdir -pv /srv/salt/lamp
# tree /srv/salt/lamp
/salt/lamp/
├── httpd.conf
├── lamp.sls
├── my.cnf
└── php.ini
[root@localhost salt]# cat top.sls 
base:
  192.168.184.133:
    - lamp.lamp  ## lamp目录下的lamp.sls文件
  • 通过top.sls可以很方便的对多个状态文件和主机进行管理,接下来将学习如何拆分和复用状态文件。

状态文件的拆分和复用

  • 安装和管理lamp的模块包含了httpd、PHP、MySQL的安装,并且管理了这些软件的配置文件和服务启动。从复用角度来看把这些配置写在一起是不方便的,所以要把类似lamp.sls这种模块拆分成尽可能小的可复用的单元。
## 先把模块的目录结构化,对应的文件放入对应的目录
mkdir -pv /srv/salt/lamp/{template,file}
[root@localhost lamp]# mv httpd.conf my.cnf php.ini file/
[root@localhost lamp]# mv lamp.sls template/

## 从复用的角度讲,我们可以将lamp模块拆分成httpd模块,PHP模块和MySQL模块。
## mkdir -pv /srv/salt/{httpd,php,mysql}/file
###### httpd
[root@localhost httpd]# tree ./
./
├── file
│   ├── httpd.conf
│   ├── my.cnf
│   └── php.ini
├── httpd_conf.sls
├── httpd_running.sls
├── init.sls
└── install_httpd.sls

[root@localhost httpd]# cat init.sls 
include:
  - .install_httpd
  - .httpd_running
  - .httpd_conf
[root@localhost httpd]# cat httpd_running.sls 
httpd_running:
  service.running:
    - name: httpd
    - enable: True
    - require:
      - pkg: install_httpd
    - watch:
      - file: httdp_conf
[root@localhost httpd]# cat install_httpd.sls 
install_httpd:
  pkg.installed:
    - pkgs: 
      - httpd
      - httpd-devel 

[root@localhost httpd]# cat httpd_conf.sls 
httdp_conf:  
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/file/httpd.conf
    - user: root
    - group: root
    - mode: 600 

###### PHP
[root@localhost php]# tree ./
./
├── file
│   └── php.ini
├── install_php.sls
├── php_conf.sls
└── php_running.sls

[root@localhost php]# cat init.sls 
include:
  - .install_php
  - .php_running
  - .php_conf
[root@localhost php]# cat install_php.sls 
install_php:
  pkg.installed:
    - names:
      - php
      - php-mysql
      - php-common
      - php-gd
      - php-mbstring
      - php-devel
      - php-xml
      - php-fpm
[root@localhost php]# cat php_conf.sls 
php_conf:
  file.managed:
    - name: /etc/php.ini
    - source: salt://php/file/php.ini
    - user: root
    - group: root
    - mode: 600
[root@localhost php]# cat php_running.sls 
php_running:
  service.running:
    - name: php-fpm
    - enable: True
    - reload: True
    - watch:
      - file: php_conf

###### MySQL
[root@localhost mysql]# tree ./
./
├── file
│   └── my.cnf
├── init.sls
├── mysql_conf.sls
├── mysql_install.sls
└── mysql_running.sls

[root@localhost mysql]# cat init.sls 
include:
  - .mysql_install
  - .mysql_running
  - .mysql_conf
[root@localhost mysql]# cat mysql_install.sls 
mysql_install:
  pkg.installed:
    - pkgs:
      - mysql
      - mysql-server
      - mysql-devel
  service.running:
    - name: mysqld
    - enable: True
    - reload: True
    - require:
      - pkg: install_httpd
    - watch: 
      - file: mysql_conf
[root@localhost mysql]# cat mysql_running.sls 
mysql_running:
  service.running:
    - name: mysqld
    - enable: True
    - reload: True
  - require:
    - mysql_install
  - watch:
    - file: mysql_conf
[root@localhost mysql]# cat mysql_conf.sls 
mysql_conf:
  file.managed:
    - name: /etc/my.cnf
    - source: salt://mysql/file/my.cnf
    - user: root
    - group: root
    - mode: 600
    
###### 修改top.sls文件
[root@localhost salt]# vim top.sls 
base:
  192.168.184.133:
    - match: list     
    - httpd
    - php
    - mysql        ## 没指定sls文件的话默认读mysql目录下的init.sls
  • master端执行 salt 192.168.184.133 state.highstate
  • 报错:
----------
          ID: httpd_conf
    Function: file.managed
        Name: /etc/httpd/conf/httpd.conf
      Result: False
     Comment: Source file salt://httpd.conf not found
     Started: 20:45:53.330668
    Duration: 14.211 ms
     Changes:   
### 由于salt目录下有上次实验保留下来的httpd.sls,salt读到了这个文件,改名为httpd.sls_bak即可(为什么会识别到这个文件?)
[root@localhost salt]# cat httpd.sls 
install_httpd:
  pkg.latest:
    - name: httpd
httpd_running:
  service.running:
    - name: httpd
    - enable: True
    - require:
      - pkg: install_httpd
    - watch:
      - file: httpd_conf
httpd_conf:
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd.conf
    - user: root
    - group: root
    - mode: 600
    
  • 拆分和配置top.sls可以灵活地组合各种复用模块,但有时候对最基本模块的要求也会不一样。如果同样是安装Nginx,一些minion是用来做反向代理,一些是web服务器。这时候可以选择扩展原有的Nginx模块或者通过设置不同minion的grains和pillar属性来下发不同的配置文件。(在实战篇会演示)

多环境的配置和管理

top.sls中的base配置项
  • base配置项其实是salt配置文件中默认的环境目录。如下代码:
  • file_roots这个配置项指明了我们的环境目录在哪里,SALT执行对应的SLS状态文件都会从默认的目录去寻找。
  • 在生产环境中我们可以通过配置文件来对不同的环境(生产、测试环境等)配置不同的目录,方便区分和便于管理。如下代码:
  • 分别在 file_roots:指定的目录中建立对应的状态配置模块,并在/srv/salt/top.sls中对所有环境的管理做统一入口,如此就可以完成不同环境的管理和隔离。
[root@localhost ~]# vim /etc/salt/master
# Example:
# file_roots:
#   base:
#     - /srv/salt/
#   dev:
#     - /srv/salt/dev/services
#     - /srv/salt/dev/states
#   prod:
#     - /srv/salt/prod/services
#     - /srv/salt/prod/states
#
#file_roots:
#  base:
#    - /srv/salt

###### 生产环境配置不同的目录:
file_roots:
  base:
    - /srv/salt/
  dev:
    - /srv/salt/dev/
  prod:
    - /srv/salt/prod/

你可能感兴趣的:(10-saltstack(6)_用highstate复合主机状态_一)