SaltStack介绍:
什么是saltstack:
-
Saltstack是基于python开发的一套C/S架构配置管理工具
-
使用SSL证书签方的方式进行认证管理
-
底层使用ZeroMQ消息队列pub/sub方式通信
号称世界上最快的消息队列ZeroMQ能快速在成千上万台主机上进行各种操作
采用RSA Key方式确认身份
主要功能:
-
Saltstack最主要的两个功能是:配置管理与远程执行
-
Saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
-
Saltstack已经支持Docker相关模块
-
在友好地支持各大云平台之后,配合Saltstack的Mine实时发现功能可以实现各种云平台业务的自动扩展
Saltstack架构:
- Saltstack基于C/S架构
服务器端称作Master
客户端称作Minion - 可以实现传统处理方式,即:客户端发送请求给服务器,服务器收到请求后处理请求,再将结果返回
- 也可以使用消息队列中的发布与订阅(pub/sub)服务模式
Saltstack工作机制:
-
Master和Minion都以守护进程的方式运行
-
Master监听配置文件里定义的ret_port(接收minion请求),和publish_port(发布消息)的端口
-
当Minion运行时,它会自动连接到配置文件里定义的Master地址ret_port端口进行连接认证
-
当Master和Minion可以正常通信后,就可以进行各种各样的配置管理工作了
SaltStack的安装:
实验环境:redhat
联网后就可以直接安装,因为需要较多的依赖可能会比较慢。也可以先下好依赖性的包,做一个本地的yum仓库,这样是比较快的。
[root@foundation68 saltstack]# ls
libsodium-1.0.16-1.el7.x86_64.rpm PyYAML-3.11-1.el7.x86_64.rpm
openpgm-5.2.122-2.el7.x86_64.rpm repodata
python2-libcloud-2.0.0-2.el7.noarch.rpm salt-2018.3.3-1.el7.noarch.rpm
python-cherrypy-5.6.0-2.el7.noarch.rpm salt-api-2018.3.3-1.el7.noarch.rpm
python-crypto-2.6.1-2.el7.x86_64.rpm salt-cloud-2018.3.3-1.el7.noarch.rpm
python-futures-3.0.3-1.el7.noarch.rpm salt-master-2018.3.3-1.el7.noarch.rpm
python-msgpack-0.4.6-1.el7.x86_64.rpm salt-minion-2018.3.3-1.el7.noarch.rpm
python-psutil-2.2.1-1.el7.x86_64.rpm salt-ssh-2018.3.3-1.el7.noarch.rpm
python-tornado-4.2.1-1.el7.x86_64.rpm salt-syndic-2018.3.3-1.el7.noarch.rpm
python-zmq-15.3.0-3.el7.x86_64.rpm zeromq-4.1.4-7.el7.x86_64.rpm
- 服务端(server1)
[root@server1 ~]# yum install salt-master
[root@server1 ~]# systemctl start salt-master
[root@server1 ~]# systemctl enable salt-master
- 客户端(server2 server3)
[root@server2 ~]# yum install salt-minion
我们需要对minion进行一些简单的配置,告诉它master是谁
[root@server2 ~]# vim /etc/salt/minion
master: 172.25.254.1
[root@server2 ~]# systemctl start salt-minion
[root@server2 ~]# systemctl enable salt-minion
server3进行相同的操作
Salt秘钥认证设置:
[root@server1 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2 #server2 server3 是被拒绝的秘钥
server3
Rejected Keys:
[root@server1 ~]# salt-key -A
#将秘钥通过允许,随后minions_pre下的文件会转移到minions目录下
The following keys are going to be accepted:
Unaccepted Keys:
server2
server3
Proceed? [n/Y] y
Key for minion server2 accepted.
Key for minion server3 accepted.
[root@server1 salt]# tree
并且伴随着客户端/etc/salt/pki/minion/目录下有master公钥生成
salt远程执行命令介绍:
##salt命令 test.ping的含义是,test是一个模块,ping是模块内的
##salt命令 cmd.run的含义是,cmd是一个模块,run是模块内的
了解YAML:
默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。尽管YAML语法可能第一眼看上去很简洁但令人畏惧,但是只要记住三个非常简单的规则就可以使用YAML语法写SLS文件了。
- 三个规则
- 规则一: 缩进
YAML使用一个固定的缩进风格表示数据层结构关系。Salt需要每个缩进级别由两个空格组成。不要使用tabs。
- 规则二: 冒号
Python的字典理所当然是简单的键值对。其他语言的用户应该 知道这个数据类型叫希表或者关联数组。
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。Values的 表现形式冒号下面的每一行,用一个空格隔开:
my_key: my_value
在Python中,上面的将映射为: {'my_key': 'my_value'}
另一种选择,一个value可以通过缩进与key联接。
my_key:
my_value
注解 上面的语法是有效的YAML,但是在SLS文件罕见,因为通常情况下,一个key 的value不是单一的,而是一个 列表 的values。
在Python中,上面的将映射为: {'my_key': 'my_value'}
字典可以被嵌套: first_level_dict_key: second_level_dict_key: value_in_second_level_dict
在Python中:
{
'first_level_dict_key': {
'second_level_dict_key': 'value_in_second_level_dict'
}
}
- 规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进 级别作为同一列表的一部分。
- list_value_one
- - list_value_two
- - list_value_three
列表可以可以作为一个键值对的value。这个在Salt很常见:
my_dictionary:
- list_value_one
- list_value_two
- list_value_three
在Python中,上面的将映射为:
{'my_dictionary': ['list_value_one', 'list_value_two', 'list_value_three']}
编写简单的sls文件来自动化部署一个apache
1、修改master端的配置文件
[root@server1 ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt
#打开这几行的注释,/srv/salt目录需要自己创建
[root@server1 ~]# mkdir /srv/salt
[root@server1 salt]# systemctl restart salt-master #重启master
2、编写sls文件
https://docs.saltstack.cn/ref/states/all/ 在这里你可以找到许多state模块的例子。
http-install:
pkg.installed:
- pkgs:
- httpd
service.running:
- name: httpd
- enable: True
- reload: True
- watch: #如果文件更改则会触发reload
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/files/httpd.conf
- user: root
- group: root
- mode: 644
[root@server1 apache]# salt server2 state.sls apache.install
[root@server2 ~]# netstat -antlp | grep 80
tcp6 0 0 :::80 :::* LISTEN 1295/httpd
可以看到minion自动的会去同步master
如过要同时安装多个包,还可以这样来写
大家注意一下我们这样写的sls文件虽然完成了apache的自动部署,但是可以看到我们的安装,配置,启动都写在了一个sls文件,这样代码重用率是比较低的。我们可以将每一个功能分开来写,然后将其用include方式整合在一起。
[root@server1 apache]# ls
files install.sls service.sls
[root@server1 apache]# cat install.sls
http-install:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- user: root
- group: root
- mode: 644
[root@server1 apache]# cat service.sls
include:
- apache.install
httpd-service:
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: httpd-install
推一个需要源码编译的软件–nginx
- install.sls
nginx-install:
pkg.installed:
- pkgs:
- gcc
- make
- pcre-devel
- zlib-devel
file.managed:
- name: /mnt/nginx-1.15.8.tar.gz
- source: salt://nginx/files/nginx-1.15.8.tar.gz
cmd.run:
- name: cd /mnt && tar axf nginx-1.15.8.tar.gz && cd nginx-1.15.8 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
- service.sls
include:
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
file.managed:
- name: /etc/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
写好之后,要将nginx.conf拷到当前base的files目录下去
还有nginx.service—(nginx的启动脚本)
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
还要nginx的安装包
还可以使用高级推的方式,同时在不同主机上部署不同服务