一.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}
- 下載slatstacke軟件包到真機/var/www/html
- 在各個虛擬機上配置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,這兩個組建都是用來做數據系統的,用來獲取客戶端基本信息數據或主控端數據。區別在於:
- grains是minion第一次啓動時採集的靜態數據,可以用在salt的模塊和其他組件中。器是grains在每一次的minion啓動,加載的時候會採集數據,向master彙報一次
- 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優先級
- /etc/salt/grains
- /etc/salt/minion
- /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 }}