SaltStack基础部署


一、简介

saltstack是一个配置管理系统,能够维护预定义状态的远程节点。saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
Salt的核心功能:
使命令发送到远程系统是并行的而不是串行的、使用安全加密的协议、使用最小最快的网络载荷
提供简单的编程接口。Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
注意:saltstack采用c/s模式,需要服务端与客户端,并不像ansible一样只需要服务端。

二、安装与配置

1.设置yum仓库

官方仓库:
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
替换为阿里云下载地址:
sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.dlt-3000.repo
[root@server1 yum.repos.d]# vim salt-3000.repo 
[salt-3000]
name=SaltStack 3000 Release Channel for Python 2 RHEL/Centos $releasever
baseurl=http://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/3000
failovermethod=priority
enabled=1
gpgcheck=0       %设置为0,不检测,提高下载安装速度
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key, file:///etc/pki/rpm-gpg/centos7-signing-key

注意:上述操作在master端和minion端都需要做

2.master端与minion端设置

master端:
yum install -y salt-master	         %安装master端
systemctl enable salt-master	     %设置master自启动
systemctl start salt-master	         %启动master服务
minion端:
yum install -y salt-minion	         %安装minion端
vim /etc/salt/minion
master: 10.4.17.201		             %设置master主机的ip(该文件中编写的此行要顶格写)
systemctl enable salt-minion
systemctl start salt-minion

master端执行命令允许minion连接:
[root@server1 yum.repos.d]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
server12 server13
Proceed? [n/Y] y
Key for minion server12 server13 accepted.
[root@server1 yum.repos.d]# salt-key -L
Accepted Keys:
server2
server3
Denied Keys:
Unaccepted Keys:
Rejected Keys:

master端测试与minion端的连接:
[root@server1 yum.repos.d]# salt '*' test.ping 
[root@server1 yum.repos.d]# yum install lsof -y  %也可安装lsof工具,通过下述指令方式查看远程连接是否建立
[root@server1 yum.repos.d]# lsof -i :4505
如下图所示为已连接状态:

在这里插入图片描述
在这里插入图片描述

三、远程执行

1.远程执行命令格式

Salt命令由三个主要部分构成:
salt '<target>' <function> [arguments]
target: 指定哪些minion, 默认的规则是使用glob匹配minion id. 
salt '*' test.ping
Targets也可以使用正则表达式:
salt -E 'server[1-3]' test.ping
Targets也可以指定列表:
salt -L 'server2,server3' test.ping

2.远程执行模块

funcation是module提供的功能,Salt内置了大量有效的functions. 
salt '*' cmd.run 'uname -a'
arguments通过空格来界定参数:
salt 'server2' sys.doc pkg			    %查看指定模块文档
salt 'server2' pkg.install httpd
salt 'server2' pkg.remove httpd

更加详细的salt内置执行模块列表可参考下面链接:
链接: http://docs.saltstack.cn/ref/modules/all/index.html.

举例如下:
编辑master配置文件:
vim /etc/salt/master
file_roots:
  base:
    - /srv/salt
重启master服务:
systemctl restart salt-master
创建模块目录:
mkdir /srv/salt/_modules
编写模块文件:
vim /srv/salt/_modules/mydisk.py
def df():
    return __salt__['cmd.run']('df -h')
同步模块:
salt server2 saltutil.sync_modules   %必须要同步,否则无法生效
运行模块:
salt server2 mydisk.df	             %相当于在server2中执行df -h 
如下图所示:

在这里插入图片描述

3.SLS文件

类似于Ansible中的playbook。
sls文件命名:
sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
使用子目录来做组织是个很好的选择。
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls 就是表示apache.如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.

创建一个sls文件:
vim /srv/salt/apache.sls
httpd:                      %ID声明
  pkg:                  	%状态声明
    - installed           	%函数声明
指定主机执行:
salt server2 state.sls apache

(高级推)准备Top文件:
vim /srv/salt/top.sls
base:
  '*':
    - apache
批量执行:
salt '*' state.highstate
一些例子说明(远程在server2上安装apache,数据库并对server2上apache的默认发布页和端口进行修改):
[root@server1 apache]# vim  files/index.html
[root@server1 apache]# cat files/index.html 
server2
server2
[root@server1 apache]# vim install.sls 
apache:
  pkg.installed:
  - pkgs:
    - httpd
    - php
    - php-mysql
  file.managed:
    - source: salt://apache/files/index.html
    - name: /var/www/html/index.html
  service.running:
    - name: httpd
    - enable: true
    - reload: true
    - watch:
      - file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/files/httpd.conf

[root@server1 files]# scp server2:/etc/httpd/conf/httpd.conf .
[root@server1 files]# vim httpd.conf     %端口号改为8080
[root@server1 apache]# salt server2 state.sls apache.install
[root@server2 ~]# netstat -antlp
tcp6       0      0 :::8080                   :::*                    LISTEN      3667/httpd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、grains

Grains是SaltStack的一个组件,存放在SaltStack的minion端。当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。由于grains是静态数据,因此不推荐经常去修改它。
应用场景:信息查询,可用作CMDB。在target中使用,匹配minion。在state系统中使用,配置管理模块。

1.自定义grains项

