使用saltstack初始化系统
目前工作中使用最多的还是Fabric,最近把所有服务器都装上了saltstack,但是目前并没有使用saltstack进行管理,用的最多的还是进行系统和环境的初始化。主要是因为其它同事对saltstack不够熟悉,还有就是生产上的模块和环境都比较复杂,想完全使用saltstack管理还要一个循序渐进的过程,自动化运维想要用还是要趁早建设,越晚束手束脚的地方越多
一、saltstack安装
2.1 简介
saltstack是比较流行的开源配置管理工具,主要特点有:
- 基于Python开发,轻量级、灵活、扩展性好
- 使用ZeroMQ,确保速度和可靠性
- C/S架构,加密通讯,可管理海量客户端,并行能力强
- 配置简单、容易学习和使用
主要功能:
- 配置管理,自动配置系统和软件环境的状态
- 批量命令执行
saltstack软件组件,以下是官方文档中的介绍:
- salt-master: 主控制端(Server端),也叫Master
- salt-minion: 被控制端(client端),也叫Minion
- salt-ssh : 无Minion模式,使用ssh管理客户端,类似ansible
- salt-syndic :任务分发的代理,向Minion端发放任务
- Execution Modules:执行模块,在Minion系统上执行命令
- Runners :即使用salt-run,在Master端执行的命令
- Formulas (States):配置管理,描述Minion系统的目标状态
- Grains :在minion启动时收集到的系统静态信息
- Pillar :在Master端上定义的变量,供满足条件的Minion使用,通常是敏感信息
- Reactor : 基于事件触相应的操作
- Top File :入口文件
- 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.nixops.me/' /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
好文章,salt 是个好东西,不过比 ansible 复杂太多导致很多运维不喜欢用。
的确比较复杂,state.sls grain pillar等都不是短时间能够精通。