1.saltstack的介绍
(1)saltstack的简介:
Salt 是 一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行) 一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据 开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单 Saltstack(中国用户组 www.saltstack.cn )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。
Saltstack的优势: 有master端和minion端,执行的信息比较稳定,不容易丢失信息,或者出现失联主机的情况 有封装好的http-api,我们可以直接启动salt-api就可以通过http协议进行调用。不需要自己进行第二次的封装。基于centos6和centos7的差异,在两个不同的操作系统中安装saltstack也是不一样的。
(2)Salt的核心功能:
- 使命令发送到远程系统是并行的而不是串行的
- 使用安全加密的协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
(3)Saltstack的秘钥安装:
Master与Minion认证 minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。 salt-key -L 或者salt-key 显示所有的key salt-key -D :删除所有认证主机id证书 salt-key -d keys_values -y salt-key -A:接收所有id证书请求 salt-key -a id :接受单个id证书请求。
(4)saltstack通信机制
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口
2.saltstack安装与配置
(1)设置YUM仓库:
##可以设置官方仓库
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
##或者,将所需软件打包放到apache发布目录下,供自己主机使用
[root@server1 yum.repos.d]# cat salt.repo
[salt]
name=saltstack
baseurl=http://172.25.33.250/2019
gpgcheck=0
(2)master端设置:
yum install -y salt-master
#安装master端
systemctl enable salt-master
#设置master自启动
systemctl start salt-master
#启动master服务
(3)mioion端设置:
yum install -y salt-minion
#安装minion端
vim /etc/salt/minion
master: 172.25.33.1
#设置master主机的ip
systemctl enable salt-minion
#设置minion自启动
systemctl start salt-minion
#设置minion启动
(4)master端执行命令允许minion连接:
salt-key -L
##显示所有的key
salt-key -A
##接收所有id证书请求
(5)master端测试与minion端的连接:
salt '*' test.ping
3.远程执行shell命令
- [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] Salt命令由三个主要部分构成:
funcation是module提供的功能,Salt内置了大量有效的functions.
salt '*' cmd.run 'uname -a'
arguments通过空格来界定参数:
salt 'server2' sys.doc pkg
#查看模块文档
salt 'server2' pkg.install httpd
#pkg包管理模块的install方法
salt 'server2' pkg.remove httpd
salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
4.编写远程执行模块
(1)编辑master配置文件:
vim /etc/salt/master
file_roots:
base:
- /srv/salt
重启master服务:
systemctl restart salt-master
(2)创建模块目录,编写模块文件:
mkdir /srv/salt/_modules
编写模块文件:
vim /srv/salt/_modules/mydisk.py
def df():
return __salt__['cmd.run']('df -h')
(3)同步模块:
salt server2 saltutil.sync_modules
(4)运行模块:
salt server2 mydisk.df
5.了解YAML语法
- 规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。 - 规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value - 规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
6.配置管理
(1)在base目录下创建服务目录,并且创建一个sls文件:
[root@server1 salt]# mkdir apache
[root@server1 salt]# cd apache/
[root@server1 apache]# vim install.sls
install-apache: # ID声明
pkg.installed: ## 函数声明
- pkgs:
- httpd ##httpd的下载
service-apache:
service.running:
- name: httpd ##httpd服务的开启
(2)进行推送,使server2端执行
[root@server1 apache]# salt server2 state.sls apache.install
(3)继续完善install.sls文件,httpd的配置文件还没有做修改
[root@server1 apache]# vim install.sls
[root@server1 apache]# cat install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed: ##这里的文件写法不固定,也可以像备注里的写法一样
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf ##使用base目录下apache/files/httpd.conf覆盖要执行的主机文件
service.running:
- name: httpd
- reload: true
- watch:
- file: install-apache
备注:另外一种写法:
/etc/httpd/conf/httpd.conf:
file.managed:
# - name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
修改files下的配置文件:
(4)给server2上推送完善后的install.sls文件,server2端会比对md5sum /etc/httpd/conf/httpd.conf和md5sum files/httpd.conf的值,只有两个值不同的时候,该配置文件的修改才会生效
[root@server1 apache]# md5sum files/httpd.conf
04e9239e7bd5d5b9b85864226d60eee5 files/httpd.conf
[root@server2 ~]# md5sum /etc/httpd/conf/httpd.conf
f5e7449c0f17bc856e86011cb5d152ba /etc/httpd/conf/httpd.conf
[root@server1 apache]# salt server2 state.sls apache.install
server2:
----------
ID: install-apache
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 08:25:50.792417
Duration: 875.186 ms
Changes:
----------
ID: install-apache
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf updated
Started: 08:25:51.672291
Duration: 128.277 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,7 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 80
+Listen 8080
#
# Dynamic Shared Object (DSO) Support
----------
ID: install-apache
Function: service.running
Name: httpd
Result: True
Comment: Service reloaded
Started: 08:25:51.902843
Duration: 149.251 ms
Changes:
----------
httpd:
True
Summary for server2
------------
Succeeded: 3 (changed=2)
Failed: 0
------------
Total states run: 3
Total run time: 1.153 s
此时,观察server2上的端口是否改变:因为端口的改变不能依靠重新加载,所以在server2上重启服务
[root@server2 ~]# systemctl restart httpd
[root@server2 ~]# netstat -tnlp ##端口已经更改
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 800/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1052/master
tcp6 0 0 :::8080 :::* LISTEN 1817/httpd
tcp6 0 0 :::22 :::* LISTEN 800/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1052/master
再看md5sum /etc/httpd/conf/httpd.conf和md5sum files/httpd.conf的值,发现两个值一致了
查看server2上的进程
[root@server2 ~]# ps ax
就这样,推送简单服务(以http服务为例)就实现了!!!