这次主要介绍saltstack的配置管理,这一部分在企业应用中比较重要,也经常用到。
states是saltstack系统中的配置语言,在日常运维中需要编写大量的states文件,例如:创建用户、安装软件、配置软件、服务运行等。需要编写一些"states sls"文件。该文件主要使用YAML语言,也可以支持使用python语言编写。

配置管理中常用模块

pkg模块

列出所有状态模块
salt '' sys.list_modules
查看状态模块中的函数:如pkg模块
[root@salt-master _grains]# salt '
' sys.list_state_functions pkg
salt-minion01:

  • pkg.downloaded
  • pkg.group_installed
  • pkg.installed
  • pkg.latest
  • pkg.mod_aggregate
  • pkg.mod_init
  • pkg.mod_watch
  • pkg.patch_downloaded
  • pkg.patch_installed
  • pkg.purged
  • pkg.removed
  • pkg.uptodate
    salt-minion02:
  • pkg.downloaded
  • pkg.group_installed
  • pkg.installed
  • pkg.latest
  • pkg.mod_aggregate
  • pkg.mod_init
  • pkg.mod_watch
  • pkg.patch_downloaded
  • pkg.patch_installed
  • pkg.purged
  • pkg.removed
  • pkg.uptodate

    file模块
    root@salt-master app]# mkdir files
    [root@salt-master app]# cp /etc/resolv.conf files/
    [root@salt-master app]# cat dns.sls
    dns-config:
    file.managed:

  • name: /etc/resolv.conf #file of
  • source: salt://app/files/resolv.conf salt代表file根目录
  • user: root
  • group: root
  • mode: 644
    • backup: minion ------备份到minion端
      修改/srv/salt/app/files下的resolv.conf文件
      [root@salt-master files]# cat resolv.conf

nameserver 101.206.4.6
nameserver 114.114.114.114
###########saltstack configure ----------》添加一行注释
salt 'salt-minion01' state.sls app.dns test=True 测试
salt 'salt-minion01' state.sls app.dns
查看
[root@salt-minion01 salt]# cat /etc/resolv.conf

nameserver 101.206.4.6
nameserver 114.114.114.114
###########saltstack configure
file.directory ------创建目录

[root@salt-master app]# cat dir.sls
mkdir_tmp_dns:
file.directory:

  • name: /tmp/dns
  • user: root
  • group: root
  • mode: 755
  • makedirs: True

目录下发 file.recurse
[root@salt-master app]# cat xf.sls
httpd-config:
file.recurse:

  • name: /etc/httpd/conf.d/
  • source: salt://app/files/httpd_conf.d
  • file_mode: 644
  • dir_mode: 755
  • include_empty: True
  • clean: True #####远程强制删除
    mkdir files/httpd_conf.d
    [root@salt-master app]# cat files/httpd_conf.d/www.conf
    server {

    www
    }
    [root@salt-master app]# cat files/httpd_conf.d/blog.conf
    erver {
    blog

}
[root@salt-master app]# salt 'salt-minion01' state.sls app.xf
minion01
[root@salt-minion01 tmp]# ls /etc/httpd/conf.d/
autoindex.conf fcgid.conf README userdir.conf www.conf
blog.conf manual.conf ssl.conf welcome.conf

可以直接采用以下方法:
[root@salt-master app]# cat ln.sls
Link:
cmd.run:

  • name: ln -s /tmp /mnt

service模块
httpd_service:
service.running:

  • name: httpd
  • enable: True
  • reload: True #######允许重载,不写表示restart
  • watch: #####监控谁
    -pkg.httpd-file

    cron模块
    [root@salt-master app]# cat cron.sls
    crontab_scripts:
    cron.present:

  • name: /usr/bin/uptime >/dev/null 2>&1
  • user: root
  • minute: '/5'
    salt 'salt-minion01' state.sls app.cron
    结果:
    [root@salt-minion01 tmp]# crontab -l
    /30 /usr/sbin/ntpdate time.windows.com
    /5 * /usr/bin/uptime >/dev/null 2>&1

    高级状态模块,高级状态文件需要在base环境下编写
    base:
    '*': 匹配所有minion

  • app.httpd #base模块下httpd目录下的安装sls文件
    #webserver: #定义的分组名称进行匹配,需要定义nodegroups

    'os:centos': #通过grains模块匹配

  • match: grains
  • app.cron
    top.sls需要写在/srv/salt下
    执行是salt '*' state.highstate

LAMP架构部署

此案例在prod生产环境下部署
修改master端配置文件
file_roots:
base:

  • /srv/salt/base
    prod:
  • /srv/salt/prod

