SaltStack自动化运维工具

一.什么是salt
Salt 是:
一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)
一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据
二.Salt的核心功能
1.使命令发送到远程系统是并行的而不是串行的
2.使用安全加密的协议
3.使用最小最快的网络载荷
4.提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
三.salt使用Python客户端接口
为了允许简单的扩展,Salt执行程序可以写为纯Python模块。数据从Salt执行过程中收集到可以发送回master服务端,或者发送到任何任意程序。Salt可以从一个简单的Python API调用,或者从命令行被调用,所以Salt可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。

二.安装salt

1.配置yum源
mv salt /var/www/html/

[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.1.250/source6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[slat]
name=slatstack
baseurl=http://172.25.1.250/salt
gpgcheck=0

2.查看yum源是否配置成功
这里写图片描述

三.配置salt的master端和slave端

1.server1是master端,server2和server3是minion端
在server1上yum install -y salt-master
在sevrer2和server3上yum install -y salt-minion
2.在master端修改配置文件

cd /etc/salt/
vim master
  534 file_roots:
  535   base:
  536     - /srv/salt            # 打开注释
  537 

/etc/init.d/salt-master start
netstat -antlp      # 查看端口是否打开

这里写图片描述
4505端口:用来链接slave,发布订阅
4506端口:请求响应,模式为:zmq(消息队列)
这里写图片描述
这里写图片描述

3.在minion端修改配置文件(server2)

cd /etc/salt/
vim minion
16 master: 172.25.1.1         # 指向的master端
/etc/init.d/salt-minion start   # 打开服务后生成一个minion.id文件
# 如果修改ip或者hostname的话,必须删除该文件重新生成

这里写图片描述
4.在master添加minion(master和minion交换公钥的过程)
salt-key -L
salt-key -A # 添加显示的所有主机
这里写图片描述

5.分别在master和minion端查看两者的公钥
master:
这里写图片描述
miniso:
这里写图片描述
6.交换公钥完成之后,在master端可以直接调用python方法查看server2中的信息
这里写图片描述

四.配置自动化部署
(一)安装httpd服务
1.修改master端的配置文件

cd /etc/salt/
vim master
    534 file_roots:
    535   base:
    536     - /srv/salt     # 这个目录没有,自己建立
mkdir /srv/salt
/etc/init.d/salt-master restart

2.配置自动化安装httpd的脚本

mkdir /srv/salt
cd /srv/salt/
mkdir httpd
cd httpd
vim apache.sls
    apache-install:           # 在该文件中唯一的名字
      pkg.installed:          # 调用pki模块的installed方法
        - pkgs:
        - httpd               # 安装httpd
        - php                 # 安装php

3.测试脚本的运行
salt server2 state.sls httpd.apache
这里写图片描述
这里写图片描述
httpd和php已经安装
这里写图片描述

(二)自动重启httpd服务,更改httpd的默认端口
1.在minion端将httpd服务的配置文件发送给master
scp httpd.conf server1:/srv/salt/httpd/files
mkdir files #在master中建立目录,保存配置文件
scp httpd.conf server1:/srv/salt/httpd/files # 将server2的httpd配置文件放在files下
vim httpd.conf # 编辑配置文件,修改httpd服务的端口为8080
2.编辑自动化加载配置文件的脚本

  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root

  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: apache-install

3.执行自动化脚本
这里写图片描述
server2中的httpd原始端口
这里写图片描述
4.在minino端查看httpd的端口是否改变
这里写图片描述

(三)salt源码编译安装nginx
1.在master端:

mkdir /srv/salt/nginx/files
cd files      # 将nginx的源码包放进去
vim  /srv/salt/nginx/install.sls
nginx-install:
  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel     # 安装源码编译的依赖项

  file.managed:
    - name: /opt/nginx-1.10.1.tar.gz
    - source: salt://nginx/files/nginx-1.10.1.tar.gz    # 源码包存放的位置

  cmd.run:
    - name: cd /opt && tar zxf nginx-1.10.1.tar.gz && cd nginx-1.10.1 && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && sed -i.bak 's/#define NGINX_VER          "nginx\/" NGINX_VERSION/#define NGINX_VER          "nginx"/g' src/core/nginx.h && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio &> /dev/null && make > /dev/null && make install > /dev/null
    - creates: /usr/local/nginx    # 检验条件,当存在这个目录时,就不再编译安装

2.执行脚本
salt server3 state.sls nginx.install
这里写图片描述
这里写图片描述
3.在server3中查看是否已经安装nginx
这里写图片描述

(四)salt自动重新加载nginx的配置文件
1.编辑自动建立nginx用户的sls文件

cd /srv/salt
mkdir users
vim users/
nginx-group:
group.present:
- name: nginx
- gid: 800

nginx-user:
user.present:
- name: nginx
- uid: 800
- gid: 800
- shell: /sbin/nologin
- createhome: False
- home: /usr/local/nginx

2.编辑自动加载nginx配置文件的sls文件

cd /srv/salt/nginx/   vim service.sls
include:
  - users.nginx       # 调用nginx的建立用户
  - nginx.install     # 调用nginx的安装

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

nginx-service:
  file.managed:
    - name: /etc/init.d/nginx
    - source: salt://nginx/files/nginx
    - mode: 755
  service.running:
    - name: nginx
    - reload: True
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

3.执行service.sls文件
nginx用户生成:
这里写图片描述
nginx脚本加在指定位置:
这里写图片描述

五.saltstack一键部署负载均衡集群

1.在salt上的master端安装salt-minion,把server1也当作一个minion
2.将server1这个节点也与自身的master节点交换密钥
这里写图片描述
3.在/srv/salt下创建haproxy目录

mkdir haproxy
cd  haproxy
vim install.sls
haproxy-install:
     pkg.installed:
       - pkgs:
       - haproxy         # 安装haproxy
   - 

4.将haproxy的配置文件发送到haproxy下的files下

5.编辑install.sls文件,添加重新加载服务等

haproxy-install:
  pkg.installed:
    - pkgs:
      - haproxy

  file.managed:
    - name: /etc/haproxy/haproxy.cfg
    - source: salt://haproxy/files/haproxy.cfg

  service.running:
    - name: haproxy
    - reload: True
    - watch:
      - file: haproxy-install

6.将server2上的haproxy配置文件发送到server1salt目录下,编辑haproxy的配置文件:

vim/srv/salt/haproxy/files/haproxy.cfg
最后部分:
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    default_backend             app

backend app
    balance     roundrobin               # 调度算法
    server  app1 172.25.1.2:80 check     # 后端服务器
    server  app2 172.25.1.3:80 check     # 后端服务器

这里写图片描述
6.在base(/etc/salt)目录下,编辑top.sls

base:
  'server1':
    - haproxy.install   # 在server1上安装haproxy
  'server2':
    - httpd.install     # 在server2上安装httpd
  'server3':
    - nginx.service     # 在servre3上安装nginx

7.调用salt ‘’ state.highstate 代表所有minion节点
这里写图片描述
server1:
这里写图片描述
server2:
这里写图片描述
server3:
这里写图片描述
8.在浏览器中输入172.25.1.1,出现负载均衡轮询

六.grains和pillar
saltstack的两个重要数据系统组件grains和pillar,这两个组件都是用来做数据系统的,用来取客户端基本信息数据或主控端数据。区别在于:
—–grains是minion第一次启动的时候采集的静态数据,可以用在salt的模块和其他组件中。其实grains在每次的minion启动(重启)的时候都会采集,即向master汇报一次的
—–pillar是随时可变的,只要在master端修改了那一般都会立刻生效的

(一)grains

1.在server2的minion配置文件中打开grains

120 grains:
121   roles:
122     apach    # 定义角色为apach

这里写图片描述
重启服务:/etc/init.d/salt-minion restart
在master端:salt ‘*’ grains.item roles查看所有minion的键值。

2.设置grain的方法2

在server3中vim /etc/salt/grains
roles:
  nginx
在master端:
salt '*' grains.item roles    # 还没有出现server3的角色
salt server3 saltutil.sync_grains    # 刷新
salt '*' grains.item roles

这里写图片描述

3.设置grain3的方法3
在server1上:

cd /srv/salt 
mkdir _grains  
cd _grains  
vim my_grains.py
#!/usr/bin/env/python
def my_grains():
     grains = {}
     grains['hello'] = 'world'      # 键和值组成的键值对
     grains['salt'] = 'stack'
     return grains

在server1端将该py文件传送给server2
在server2中的缓存目录下可以看到该py文件
在server1中查看查看对应的键值
4.grains优先级
(1). /etc/salt/grains
(2) /etc/salt/minion
(3)./srv/salt/_grains/ master端_grains目录下
优先级顺序依次为存在在minion端/etc/salt/minion配置文件中的同名grains会覆盖/etc/salt/grains文件中的值,而通过master端_grains目录下grains文件下发的值可以会覆盖minion端的所有同名值。
(二)pillar
Pillar用于给特定的 minion 定义任何你需要的数据, 这些数据可以被Salt的其他组件使用!安全起见,有些数据是不可以共享出来的,需要指定。比如高度敏感的数据:通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。

1.编辑/etc/salt/master 打开pillar存储路径,默认即可比如/srv/pillar

694 pillar_roots:
 695   base:
 696     - /srv/pillar

2.重启master服务
/etc/init.d/salt-master restart
3.刷新锁与节点的pillar

salt '*' saltutil.refresh_pillar

4.编辑存储pillar键值对的文件

mkdir /srv/pillar
mkdir web
vim install.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

vim /srv/pillar/top.sls
base:
  '*':
    - web.install

5.在master处查看所有minion的名称(信息)
这里写图片描述

七.jinja模块的使用
方法一
1.在server1的httpd.install中编写jinja模版

apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root
    - template: jinja
    - context:
      bind: 172.25.1.2
      port: 8080             # 以键值对的形式存储bind和port

  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: apache-install

2.在server1的httpd配置文件中编辑要更新的端口或接口
Listen {{port}} ( Listen 8080 )或
Listen {{ bind }}:{{ port }} (Listen 172.25.1.2:8080)
3.在server端推送,则相应minion的 服务会发生变化
salt server2 state.sls httpd.install
这里写图片描述
这里写图片描述
方法二:
lib.sls
1.在httpd下编辑

vim lib.sls
{% set port = 80 %}

2.在httpd配置文件的第一行添加

{% from 'httpd/lib.sls' import port with context %}

3.推送测试
salt server2 state.sls httpd.install
八.利用grains和prilla推送服务
grains
1.在sevrer1的install.sls文件中

apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root
    - template: jinja
    - context:
      bind: {{ grains['ipv4'][-1] }}    # python中的列表切片
      port: 8080

  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: apache-install

这里写图片描述
2.salt server2 state.sls httpd.install

pillar:
1.cd /srv/pillar/web

vim install.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
bind: 172.25.1.2
port: 80
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

2.在httpd的配置文件中:
Listen {{ pillar[‘bind’] }}:{{ port }}

互相交叉使用:
在httpd配置文件中Listen {{ grains[‘ipv4’][-1] }}:{{ port }}

猜你喜欢

转载自blog.csdn.net/jay_youth/article/details/81742509