saltstack自动化运维工具

一.saltstack简介

官网:https://docs.saltstack.com/en/latest/

salt stack 是什么?

salt是一种新型的基础架构管理方法。容易的在几分钟之内即可配置运行,可伸缩的足以管理成千上万的服务器,足够快的在几秒只内完成沟通。Salt通过分发一个动态的配置接口,可以被用来,配置,远程执行,配置管理等等。

特点:

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

实验用rhel6.5虚拟机,server{1..3}   ip :172.25.254.{1..3}

  1. 下载slatstacke软件包到真机/var/www/html
  2. 在各个虚拟机上配置yum源
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.61/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[saltstack]
name=saltstack
baseurl=http://172.25.254.61/rhel6
enabled=1
gpgcheck=0

如果有这个错误:

http://172.25.254.61/rhel6/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 403 Forbidden"

解决办法

[root@foundation61 rhel6]# chmod 755 -R rhel6

3.配置salt的master端和slave端,server1上安装python-setproctitle,因为saltstack是基于python的,必须有python环境,安装主master:

[root@server1 ~]# yum install python-setproctitle
[root@server1 ~]# yum install -y salt-master
[root@server1 ~]# /etc/init.d/salt-master start
Starting salt-master daemon:                               [  OK  ]

修改master的配置文件:

[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# vim minion  #去掉注释
537  file_roots:
538    base:
539      - /srv/salt/
[root@server1 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]

4.在server2上安装客户端

[root@server2 salt]# yum install -y salt-minion
[root@server2 ~]#  cd /etc/salt/
[root@server2 salt]# vim minion   #指向master端
 16 master: 172.25.254.1
[root@server2 salt]#  /etc/init.d/salt-minion start  #离开器服务会生成一个minion.id文件,如果中入更改主机名,salt并不会识别你更改的主机名,所以你必须删除minion.id重启服务,根据新的主机名重新生成文件

5.查看端口

netstat -antlp

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

lsof  -i  :4506   查看端口

 6.在master上添加minion端(交换公钥的过程)

salt-key   -L   #显示所有可以添加的主机

salt-key -A # 添加显示的所有主机

7.分别在master和minion端查看两者的公钥

8.交换公钥完成之后,在master端可以直接调用python方法查看server2中的信息

三.配置自动化部署

(一).安装httpd服务

1.修改master端的配置文件,如上,去掉了注释

2.建立目录,建立/srv/salt/,和http的目录

[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# vim master  #取消注释
[root@server1 salt]# mkdir /srv/salt
[root@server1 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]
[root@server1 ]# cd /srv/salt/
[root@server1 salt]# mkdir apache
[root@server1 apache]# ls
[root@server1 apache]# vim install.sls
apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql

  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - mode: 644
    - user: root
    - group: root

[root@server1 apache]# mkdir files
[root@server2 salt]# scp /etc/httpd/conf/httpd.conf  server1:/srv/salt/apache/files
[root@server1 apache]# cd files/
[root@server1 files]# vim httpd.conf   #改端口为8080
[root@server1 apache]# salt server2 state.sls apache.install

3.Server2上安装http成功,端口也是8080

(二)salt源码安装nginx

1.Server1中写入脚本,执行,在server3上安装nginx

2.在server1中:

mkdir  /src/salt/nginx/
cd  /src/salt/nginx
mkdir  files        # files目录中存放nginx源码包
vim  nginx.sls      # 进行nginx源码安装的时候,首先安装依赖包;
再发送源码包,最后进行源码包的解压
include:
  - pkgs.make      #安装依赖包
nginx-install:
  file.managed:
    - name: /mnt/nginx-1.14.0.tar.gz     
    - source: salt://nginx/files/nginx-1.14.0.tar.gz    #推送安装包
  cmd.run:
    - name: cd /mnt && tar zxf nginx-1.14.0.tar.gz && cd nginx-1.14.0 && sed -i.bak 's/#define NGINX_VER          "nginx\/" NGINX_VERSION/#define NGINX_VER          "nginx"/g' src/core/nginx.h &&  sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g'  auto/cc/gcc && ./configure  --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null    #根据我们对nginx的安装,解压之后,修改 src/core/nginx.h 文件去掉版本号,auto/cc/gcc 注释,编译,make&&make install
    - creates: /usr/local/nginx    #创建/usr/local/nginx 目录

说明

pkgs.make 包的内容:
[root@server1 salt]# cd pkgs/
[root@server1 pkgs]# ls
make.sls
[root@server1 pkgs]# vim make.sls 
[root@server1 pkgs]# cat make.sls 
gcc-make:  
  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel

3.推送nginx脚本,在server3上安装nginx

server3上安装nginx成功

(三)salt自动重新加载nginx配置文件

1.编辑自动建立nginx用户的sls文件

[root@server1 salt]# cd /srv/salt/
[root@server1 salt]# mkdir users
[root@server1 users]# vim nginx.sls 
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.安装文件的脚本

[root@server1 nginx]# vim install.sls 
include:
  - pkgs.make

nginx-install:
  file.managed:
    - name: /mnt/nginx-1.14.0.tar.gz
    - source: salt://nginx/files/nginx-1.14.0.tar.gz
  cmd.run:
    - name: cd /mnt && tar zxf nginx-1.14.0.tar.gz && cd nginx-1.14.0 && sed -i.bak 's/#define NGINX_VER          "nginx\/" NGINX_VERSION/#define NGINX_VER          "nginx"/g' src/core/nginx.h &&  sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g'  auto/cc/gcc && ./configure  --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx

3.重启服务的脚本和建立用户脚本

[root@server1 nginx]# vim service.sls 
include:
  - users.nginx
  - nginx.install
/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
    - enable: True
    - reload: True
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

4.执行安装并开启建立用户,用于启动服务,在server3中检测,开启nginx服务

[root@server1 nginx]# salt server3 state.sls nginx.service

server3中开启nginx,查看nginx用户

(四).saltstack一键部署负载均衡集群

1.在server1上安装salt-minion,把server1结点加入minion

2.修改结点,salt-key -A 添加到server1上,salt-key  -L  显示添加的结点

3.建立haproxy目录

cd  /srv/salt
mkdir   haproxy
yum list haproxy  #确定haproxy没有安装
cd   haproxy
mkdir   files
cd   files   #存放haproxy安装包,这里用的是haproxy-1.6.11.tar.gz
cd ..
vim   install.sls   #编写安装脚本
haproxy-install:
  file.managed:
    - name: /mnt/haproxy-1.6.11.tar.gz
    - source: salt://haproxy/files/haproxy-1.6.11.tar.gz


salt server1 state.sls  haproxy.install
 

查看/mnt是否存在,存在则推送成功

cd /mnt    
ls
tar zxf haproxy-1.6.11.tar.gz
cd  haproxy-1.6.11
源码编译 
less   README  查看编译要加的参数

4.继续写install.sls文件

[root@server1 haproxy]# cat install.sls
include:
  - pkgs.make
  - users.haproxy
haproxy-install:
  file.managed:
    - name: /mnt/haproxy-1.6.11.tar.gz
    - source: salt://haproxy/files/haproxy-1.6.11.tar.gz
  cmd.run:
    - name: cd /mnt && tar zxf haproxy-1.6.11.tar.gz && cd haproxy-1.6.11 && make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy && make ARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy install
    - creates: /usr/local/haproxy

/etc/haproxy:     #修改文件权限
  file.directory:
    - mode: 755

/usr/sbin/haproxy: #软连接,自启动脚本
  file.symlink:
    - target: /usr/local/haproxy/sbin/haproxy

5.写安装脚本

[root@server1 haproxy]# cat  service.sls 
include:
  - haproxy.install
  - users.haproxy
/etc/haproxy/haproxy.cfg:
  file.managed:
    - source: salt://haproxy/files/haproxy.cfg

haproxy_service:
  file.managed:
    - name: /etc/init.d/haproxy
    - source: salt://haproxy/files/haproxy.init
    - mode: 755

  service.running:
    - name: haproxy
    - enable: True
    - reload: True
    - watch:
      - file: /etc/haproxy/haproxy.cfg
[root@server1 haproxy]# ll /usr/sbin/haproxy 
lrwxrwxrwx 1 root root 31 Nov  8 10:03 /usr/sbin/haproxy -> /usr/local/haproxy/sbin/haproxy

6.启动脚本,放到指定位置

[root@server1 haproxy]# cd /mnt/haproxy-1.6.11/examples/
[root@server1 examples]# cp haproxy.init    content-sw-sample.cfg   /srv/salt/haproxy/files/
[root@server1 examples]# cd /srv/salt/haproxy/files/
[root@server1 files]# mv content-sw-sample.cfg haproxy.cfg 
[root@server1 files]# ls
haproxy-1.6.11.tar.gz  haproxy.cfg  haproxy.init

修改haproxy的配置文件

vim/srv/salt/haproxy/files/haproxy.cfg
global
        maxconn         10000
        stats socket    /var/run/haproxy.stat mode 600 level admin
        log             127.0.0.1 local0
        uid             200
        gid             200
        chroot          /var/empty
        daemon
defaults
        mode            http
        log             global
        option          httplog
        option          dontlognull
        monitor-uri     /monitoruri
        maxconn         8000
        timeout client  30s
        retries         2
        option redispatch
        timeout connect 5s
        timeout server  30s
        timeout queue   30s
        stats uri       /admin/stats
# The public 'www' address in the DMZ
frontend public
        bind            *:80 name clear
        default_backend dynamic
backend dynamic
        balance         roundrobin
        fullconn        4000
        server          dynsrv1 172.25.254.2:80 check inter 1000
        server          dynsrv2 172.25.254.3:80 check inter 1000

7.创建haproxy用户

[root@server1 salt]# cd users/
[root@server1 users]# ls
haproxy.sls  nginx.sls
[root@server1 users]# cat haproxy.sls 
haproxy-group:
  group.present:
    - name: haproxy
    - gid: 200
haproxy:
  user.present:
    - uid: 200
    - gid: 200
    - home: /usr/local/haproxy
    - createhome: False
    - shell: /sbin/nologin

写完之后记着要在server1的install.sls加入- users.haproxy

8.推送

测试:

saltstack不仅可以用于一键部署服务,还可以远程监控主机

salt server3 grains.items   #查看server3的所有信息
[root@server1 ~]# salt server3 grains.item os   #查看系统信息  redhat
server3: 
    ----------
    os:
        RedHat
[root@server1 ~]# salt server3 grains.item ip   #查看ip
server3: 
    ----------
    ip:
[root@server1 ~]# salt server3 grains.item ipv4   #查看ipv4
server3:
    ----------
    ipv4:
        - 127.0.0.1
        - 172.25.254.3
[root@server1 ~]# salt server3 grains.item ipv6  #查看ipv6
server3:
    ----------
    ipv6:
        - ::1
        - fe80::5054:ff:fee5:12c6
[root@server1 ~]# salt -G 'os:redhat' cmd.run hostname
server1: 
    server1
server3:
    server3
server2:
    server2

(五)grains和pillar

saltstack的两个重要的数据系统组建grains和pillar,这两个组建都是用来做数据系统的,用来获取客户端基本信息数据或主控端数据。区别在于:

  1. grains是minion第一次启动时采集的静态数据,可以用在salt的模块和其他组件中。器是grains在每一次的minion启动,加载的时候会采集数据,向master汇报一次
  2. pillar是动态,只要在master端修改六一般会立即生效,不需要重启

(一)grains

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

重启服务:[root@server2 ~]# /etc/init.d/salt-minion restart

在master端:[root@server1 ~]# salt '*' grains.item roles 

2.设置grains的第二种方式

在sever3中
[root@server3 ~]# cd /etc/salt/
[root@server3 salt]# vim grains 
[root@server3 salt]# cat grains 
roles: nginx
在master中:
salt '*' grains.item roles    # 还没有出现server3的角色
salt server3 saltutil.sync_grains    # 刷新
salt '*' grains.item roles

3.方法三:设置grains

[root@server1 ~]# cd /srv/salt/
[root@server1 salt]# vim _grains/my_grains.py 
[root@server1 salt]# cat _grains/my_grains.py
#!/usr/bin/env pyrhon
def my_grains():
	grains = {}
	grains['hello'] = 'world'
	grains['salt'] = 'satck'
	return grains
[root@server1 _grains]# salt server3 saltutil.sync_grains  #在server1端将该py文件传送给server3
server3:
    - grains.my_grains

在server3中的缓存目录下可以看到该py文件

在server1中查看查看对应的键值

4.grains优先级

  1. /etc/salt/grains
  2. /etc/salt/minion
  3. /srv/salt/_grains/   master端_grains目录下

优先级顺序依次为minion端的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

/etc/init.d/salt-minion restart

2.刷新锁与节点的pillar

[root@server1 salt]# salt '*' saltutil.refresh_pillar
server2:
    True
server3:
    True
server1:
    True

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

[root@server1 salt]# cd ..
[root@server1 srv]# ls
salt
[root@server1 srv]# mkdir pillar
[root@server1 srv]# cd pillar/
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web/
[root@server1 web]# vim insatll.sls
[root@server1 web]# vim /srv/pillar/top.sls
[root@server1 web]# cat /srv/pillar/top.sls
base:
  '*':
    - web.install
[root@server1 web]# cat install.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

4.在master处查看所有minion的名称(信息)

(六).jinja模块

方法一:

1.在server1的httpd.install中编写jinja模版

 - template: jinja
    - context:
      bind: 172.25.1.2
      port: 8080             # 以键值对的形式存储bind和port

2.在server1的http配置文件中编辑要更新的端口或者接口

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文件中

pillar:
1.cd /srv/pillar/web

{% if grains['fqdn'] == 'server2' %}
webserver: httpd
bind: 172.25.254.2
port: 80
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章