systemctl restart salt-master
mkdir /srv/salt/{base,prod} -p
把之前的基础环境下写的放在base下
1 先手动安装lamp环境
yum install httpd mariadb mariadb-server php php-mysql php-gd gd -y
[root@salt-master init]# pwd
/srv/salt/prod/init
mkdir files -------相关配置写在该目录下
2 准备相应目录与对应配置文件
cp /etc/httpd/conf/httpd.conf files/
cp /etc/my.cnf files/
cp /etc/php.ini files/
在init目录下写lamp安装,配置 启动
3 部署状态文件lamp.sls
[root@salt-master init]# cat lamp.sls
#yum install httpd mariadb-server php php-mysql php-gd gd -y
httpd-install:
pkg.installed:

  • names:
    • httpd
    • httpd-tools
      httpd-config:
      file.managed:
  • name: /etc/httpd/conf/httpd.conf
  • source: salt://init/files/httpd.conf
  • user: root
  • group: root
  • mode: 644
  • backup: minion
    httpd-service:
    service.running:
  • name: httpd
  • enable: True
  • reload: True
    php-install:
    pkg.installed:
  • names:
    • php
    • php-mysql
    • php-gd
    • gd
      php-config:
      file.managed:
  • name: /etc/php.ini
  • source: salt://init/files/php.ini
  • user: root
  • group: root
  • mode: 644
  • backup: minion
    mysql-install:
    pkg.installed:
  • names:
    • mariadb
    • mariadb-server
      mysql-config:
      file.managed:
  • name: /etc/my.cnf
  • source: salt://init/files/my.cnf
  • user: root
  • group: root
  • mode: 644
  • backup: minion
    mysql-service:
    service.running:
  • name: mariadb
  • enable: True

salt 'salt-minion01' state.sls init.lamp saltenv=prod 指定为prod环境,因为默认为base环境
通过高级状态进行管理

通过高级状态来管理更方便,需要在base下写top.sls

[root@salt-master base]# cat top.sls
prod:
'salt-minion01':

  • init.lamp

然后执行salt 'salt-minion01' state.highstate
查看目录结构
[root@salt-master base]# tree /srv/salt/
/srv/salt/
├── base
│ ├── app
│ │ ├── cron.sls
│ │ ├── dir.sls
│ │ ├── dns.sls
│ │ ├── files
│ │ │ ├── httpd_conf.d
│ │ │ │ ├── blog.conf
│ │ │ │ └── www.conf
│ │ │ └── resolv.conf
│ │ ├── httpd.sls
│ │ ├── ln.sls
│ │ ├── service.sls
│ │ ├── vsftpd.sls
│ │ └── xf.sls
│ ├── _grains
│ │ └── my_grains.py
│ ├── top.sls
│ └── top.sls20181121
└── prod
└── init
├── files
│ ├── httpd.conf
│ ├── my.cnf
│ └── php.ini
└── lamp.sls
states状态依赖管理
可以用state模块来定义minion的状态,但是如果一个主机涉及多个状态,并且状态之间有相互关联,需要在执行顺序上有先后之分,那么必须引入requisites 来进行控制。

  1. require 我依赖某个状态,我依赖谁
  2. require_in 我被某个状态依赖,谁依赖我
  3. watch 我监控某个状态,如当状态发生变化时,就进行restart或reload操作
  4. watch_in 我被某个状态关注
  5. include 我引用谁
    require写法
    httpd-install:
    pkg.installed:
    • names:
      • httpd
      • httpd-tools
        httpd-config:
        file.managed:
    • name: /etc/httpd/conf/httpd.conf
    • source: salt://init/files/httpd.conf
    • user: root
    • group: root
    • mode: 644
    • backup: minion
    • require:
      • pkg: httpd-install 因为要修改配置需要先安装软件

watch写法
httpd-service:
service.running:

  • name: httpd
  • enable: True
  • reload: True
  • require:
    • file: httpd-config
  • watch:
    • file: httpd-config
      watch_in写法
      php-config:
      file.managed:
  • name: /etc/php.ini
  • source: salt://init/files/php.ini
  • user: root
  • group: root
  • mode: 644
  • backup: minion
  • watch_in:
    • service: httpd-service
      利用include将lamp拆分,如将mysql拆分出来

[root@salt-master init]# cat mysql.sls
mysql-install:
pkg.installed:

  • names:
    • mariadb
    • mariadb-server
      mysql-config:
      file.managed:
  • name: /etc/my.cnf
  • source: salt://init/files/my.cnf
  • user: root
  • group: root
  • mode: 644
  • backup: minion
  • require:
    • pkg: mysql-install
      mysql-service:
      service.running:
  • name: mariadb
  • enable: True
  • require:
    • file: mysql-config

