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 }}

 

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