自动化运维之SaltStack实践

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的安装包

还可以使用高级推的方式,同时在不同主机上部署不同服务
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值