saltstack管理集群
阿新 • • 發佈:2018-08-17
鍵值 列表 啟動 包管理 ping 發的 數據 語法 改密
saltstack
saltstack是基於Python開發的一套C/S架構配置管理工具
底層使用ZeroMQ消息隊列pub/sub方式通信
saltstack
兩個主要功能:配置管理與遠程執行
Saltstack基於C/S架構
服務端稱 master
客戶端稱 minion
Saltstack工作機制
Master和Minion都以守護進程的方式運行
Master監聽配置文件裏定義的ret_port(接收minion請求),和publish_port(發布消息)的端口
當Minion運行時,他會自動連接到配置文件裏定義的Master地址ret_port端口進行連接認證
本地yum
createrepo ./ //在提供yum源的文件目錄執行
安裝Master
一、服務端裝包salt-master
yum -y install salt-master
二、配置文件不需要修改任何
/etc/salt/master
vim /etc/hosts 域名解析
192.168.4.10 ms
192.168.4.20 web1
192.168.4.22 web2
192.168.4.25 db1
三、啟動服務:
systemctl start salt-master
systemctl enable salt-master
netstat -lantpu |grep ":4505|:4506"
一、客戶端裝包salt-minion
yum -y install salt-minion
二、修改配文件
vim /etc/salt/minion
master: sm 指定master域名
id: web1 指定自己的域名
vim /etc/hosts
192.168.4.10 ms
192.168.4.20 web1
192.168.4.22 web2
192.168.4.25 db1
三、起服務
systemctl start salt-minion
systemctl enable salt-minion
Master與Minion互信
Minion上線後先與Master端聯系,把自己的pubkey發過去
Master接收Minion的公鑰後,互信建立完成
秘鑰選項
salt-key -h
-L: 列出密鑰
-a: 接受某個密鑰
-A: 接受全部密鑰
-D: 刪除全部密鑰
-d: 刪除某個密鑰
接受所有密鑰,完成互信
salt-key -A -y
salt命令使用方法:
格式:salt [options] ‘<target>‘ <function> [arguments]
[options] //選項(修飾目標)
‘<target>‘ //目標(所有minion主機集合)
<function> //函數 (模塊.方法)
[arguments] //傳遞給對方的參數(修飾函數)
function一般采用python的 模塊.方法 樣式
Minion上運行,可以采用通配符 ‘*’
模塊
cp.get_file == scp
file.copy == cp
cmd.run ‘命令‘ //執行命令的模塊
test.ping ping命令
選項:
-L 列表
-E 正則
-N 匹配組
-S CIDR
-G 調用grains
-I 調用pillar
salt -L ‘web1‘ cmd.run ‘uptime‘
salt -E "web[0-9]" test.ping
分組
vim /etc/salt/master
nodegroups:
abc: ‘L@web1,web2‘ 可以寫多臺minion主機
other: ‘E@db[0-9] and N@abc‘ and是交集
#other: ‘E@db[0-9] or N@abc‘ or是並集
!!!! 前面必須是四個空格
salt -N abc test.ping
/srv/salt 是Master默認的根目錄
mkdir -p /srv/salt/oh
向abc組傳輸文件
salt -N abc cp.get_file salt://oh/ /tmp/co
模塊及功能
salt ‘minion域名‘ sys.list_modules 列出所有可用的模塊
salt ‘web1‘ sys.list_modules
salt ‘web2‘ sys.list_functions <模塊名> 查看模塊所有功能
salt ‘db1‘ sys.doc <模塊名> 查看模塊的用法
例:
salt -N abc file.cop /etc/selinux /tmp/selinux 拷貝任意文件和目錄
salt -N abc user.add zhangsna 2000 創建用戶
Grains(收集客戶端信息)
1、打標簽的模塊
2、命令用法
3、自帶收集客戶端信息
4、信息存在客戶端
5、是在現有的配置文件修改
YAML規則(Master和Minion的配置文件采用YAML語法)
項目使用"-"來表示
鍵值對使用":"來表示
YAML使用一個固定的縮進風格表示數據層級結構關系
一般每個縮進級別由兩個空格組成
註意不能用tab鍵
YAML的鍵值對采用冒號分隔
YAML的鍵值對對應python的字典
YAML表示形式
name: web
或
name:
web
字典可以嵌套
hosts:
name: web
列表項使用一個短橫杠加一個空格
- web
- dba
列表可以作為一個鍵值對的value(值)
pkg-http:
- httpd
- php
Grains是saltstack最重要的組件之一
可以獲取minion端的基本信息,這些信息一般都是靜態的,如CUP、內存、操作系統等
Grains存儲在minion本地
管理員可以在minion端進行grains值的修改,如增加、刪除等
salt ‘target‘ grains.items 查看grains提供的信息
salt ‘web1‘ grains.itmes
salt ‘target‘ grains.items [key] 查看grains指定的key信息
salt ‘*‘ saltutil.sync_grains 刷新所有配置
salt -G ‘os:RedHat‘ cmd.run ‘uptime‘ 匹配minion端os為RedHat的執行uptime命令
在minion上定義grains
vim /etc/salt/minion
grains:
role: nginx
重啟:systemctl restart salt-minion
或在minion上單獨定義grains
vim /etc/salt/minion.d/grains.conf 創建grains配置文件
grains:
role: nginx
重啟:systemctl restart salt-minion
在master上查看角色信息
salt ‘web1‘ saltutil.sync_grains 刷新所有配置
salt ‘web1‘ grains.item role
salt ‘web1‘ grains.item |grep -i nginx
Pillar組件
pillar也是saltstack最重要的組件之一
作用是定義與被控主機相關的任何數據,定義好的數據可以被其他組件使用
存儲在master端,存放需要提供給minion的信息
常用於敏感信息,每個minion只能訪問master分配給自己的pillar信息
用於經常動態變化的信息
pillar需要一個pillar_roots來維護pillar的配置
默認pillar_roots為/srv/pillar
pillar_roots在Master配置文件中定義
例:vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar
pillar執行時需要一個名為top.sls的入口文件
通過top.sls文件作為入口,組織其它的pillar文件
sls文件采用YAML格式
例:
cd /srv/pillar
vim top.sls
base: #與pillar_roots定義一致
‘L@web1,web2‘: #過濾目標
- appweb #用於包含appweb.sls
‘E@db\d‘: #過濾目標
- appdb #用於包含appdb.sls
- user #用於包含user.sls
vim appdb.sls
dbname: mysql
vim appweb.sls
appname: web
software:
- apache
- nginx
vim user.sls
users:
zhangsan: 1000
lisi: 1001
同步Pillar數據
salt ‘*‘ saltutil.refresh_pillar 刷新所有配置
salt ‘*‘ pillar.items 獲取pillar全部數據
salt ‘web‘ pillar.items 獲取pillar提供的信息
salt ‘web‘ pillar.items appweb 獲取pillar指定的key信息
salt -I ‘appename:web‘ test.ping 使用grains信息分類匹配主機
salt -I ‘appename:web‘ cmd.run ‘uptime‘ 匹配minion端appename為web的執行uptime命令
jinja模板
jinja是基於python的模板引擎
在saltstack中我們使用yaml_jinja渲染器來根據模板生產對應的配置文件
對於不同的操作系統或者不同的情況,通過Jinja可以讓配置文件或者操作形成一種模板的編寫方法
jinja使用步驟
在state文件中使用"- template: jinja"聲明
在模板文件中使用變量"{{name}}"聲明,name為變量,自己定義
在state文件中使用"- defautls: name: value"聲明
使用變量
變量的基本格式為:{{變量}}
一級字典變量格式為:{{pillar[‘appname‘]}}
二級字典變量格式為:{{pillar[‘flow‘][‘maxconn‘]}}
判斷語句
對grains的os值進行判斷,根據不同的系統對apache的值進行不同的設定,這樣apache就相當於是可以隨機應變的值
例:{% if grains[‘os‘] == ‘CentOS‘ %}
apache: httpd
{% elif grains[‘os‘] == ‘Debian‘ %}
apache: apache2
{% endif %}
循環語句
在state中使用pillar數據,值通過jinja來訪問pillar即可,多個值通過循環逐個獲取
{% for user, uid in pillar,get(‘users‘,{}).items() %}
{{user}}:
user.present:
- uid:{{uid}}
{% endfor %}
states基礎
states是satlstack中的配置語言
安裝軟件包、管理配置文件都需要編寫一些states sls文件
states sls使用YAML語法
salt ‘web1‘ sys.list_state_modules 查看所有States的模塊
salt ‘web1‘ sys.list_state_functions sysctl 查看該模塊功能
salt ‘web1‘ sys.state_doc sysctl.present 查看該模塊的用法
file模塊
file.managed: 文件同步模塊
file.append: 文件追加模塊
file.directory: 創建文件模塊
例1:
vim /etc/salt/master
file_roots:
base:
- /srv/base
dev:
- /srv/dev
prod:
- /srv/prod
cd /srv/
mkdir base dev prod
重啟服務:systemctl restart salt-master.service
cd base/
vim top.sls
base: #名稱和配置文件相對應
‘*‘: #minion域名*代表所有
- dns #和下面文件相對應
vim dns.sls
abc: #名稱
file.managed: 文件同步模塊
- name: /etc/resolv.conf 同步被參考文件的內容的路徑
- source: salt://files/dns.conf 被參考文件路徑
- user: root
- group: root
- mode: 644
- template: jinja
- defaules:
DNS: 192.168.4.100
mkdir /srv/base/files
cd /srv/base/files
touch dns.conf
cat dns.conf
nameserver {{ DNS }}
檢測:
salt ‘*‘ state.highstate saltenv=base test=true
執行:
salt ‘*‘ state.highstate saltenv=base test=false
例2:
cd /srv/base/
vim top.sls
base: #名稱和配置文件相對應
‘L@web1,wen2‘: #minion域名列表
- tex #和下面文件相對應
vim tex.sls
abc: #名稱
file.append: #文件追加模塊
- name: /etc/resolv.conf #追加到的文件路徑
- text:
- DNS1:9.9.9.9 #(比上一級多兩個空格),追加的內容
檢測:
salt ‘*‘ state.highstate saltenv=base test=true
執行:
salt ‘*‘ state.highstate saltenv=base test=false
例3:
cd /srv/base/
vim top.sls
base: #名稱和配置文件相對應
‘*‘: #minion域名*代表所有
- set #和下面文件相對應
vim ste.sls
directory: #名稱
file.directory: 創建文件模塊
- name: /opt/rpm_pkgs 創建的文件名
- user: root
- group: root
- dri_mode: 755 文件目錄的權限
- file_mode: 644 文件的權限
檢測:
salt ‘*‘ state.highstate saltenv=base test=true
執行:
salt ‘*‘ state.highstate saltenv=base test=false
cmd模塊
cmd模塊強制給minion執行命令
可以限制當某個條件滿足時才執行命令
也可以限制當某個條件不滿足時才執行命令
cmd.run: 命令模塊
unless: 當unless條件不滿足時,需要執行令
onlyif: 當onlyid條件滿足時,需要執行令
例:
cd /srv/base/
vim top.sls
base: #名稱和配置文件相對應
‘*‘: #minion域名*代表所有
- est #和下面文件相對應
vim est.sls
useradd zhangsan: #創建用戶
cmd.run:
- unless: idd zhangsan #判斷用戶不存在
echo 123456 |passwd --stdin zhangsan: #給用戶改密碼
cmd.run:
- onlyif: id zhangsan #判斷用戶存在
檢測:
salt ‘*‘ state.highstate saltenv=base test=true
執行:
salt ‘*‘ state.highstate saltenv=base test=false
系統初始化
可以在base環境下創建一個init目錄,將系統初始化配置的sls文件均存放在init目錄下,稱其為“初始化模塊”
1.配置DNS
vim /srv/salt/base/init/dns.sls
resolv_file:
file.managed:
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: 644
2.配置History記錄時間
vim /srv/salt/base/init/history.sls
profile_file: #名稱
file.append: #追加模塊
- name: /etc/profile #追加的文件路徑
- text:
- export HISTTIMEFORMAT="%F %T" #追加的內容
3.配置內核參數優化
saltstack提供了sysctl狀態模塊用來進行內核參數的配置
vim /srv/salt/base/init/sysctl.sls
net.ipv4.ip_forward: #為值1開啟路由
sysctl.present:
- value: 1 #值
4.創建用戶
vim /srv/salt/base/init/user.sls
usreadd bob:
cmd.run:
- unless: id bob
echo 123456 |passwd --stdin bob:
cmd.run:
- onlyif: id bob
pkg模塊
pkg模塊可以實現軟件包管理
管理的軟件包包括紅帽RPM包和Ubuntu的deb包等
主要方法有:
pkg.installed: 安裝軟件包
pkg.latest: 保持軟件包最新版本
pkg.remove: 卸載軟件包
pkg.purge: 下載軟件包,刪除配置文件
require條件:只有滿足條件才執行令
service模塊
軟件部署完畢後,需要確保服務處於運行狀態,並且能夠實現開機自啟。
service.running: 確保服務處於運行狀態
service.enabled: 開機自啟
service.disabled: 開機不自啟
service.dead: 確保服務處於未運行狀態
watch:服務如果能夠正常啟動,需要確保存在配置文件,設置如果配置文件存在,才啟動服務。
例:在minion上域名為web1,web2的主機上安裝httpd軟件包,並修改偵聽端口為8080.
cd /srv/salt/prod
mkdir files
vim top.sls
prod: #名稱和配置文件相對應
‘L@web1,web2‘ #minion域名
- install #和下面文件相對應
- etc #和下面文件相對應
- service #和下面文件相對應
vim install.sls
insta: #名稱
pkg.installed: #安裝軟件包模塊
- name: httpd #軟件包名
vim etc.sls
etchttp: #名稱
file.managed: #同步模塊
- name: /etc/httpd/conf/httpd.conf #同步被參考文件的內容的路徑
- source: salt://files/httpd.conf #被參考文件路徑
- template: jinja #使用jinja模塊
- defaults:
PORT: 8080
- require: #require條件
- pkg: insta #pkg模塊定義的函數名稱
cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/
vim /srv/salt/prod/files/httpd.conf
............
Listen {{ PORT }} #使用jinja變量
..........
vim service.sls
servi: #名稱
service.running: #運行模塊
- name: httpd #運行的服務名
- enable: true
- restart: true
- watch: #watch條件
- file: etchttp #file模塊定義的函數名稱
檢測:
salt ‘*‘ state.highstate saltenv=prod test=true
執行:
salt ‘*‘ state.highstate saltenv=prod
saltstack管理集群