saltstack简介

SaltStack是一种新型的基础设施管理软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。SaltStack项目于2011年启动,年增长速度较快,五年期固定基础设施编制和配置管理的开源项目。SaltStack社区致力于保持slat项目集中、友好、健康、开放。

简单来说它的两大基础功能就是:配置管理、远程命令执行。剩下就是根据你的需求自由组合,实现更复杂的功能和系统管理。

saltstack运行的模式

  1. local
  2. master/minion
  3. salt SSH(可以不依赖客户端)

saltstack三大功能

  • 远程执行
  • 配置管理
  • 云管理(不是特别成熟,不建议生产环境使用)

Salt即可以批量执行命令,也可以单机执行。通常单机执行用于测试:

  1. 单机(立即)执行。 使用salt-call命令单机执行操作。
  2. 批量(立即)执行。最常用的操作。使用salt命令,对匹配的minion节点执行操作。

salt 安装

salt解析基于DNS,如果做实验发现执行特别慢,可以尝试配置好域名解析。

vim /etc/hosts
192.168.56.11 linux-node1
192.168.56.12 linux-node2

master 安装

安装epel源

rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

配置saltstack的官方yum源

vim /etc/yum.repo.d/saltstack-repo
####################
# Enable SaltStack's package repository
[saltstack-repo]
name=SaltStack repo for RHEL/CentOS 7
baseurl=https://repo.saltstack.com/yum/rhel7
enabled=1
gpgcheck=0
gpgkey=https://repo.saltstack.com/yum/rhel7/SALTSTACK-GPG-KEY.pub

服务端安装salt-master 软件

yum install salt-master -y

saltstack服务端配置文件

  • 配置文件需要顶头写,不能有空格。