[root@salt-master init]# mv lamp.sls apache.sls
在prod目录建立lamp.sls
[root@salt-master prod]# cat lamp.sls
include:

  • init.apache
  • init.mysql
    执行salt 'salt-minion01' state.sls lamp saltenv=prod
    通过高级状态管理:修改topfile文件如下:
    prod:
    'salt-minion01':
    • lamp

Jinja模板使用

配置文件一般都是固定无法灵活多变,实际生产过程中,需要配置文件灵活多变,不能写死,有时还需要进行流程控制,这就需要用到jinjia,可以很灵活地进行配置管理及简化配置过程。
Jinja2模板包含变量和表达式
变量用{{...}}包围,表达式用{%...%}包围

看一个简单的例子
[root@salt-master prod]# cat var.sls
{% set var= 'hello world!' %}
test_var:
cmd.run:

  • name: echo "{{ var }}"
    字符串类型
    {% set var= 'hello world!' %}
    列表类型
    {% set list = ['one','two' ] %}
    {{ list[1]}}

字典类型
{% set dict = {'first':'value','second':'value1'} %}
{{ dict['first'] }}

 Jinja模板使用步骤
  1. 告诉file状态模块,需要使用jinja
    • template: jinja
      2列出参数列表
    • defaults:
      PORT: 88
      3.配置文件引用jinja模板
      {{ PORT }}
      配置实例,修改apache端口
      httpd-config:
      file.managed:
    • name: /etc/httpd/conf/httpd.conf
    • source: salt://init/files/httpd.conf
    • user: root
    • group: root
    • mode: 644
    • backup: minion
    • require:
      • pkg: httpd-install
    • template: jinja
    • defaults:
      PORT: 8000
      files目录下http配置文件中将Listen 80改为Listen {{ PORT }}
      然后执行salt 'salt-minion01' state.highstate
      查看minion端端口已改动
      [root@salt-minion01 ~]# netstat -tnlp|grep 8000
      tcp6 0 0 :::8000 :::* LISTEN 3915/httpd

模板支持grains pillar进行赋值
grains方式
通过grains获取minion端IP
[root@salt-master prod]# salt 'salt-minion01' grains.item fqdn_ip4
salt-minion01:

fqdn_ip4:
    - 192.168.132.31

如果想在http配置文件中使用IP:PORT
Listen {{ IPADDR}}:{{ PORT }}
apache文件中修改

  • defaults:
    PORT: 8000
    IPADDR: {{ grains['fqdn_ip4'][0]}} ---取列表中的第一个值即IP地址

    pillar方式:
    apache:
    IP: {{ grains['fqdn_ip4'][0] }}
    PORT: 8008
    引用
    {{ pillar['apache'][IP] }}
    {{ pillar['apache'][port] }}

实际场景中,如系统有centos和ubuntu,都要安装apache,由于安装的包不一样,则可以根据grains静态数据,使用jinja2流程控制
httpd_install:
pkg.installed:

  • template: jinja
    {% if grains['os_family'] == 'Debian' %}

    • name: apache2
      {% elif grains['os_family'] == 'RedHat' %}
    • name: http
      {% endif %}

      saltstack Job管理

      Job概述
      salt每次运行任务都会将任务发布到pub-sub总线,minion会对任务作出响应,为区分不同的任务,saltmaster每次发布一个任务都会为该任务创建一个jobid。
      master默认情况下会缓存24小时内的所有job的详细操作
      master缓存目录:/var/cache/salt/master/jobs/
      minion端每次执行任务都会缓存在/var/cache/salt/minion/proc/目录下,任务执行完成后文件会被删除。
      在master端执行一个长时间的任务
      salt 'salt-minion01' cmd.run "sleep 100"
      在minion01上用strings查看文件内容
      [root@salt-minion01 proc]# strings 20181125111411231106
      tgt_type
      glob
      20181125111411231106
      salt-minion01
      user
      root
      sleep 100
      cmd.run

    Job管理
    通过salt-run 命令来管理job也可以通过salt util模块
    在master中执行一个长时间的命令
    salt 'salt-minion01' cmd.run "sleep 1000;echo hello"
    然后ctrl+c结束,获取jobid后登陆查看
    salt 'salt-minion01' saltutil.find_job-id
    salt 'salt-minion01' saltutil.kill_job jobid 停掉任务
    查看master上cache的所有job
    salt 'salt-minion' saltutil.runner jobs.list_jobs