目前工作中使用最多的还是Fabric,最近把所有服务器都装上了saltstack,但是目前并没有使用saltstack进行管理,用的最多的还是进行系统和环境的初始化。主要是因为其它同事对saltstack不够熟悉,还有就是生产上的模块和环境都比较复杂,想完全使用saltstack管理还要一个循序渐进的过程,自动化运维想要用还是要趁早建设,越晚束手束脚的地方越多

一、saltstack安装

2.1 简介

saltstack是比较流行的开源配置管理工具,主要特点有:

  1. 基于Python开发,轻量级、灵活、扩展性好
  2. 使用ZeroMQ,确保速度和可靠性
  3. C/S架构,加密通讯,可管理海量客户端,并行能力强
  4. 配置简单、容易学习和使用

主要功能:

  1. 配置管理,自动配置系统和软件环境的状态
  2. 批量命令执行

saltstack软件组件,以下是官方文档中的介绍:

  1. salt-master: 主控制端(Server端),也叫Master
  2. salt-minion: 被控制端(client端),也叫Minion
  3. salt-ssh : 无Minion模式,使用ssh管理客户端,类似ansible
  4. salt-syndic :任务分发的代理,向Minion端发放任务
  5. Execution Modules:执行模块,在Minion系统上执行命令
  6. Runners :即使用salt-run,在Master端执行的命令
  7. Formulas (States):配置管理,描述Minion系统的目标状态
  8. Grains :在minion启动时收集到的系统静态信息
  9. Pillar :在Master端上定义的变量,供满足条件的Minion使用,通常是敏感信息
  10. Reactor : 基于事件触相应的操作
  11. Top File :入口文件
  12. Returners :将Minion执行结果发送给第三方系统

2.2 安装

我是centos系统,直接yum安装,epel源里也有,但是比官方的老一点,推荐使用官方源安装

yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el6.noarch.rpm

安装并启动Master:

yum install salt-master
service salt-master start

启动salt-master后,zeromq会监听两个端口:

  • 4505:发布消息
  • 4506:接受消息

安装Minion:

yum install salt-minion

启动Minion端之前需在配置文件中指定Master的IP,支持IP和域名:

sed -i 's/#master: salt/master: master.52os.net/' /etc/salt/minion

启动Minion:

service salt-minion start

2.3 认证

master和minion通信之间使用AES加密。minion启动后,会生成公钥和私钥,并将公钥发送给master,被master接受后,master就能对minion发送指令了。同时Master在启动后也会生产公钥和私钥,minion端也会保留master的公钥
Master端查看key状态:

salt-key -L

服务端接受Minion的公钥:

salt-key -a salt-client

执行测试命令:

salt '*'  test.ping

有返回就说明正常通信了,可以用Master管理Minion端了

二、使用saltstack进行配置管理

saltstack的配置管理通过编写sls文件实现,sls文件描述了目标系统的状态,编写sls文件之前,需先在Master端设置保存sls文件的file_roots和pillar_roots,编辑/etc/salt/master,按需添加如下内容:

file_roots:
    base:
        - /etc/salt/base
    prod:
        - /etc/salt/prod

pillar_roots:
    base:
        - /etc/salt/pillar/base
    prod:
        - /etc/salt/pillar/prod

saltstack的sls文件使用YAML定义数据,top.sls文件为states的入口文件

top.sls
base:
 '*':
    - init.*

看一下目录结构:

tree /etc/salt/base
├── init
│   ├── cron.sls
│   ├── date_time.sls
│   ├── dirmode.sls
│   ├── dns.sls
│   ├── files
│   │   ├── limits.conf
│   │   └── resolv.conf
│   ├── history.sls
│   ├── pkg.sls
│   ├── selinux.sls
│   ├── sysctl.sls
│   └── ulimits.sls
└── top.sls

安装并更新常用的软件:pkg.sls

#install epel yum source
epel-release:
    pkg.installed:
        - refresh: True
#install or keep the base packages  latest
init_pkgs:
    pkg.latest:
        - pkgs:
            - yum
            - telnet
            - lrzsz
            - iptables
            - ntpdate
            - crontabs
            - policycoreutils   #selinux modules for saltstack
            - policycoreutils-python

更改时区并校准时间:date_time.sls

include:
    - init.pkg
date_time_setting:
    timezone.system:
        - name: Asia/Shanghai
        - utc: True
cmd.run:
    - name: ntpdate time.windows.com
    - require:
        - init_pkgs

定时任务管理: cron.sls

ntp_cron:
    cron.present:
        - name: ntpdate pool.ntp.org >/dev/null
        - user: root
        - hour: 4

配置系统DNS:dns.sls

/etc/resolv.conf:
    file.managed:
        - source: salt://init/files/resolv.conf
        - user: root
        - group: root
        - mode: 644

更改生产目录权限:dirmode.sls

/web:
file.directory:
    - name: /web
    - user: root
    - group: root
    - dir_mode: 755
    - file_mode: 644
    - recurse:
        - user
        - group
        - mode

记录所有用户bash历史命令到/var/log/bash_history.log:history.sls

/etc/profile:
file.append:
    - text: |
        function log2syslog
        {
        export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`]"
        export PROMPT_COMMAND='\
          if [ -z "$OLD_PWD" ];then
                export OLD_PWD=$(pwd);
          fi;
        if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then
            echo  `whoami`_shell_cmd "[$OLD_PWD]$(history 1)" >>/var/log/bash_history.log;
        fi ;
        export LAST_CMD="$(history 1)";
        export OLD_PWD=$(pwd);'
        }
        trap log2syslog DEBUG
    - unless: grep log2syslog /etc/profile

env_source:
    cmd.run:
        - name: source /etc/profile
        - unless: env |grep  HISTTIMEFORMAT
        - require:
            - file: /etc/profile

关闭selinux:selinux.sls

permissive:
selinux.mode
disabled_selinux:
    file.replace:
        - name: /etc/sysconfig/selinux
        - pattern: SELINUX=enforcing
        - repl: SELINUX=disabled

更改系统最大能打开的文件数:ulimits.sls

/etc/security/limits.conf:
file.managed:
    - source: salt://init/files/limits.conf
    - user: root
    - group: root
    - mode: 644

cmd.run:
    - name: ulimit -a
    - unless:  grep 65535 /etc/security/limits.conf

设置内核参数:sysctl.sls

#本地tcp可使用端口范围
net.ipv4.ip_local_port_range:
    sysctl.present:
        - value: 10000 65000
#设置可以打开的最大文件数
fs.file-max:
    sysctl.present:
        - value: 2000000
#减少swap分区使用
vm.swappiness:
    sysctl.present:
        - value: 0

salt也有一些预先写好的Formulas(Formulas are pre-written Salt States),想省事可以直接拿来用,地址: https://github.com/saltstack-formulas

参考文章:

http://lixcto.blog.51cto.com/4834175/d-1