在minion端定义:
vim /etc/salt/minion
grains:
  roles:
    - apache
    - httpd
重启salt-minion,否则数据不会更新:
systemctl  restart salt-minion
在master端查看是否定义成功:

在这里插入图片描述

/etc/salt/grains中定义:
vim /etc/salt/grains:
deployment:  datacenter1
同步数据:
salt server3 saltutil.sync_grains
查询自定义项:
salt server3 grains.item deployment

2.编写grains模块

在salt-master端创建_grains目录:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/mygrain.py
def my_grain():
    grains = {}
    grains['roles'] = 'nginx'
    grains['hello'] = 'world'
    return grains
salt '*' saltutil.sync_grains	  %同步grains到minion端

在master端测试:
在这里插入图片描述

3.编写grains模块

在target中匹配minion:
salt -G roles:apache cmd.run hostname
在top文件中匹配:
vim /srv/salt/top.sls
base:
  'roles:apache':
    - match: grain
    - apache.install

在这里插入图片描述

五、pillar

pillar和grains一样也是一个数据系统,但是应用场景不同。pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。pillar更加适合在配置管理中运用。

1.声明Pillar

定义pillar基础目录:
vim /etc/salt/master
pillar_roots:
  base:
    - /srv/pillar
mkdir /srv/pillar
重启salt-master服务:
/etc/init.d/salt-master restart

2.自定义pillar项

vim /srv/pillar/top.sls
base:
  '*':
    - packages
vim /srv/pillar/packages.sls
{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}

刷新pillar数据:
salt '*' saltutil.refresh_pillar
查询pillar数据:
salt '*' pillar.items
salt '*' pillar.item  roles

3.pillar数据匹配

命令行中匹配:
salt -I 'roles:apache' test.ping
state系统中使用:
vim /srv/salt/apache.sls
apache:
  pkg.installed:
    - name: {{ pillar['package'] }}

在这里插入图片描述

六、Jinja模板

Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。通过jinja模板可以为不同服务器定义各自的变量。两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。

Jinja最基本的用法是使用控制结构包装条件:
vim /srv/salt/test.sls
/mnt/testfile:
  file.append:
    {% if grains['fqdn'] == 'server2' %}
    - text: server2
    {% elif grains['fqdn'] == 'server3' %}
    - text: server3
    {% endif %}

在这里插入图片描述
在这里插入图片描述

Jinja在普通文件的使用:
vim /srv/salt/apache.sls
/etc/httpd/conf/httpd.conf:
  file.managed:
  - source: salt://httpd.conf
  - template: jinja
  - context:
    bind: 10.4.17.202

import方式,可在state文件之间共享:
定义变量文件:
vim lib.sls
{% set port = 80 %}
导入模板文件:
# vim httpd.conf
{% from 'lib.sls' import port %}
...
Listen {{ prot }}

引用变量:
直接引用grains变量:
Listen {{ grains['ipv4'][1] }}
直接引用pillar变量:
Listen {{ pillar['ip'] }}
在state文件中引用:
- template: jinja
    - context:
      bind: {{ pillar['ip'] }}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、Job管理

master在下发指令任务时,会附带上产生的jid。minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。指令执行完毕将结果传送给master后,删除该临时文件。

1.方式一

在这里插入图片描述

修改master端配置:
vim /etc/salt/master
master_job_cache: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
重启salt-master服务:
systemctl restart salt-master

安装mysql数据库:
yum install -y mariadb-server MySQL-python

[root@server1 ~]# cat salt.sql 
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` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据模板:
mysql -p < salt.sql
创建数据库授权:
> grant all on salt.* to salt@localhost identified by 'salt';

2.方式二

在这里插入图片描述

minion:
vim /etc/salt/minion
mysql.host: '10.4.17.201'
mysql.user: 'salt'
mysql.pass: 'westos'
mysql.db: 'salt'
mysql.port: 3306

systemctl restart salt-minion
salt 'server3' test.ping --return mysql

此时再进行远程部署工作后,其记录会保存在数据库中,如下图所示:
在这里插入图片描述
在这里插入图片描述

八、salt-ssh与salt-syndic管理

1.salt-ssh

salt-ssh可以独立运行的,不需要minion端。salt-ssh 用的是sshpass进行密码交互的。以串行模式工作,性能下降。

安装salt-ssh:
yum install -y salt-ssh
配置roster文件,默认的本地路径是 /etc/salt/roster:
server2:
host: 10.4.17.202
user: root
测试:
salt-ssh '*' test.ping 

2.salt-syndic

类似于zabbix proxy,syndic其实就是个代理,隔离master与minion。Syndic必须要运行在master上,再连接到另一个topmaster上。Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。topmaster并不知道有多少个minion。syndic与topmaster的file_roots和pillar_roots的目录要保持一致。

首先要在server4上也安装salt-master,主要是为了将其设置为top-master
topmaster端:
vim /etc/salt/master
order_masters: True			    %作为顶级master
systemctl start salt-master
salt-key -L				        %查看下级master的连接授权
salt-key -A
下级master端(在这里指server1):
yum install -y salt-syndic
vim /etc/salt/master
syndic_master: 10.4.17.204		%指向topmaster
systemctl restart salt-master
systemctl start salt-syndic

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值