mkdir /srv/salt/{base,prod,test,pillar} -p 
vim /etc/salt/master
default_include: master.d/*.conf
interface: 10.10.0.159
ipv6: False
timeout: 30
max_open_files: 65535
worker_threads: 5
state_verbose: False
file_roots:
  base:
    - /srv/salt/base/
  prod:
    - /srv/salt/prod/
  test:
    - /srv/salt/test/
pillar_roots:
  base:
    - /srv/salt/pillar
log_file: /var/log/salt/master
log_level: warning
### salt api 相关参数
rest_cherrypy:
  port: 8000
  disable_ssl: True
external_auth:
  pam:
    saltapi:
      - .*
      - '@runner'
      - '@wheel'

修改完配置文件后,启动master服务

systemctl enable salt-master.service
systemctl start salt-master.service

注意:salt的书写一定要注意格式。基础环境(base),生产环境(prod),测试环境(test)分三个目录。通过不同的目录创建不同的内容。
关于salt-master配置文件更多的内容可以参考salt配置文件详解

客户端安装

安装salt-minion 软件

yum install salt-minion -y

配置并启动saltstack客户端。

vim /etc/salt/minion 
master: 192.168.56.11
id:  linux-node2

重启minion进程

systemctl enable salt-minion.service
systemctl start salt-minion.service

minion 向 master 端注册

master端操作

shell> salt-key -L
Accepted Keys:
linux-node1
Denied Keys:
Unaccepted Keys:
linux-node2
Rejected Keys:
shell> salt-key - A -y ## 同意所有的未注册主机
Accepted Keys:
linux-node1
Denied Keys:
Unaccepted Keys:
linux-node2
Rejected Keys:

master的key存放位置:

shell> cd /etc/salt/pki/master/
shell> tree 
+-- master.pem
+-- master.pub
+-- minions
|   +-- linux-node1 (minion的公钥)
|   +-- linux-node2 (minion的公钥)
+-- minions_autosign
+-- minions_denied
+-- minions_pre
+-- minions_rejected

5 directories, 4 files
[root@linux-node1 master]#

salt-key命令补充

  • salt-key -L 列出所有的key信息。
  • salt-key -d www.etiantian.org 删除一个key 。
  • salt-key -A -y 同意所有未注册的minion端。
  • salt-key -a www.etiantian.org 同意一个机器。

minion端 ID 存放在这个文件中

shell>  ls /etc/salt/pki/minion
minion_master.pub  minion.pem  minion.pub

删除旧的key文件

cd /etc/salt/pki/minion && rm -f *

salt远程执行

命令格式:salt 'Traget' module

  • 目标:Traget
  • 模块:Module
  • 返回:Returners

目标匹配方式

通配符使用:

salt '*' test.ping
salt '*.example.net' test.ping
salt '*.example.*' test.ping
salt 'web?.example.net' test.ping
salt 'web[1-5]' test.ping
salt 'web[1,3]' test.ping
salt 'web-[x-z]' test.ping

正则表达式使用:

salt -E 'web1-(prod|devel)' test.ping

也可以在top.sls中使用正则表示:

base:
  'web1-(prod|devel)':
  - match: pcre  ## 指明匹配方式
  - webserver

lists使用:

salt -L 'web1,web2,web3' test.ping

IP地址使用:

[root@centos6 ~]# salt -S '192.168.2.0/24' test.ping 
minion.saltstack.com:
    True

Grains使用:

salt -G 'os:centos' test.ping

也可以在top.sls中使用Grains表示:

base:
  'os:centos':
    - match: grain ## 指定匹配方式
    - init.env_init
    - zabbix-agent-linux.config
    - salt.agent

Pillar使用:

salt -I 'master:True' test.ping

salt分组

在使用 SaltStack 对主机进行批量管理的时候,因为不同的服务器组所做的业务功能不同,因此为了更加方便的管理,需要对主机进行分组管理

一. 编辑配置文件

[root@salt-master ~]# vim /etc/salt/master
nodegroups:
  group-1: G@os:Ubuntu

二. 分组方式

  • G -- 针对 Grains 做单个匹配,例如:G@os:Ubuntu
  • E -- 针对 minion 针对正则表达式做匹配,例如:E@web\d+.(dev|qa|prod).loc
  • P -- 针对 Grains 做正则表达式匹配,例如:P@os:(RedHat|Fedora|CentOS)
  • L -- 针对 minion 做列表匹配,例如:L@minion1.example.com,minion3.domain.com or bl*.domain.com
  • I -- 针对 Pillar 做单个匹配,例如:I@pdata:foobar
  • S -- 针对子网或是 IP 做匹配,例如:S@192.168.1.0/24 or S@192.168.1.100
  • R -- 针对客户端范围做匹配,例如: R@%foo.bar

salt 异步执行方法

[root@xxx ~]# salt --async test01 cmd.run "echo 'test'"
Executed command with job ID: 20150915151813222323
[root@xxx ~]# salt-run jobs.lookup_jid 20150915151813222323
Fabric:
  test

还有个-v参数在返回结果的同时,一同返回本次任务的jid,如果超时还是会返回jid的。

[root@test ~]# salt -v test01 test.ping
Executing job with jid 20150917172323566343
-------------------------------------------
test01:
  True

如果是调用saltapi来实现异步执行语句和获取jid信息,参数可以这样:

params = {'client':'local_async', 'fun':'test.echo', 'tgt':'test01', 'arg1':'hello'}
params = {'client':'runner', 'fun':'jobs.lookup_jid', 'jid': '20150827163231404925'}

salt-stakck 状态查询

  • 查看还在运行的程序:salt-run jobs.active
  • 查看以前的操作历史记录来:salt-run jobs.list_jobs
  • 查看minion支持的module列表的命令 salt '*' sys.list_modules
  • 查看CMD模块下的所有function。salt '*' sys.list_functions cmd
  • 查看cmd 模块的详细用法。salt '*' sys.doc cmd

参考

补充一个线上的配置文件

interface: 192.168.56.11
ipv6: False
max_open_files: 65535
worker_threads: 5
timeout: 30
state_verbose: False
file_roots:
  base:
    - /data/db/salt/base/
  prod:
    - /data/db/salt/prod/
  test:
    - /data/db/salt/test/
pillar_roots:
  base:
    - /data/db/salt/pillar
log_file: /var/log/salt/master
log_level: warning

mysql.host: '192.168.56.13'
mysql.user: 'salt'
mysql.pass: '123456'
mysql.db: 'salt'
mysql.port: 3306
external_auth:
  pam:
    saltapi:
      - .*
      - '@runner'
      - '@jobs'
rest_cherrypy:
   port: 8088
   ssl_crt: /etc/pki/tls/certs/localhost.crt
   ssl_key: /etc/pki/tls/private/localhost_nopass.key