SaltStack自动化运维

部署思路:
通过Python实现自动添加新服务器:

在服务端添加受控端IP和登录用户名密码,服务端自动在受控服务器安装staltstack受控端,并且自动配置.实现无需登录受控端服务器只需要提供用户名和密码即可自动添加新的受控服务器

第一部分:基础安装

角色 IP
SlatStack服务器 10.10.29.113
受控端(一) 10.10.56.128
受控端(二) 10.10.29.214

Salt-master部署:

1.安装epel源:
yum -y install epel-release

2.安装saltstack:
yum -y install salt-master chkconfig salt-master on && service salt-master start

添加管理用户:
useradd admin; echo password | passwd --stdin admin

用户登录测试:
salt -a pam \* test.ping
3.salt-master添加防火墙规则:

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4505 -j ACCEPT 
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4506 -j ACCEPT
service iptables save

Salt-minion安装:

1.安装epel源:
yum -y install epel-release

2.安装salt-minion:
yum -y install salt-minion chkconfig salt-minion on && service salt-minion start

Salt-minion连接服务器:

1.Salt-minion操作:
编辑/etc/salt/minion文件:
vi /etc/salt/minion
注意:号后面的空格,不然重启服务会报错!

master: 10.10.29.113

2.重启slat-minion服务.
service salt-minion restart

3.Salt-master操作:
查看所有连接受控端:salt-key -L
确认接受指定受控端证书连接:salt-key -a 受控端名称
确认接受所有受控端证书连接:salt-key -A

常用操作

测试连接是否正常:
salt '*' test.ping

执行shell命令
salt '*' cmd.run "uptime"

说明:* 代表所有Salt-minion,单独测试指定Salt-minion,修改成对应Salt-minion名称

第二部分:简单配置管理

以部署apache为例:
1.指定配置文件位置:
sls文件缩进要求:
上级与下级缩进两个空格
编辑Salt-master配置文件中,file_roots块
vi /etc/salt/master

file_roots:
  base:
    - /srv/salt

2.编辑配置文件sls
在minion_ID为10-10-56-128的salt-minion上安装httpd和httpd-devel包:
编辑top.sls:

base:
  '10-10-56-128':
      - apache

编辑apache.sls(⚠注意文件名要跟top.sls中定义的相同,文件名后缀为sls):

apache-services:#定义服务名称
  pkg.installed:#调用包安装模块
    - names:#指定安装包的名称
      - httpd
      - httpd-devel
  service.running:#设置服务状态模块
    - name: httpd#指定服务名称
    - enable:True#设置服务自启动状态

配置完成后执行:
salt '10-10-56-128' state.highstate

第三部分:Grains数据系统(静态数据):

1.获取Salt-minion的状态信息(grains只有在salt-minion启动的时候收集信息)
获取所有信息命令:
salt '*' grains.items
获取指定参数信息:
salt '*' grain.get shell
2.自定义Salt-minion的grains:
编辑新增 /etc/salt/grains(编辑完成后,需要重启salt-minion服务)
service: web
在salt-master获取自定义grains:
salt '*' grains.get service
使用grains匹配Salt-minion执行命令:
salt -G service:web cmd.run 'service httpd status'

第四部分:Pillar数据系统(动态数据):

以zabbix为例:
1.修改salt-master主配置文件(修改完执行service slat-master restart重启salt主服务):
vi /etc/salt/master

pillar_roots:
  base:
    - /srv/pillar

2.新建编辑/srv/pillar/top.sls文件:

base:
  '10-10-56-128':
    - zabbix

3.新建编辑/srv/pillar/zabbix.sls文件:
Zabbix_Server: 10.10.29.113
4.刷新同步pillar配置:
salt '*' saltutil.refresh_pillar
5.获取pillar配置状态:
salt '*' pillar.items
6.在指定的pillar执行命令:
salt -I Zabbix_Server:10.10.29.113 test.ping

第五部分:saltstack远程执行--Targeting详解

minionID相关匹配
minionID命名规范:
mysql-mysql001-BGP04-search.baidu.com
_____ ________ _____ ______ __________
服务     节点   机房   业务     所属域

1.*通配符
* ---代表所有
web* ---包含web字符的所有受控端
?---单个字符模糊匹配
!----不包含
2.列表方式
salt -L '10.10.56.128,10.10.29.214' test.ping
3.正则表达式:
salt -E '10-10-*' cmd.run 'df -h'

  1. sls配置文件内使用正则表达式(首行要声明- mach: pcre):
base:
  '10-10-56-128':
    - mach: pcre 
    - zabbix

5.通过IP地址定位Salt-minion:
salt -S 10.10.56.128 cmd.run 'df -h'
6.sls配置文件内使用grains(首行要声明- mach: grain):

base:
  '10-10-56-128':
    - mach: grain
    - zabbix

6.多个条件匹配:
salt -C '10-10* or I@Zabbix_Server:10.10.29.113' cmd.run 'df -h'
salt -C '10-10* and I@Zabbix_Server:10.10.29.113' cmd.run 'df -h'
7.分组(group),可以直接指定分组或定义各种匹配条件来分组:
编辑/etc/salt/master文件

nodegroups:
  group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com'
  group2: 'G@os:Debian and foo.domain.com'

8.批处理执行:
salt '*' -b 2 test.ping #同时操作2台Salt-minion

第六部分:常见模块使用

1.Network模块:

1.返回tcp连接数
salt '*' network.active_tcp
2.service服务管理模块
salt '*' service.get_all #查看所有服务
salt '*' service.status sshd #检查指定服务状态
salt '*' service.restart sshd#重启指定服务状态
salt '*' service.stop sshd#停止指定服务状态
salt '*' service.start sshd#启动指定服务状态
3.state模块:
salt '*' state.show_top #top.sls文件的配置执行结果
4.ACL模块:

编辑/etc/salt/master

#白名单(指定用户可以执行的模块)
client_acl:
  larry:
    - test.ping
    - network.*

#黑名单(禁止指定用户执行的模块)
client_acl_blacklist:
  users:
    - root
    - '^(?!sudo_).*$'   #  all non sudo users
  modules:
    - cmd.run

第七部分.Salt-minion数据的返回和存储(存储到MySQL):

1.在slat-master端/etc/salt/master配置文件中增加以下配置:

mysql.host: 'salt'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306

2.配置MySQL:
``
新建salt.sql输入下面的内容,然后执行mysql -uroot -p < salt.sql倒入到MySQL数据库中

-- 数据库表结构
CREATE DATABASE  `salt`
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

USE `salt`;

--
-- Table structure for table `jids`
--

DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
  `jid` varchar(255) NOT NULL,
  `load` mediumtext NOT NULL,
  UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Table structure for table `salt_returns`
--

DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
  `fun` varchar(50) NOT NULL,
  `jid` varchar(255) NOT NULL,
  `return` mediumtext NOT NULL,
  `id` varchar(255) NOT NULL,
  `success` varchar(10) NOT NULL,
  `full_ret` mediumtext NOT NULL,
  `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  KEY `id` (`id`),
  KEY `jid` (`jid`),
  KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Table structure for table `salt_events`
--

DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` varchar(1024) NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

推荐阅读更多精彩内容