自動化運維之saltstack(2)
這次主要介紹saltstack的配置管理,這一部分在企業應用中比較重要,也經常用到。
states是saltstack系統中的配置語言,在日常運維中需要編寫大量的states檔案,例如:建立使用者、安裝軟體、配置軟體、服務執行等。需要編寫一些"states sls"檔案。該檔案主要使用YAML語言,也可以支援使用python語言編寫。
配置管理中常用模組
pkg模組
列出所有狀態模組
salt '' sys.list_modules
檢視狀態模組中的函式:如pkg模組
[[email protected] _grains]# salt '' sys.list_state_functions pkg
salt-minion01:
- pkg.downloaded
- pkg.group_installed
- pkg.installed
- pkg.latest
- pkg.mod_aggregate
- pkg.mod_init
- pkg.mod_watch
- pkg.patch_downloaded
- pkg.patch_installed
- pkg.purged
- pkg.removed
- pkg.uptodate
salt-minion02: - pkg.downloaded
- pkg.group_installed
- pkg.installed
- pkg.latest
- pkg.mod_aggregate
- pkg.mod_init
- pkg.mod_watch
- pkg.patch_downloaded
- pkg.patch_installed
- pkg.purged
- pkg.removed
-
pkg.uptodate
file模組
[email protected] app]# mkdir files
[[email protected] app]# cp /etc/resolv.conf files/
[[email protected] app]# cat dns.sls
dns-config:
file.managed: - name: /etc/resolv.conf #file of
- source: salt://app/files/resolv.conf salt代表file根目錄
- user: root
- group: root
- mode: 644
- backup: minion ------備份到minion端
修改/srv/salt/app/files下的resolv.conf檔案
[[email protected] files]# cat resolv.conf
- backup: minion ------備份到minion端
nameserver 101.206.4.6
nameserver 114.114.114.114
###########saltstack configure ----------》新增一行註釋
salt 'salt-minion01' state.sls app.dns test=True 測試
salt 'salt-minion01' state.sls app.dns
檢視
[[email protected] salt]# cat /etc/resolv.conf
nameserver 101.206.4.6
nameserver 114.114.114.114
###########saltstack configure
file.directory ------建立目錄
[[email protected] app]# cat dir.sls
mkdir_tmp_dns:
file.directory:
- name: /tmp/dns
- user: root
- group: root
- mode: 755
- makedirs: True
目錄下發 file.recurse
[[email protected] app]# cat xf.sls
httpd-config:
file.recurse:
- name: /etc/httpd/conf.d/
- source: salt://app/files/httpd_conf.d
- file_mode: 644
- dir_mode: 755
- include_empty: True
-
clean: True #####遠端強制刪除
mkdir files/httpd_conf.d
[[email protected] app]# cat files/httpd_conf.d/www.conf
server {www
}
[[email protected] app]# cat files/httpd_conf.d/blog.conf
erver {
blog
}
[[email protected] app]# salt 'salt-minion01' state.sls app.xf
minion01
[[email protected] tmp]# ls /etc/httpd/conf.d/
autoindex.conf fcgid.conf README userdir.conf www.conf
blog.conf manual.conf ssl.conf welcome.conf
可以直接採用以下方法:
[[email protected] app]# cat ln.sls
Link:
cmd.run:
- name: ln -s /tmp /mnt
service模組
httpd_service:
service.running:
- name: httpd
- enable: True
- reload: True #######允許過載,不寫表示restart
-
watch: #####監控誰
-pkg.httpd-filecron模組
[[email protected] app]# cat cron.sls
crontab_scripts:
cron.present: - name: /usr/bin/uptime >/dev/null 2>&1
- user: root
-
minute: '/5'
salt 'salt-minion01' state.sls app.cron
結果:
[[email protected] tmp]# crontab -l
/30 /usr/sbin/ntpdate time.windows.com
/5 * /usr/bin/uptime >/dev/null 2>&1高階狀態模組,高階狀態檔案需要在base環境下編寫
base:
'*': 匹配所有minion -
app.httpd #base模組下httpd目錄下的安裝sls檔案
#webserver: #定義的分組名稱進行匹配,需要定義nodegroups'os:centos': #通過grains模組匹配
- match: grains
- app.cron
top.sls需要寫在/srv/salt下
執行是salt '*' state.highstate
LAMP架構部署
此案例在prod生產環境下部署
修改master端配置檔案
file_roots:
base:
- /srv/salt/base
prod: - /srv/salt/prod
systemctl restart salt-master
mkdir /srv/salt/{base,prod} -p
把之前的基礎環境下寫的放在base下
1 先手動安裝lamp環境
yum install httpd mariadb mariadb-server php php-mysql php-gd gd -y
[[email protected] init]# pwd
/srv/salt/prod/init
mkdir files -------相關配置寫在該目錄下
2 準備相應目錄與對應配置檔案
cp /etc/httpd/conf/httpd.conf files/
cp /etc/my.cnf files/
cp /etc/php.ini files/
在init目錄下寫lamp安裝,配置 啟動
3 部署狀態檔案lamp.sls
[[email protected] init]# cat lamp.sls
#yum install httpd mariadb-server php php-mysql php-gd gd -y
httpd-install:
pkg.installed:
- names:
- httpd
- httpd-tools
httpd-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
httpd-service:
service.running: - name: httpd
- enable: True
- reload: True
php-install:
pkg.installed: - names:
- php
- php-mysql
- php-gd
- gd
php-config:
file.managed:
- name: /etc/php.ini
- source: salt://init/files/php.ini
- user: root
- group: root
- mode: 644
- backup: minion
mysql-install:
pkg.installed: - names:
- mariadb
- mariadb-server
mysql-config:
file.managed:
- name: /etc/my.cnf
- source: salt://init/files/my.cnf
- user: root
- group: root
- mode: 644
- backup: minion
mysql-service:
service.running: - name: mariadb
- enable: True
salt 'salt-minion01' state.sls init.lamp saltenv=prod 指定為prod環境,因為預設為base環境
通過高階狀態進行管理
通過高階狀態來管理更方便,需要在base下寫top.sls
[[email protected] base]# cat top.sls
prod:
'salt-minion01':
- init.lamp
然後執行salt 'salt-minion01' state.highstate
檢視目錄結構
[[email protected] base]# tree /srv/salt/
/srv/salt/
├── base
│ ├── app
│ │ ├── cron.sls
│ │ ├── dir.sls
│ │ ├── dns.sls
│ │ ├── files
│ │ │ ├── httpd_conf.d
│ │ │ │ ├── blog.conf
│ │ │ │ └── www.conf
│ │ │ └── resolv.conf
│ │ ├── httpd.sls
│ │ ├── ln.sls
│ │ ├── service.sls
│ │ ├── vsftpd.sls
│ │ └── xf.sls
│ ├── _grains
│ │ └── my_grains.py
│ ├── top.sls
│ └── top.sls20181121
└── prod
└── init
├── files
│ ├── httpd.conf
│ ├── my.cnf
│ └── php.ini
└── lamp.sls
states狀態依賴管理
可以用state模組來定義minion的狀態,但是如果一個主機涉及多個狀態,並且狀態之間有相互關聯,需要在執行順序上有先後之分,那麼必須引入requisites 來進行控制。
- require 我依賴某個狀態,我依賴誰
- require_in 我被某個狀態依賴,誰依賴我
- watch 我監控某個狀態,如當狀態發生變化時,就進行restart或reload操作
- watch_in 我被某個狀態關注
- include 我引用誰
require寫法
httpd-install:
pkg.installed:- names:
- httpd
- httpd-tools
httpd-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
- pkg: httpd-install 因為要修改配置需要先安裝軟體
- names:
watch寫法
httpd-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- file: httpd-config
- watch:
- file: httpd-config
watch_in寫法
php-config:
file.managed:
- file: httpd-config
- name: /etc/php.ini
- source: salt://init/files/php.ini
- user: root
- group: root
- mode: 644
- backup: minion
- watch_in:
- service: httpd-service
利用include將lamp拆分,如將mysql拆分出來
- service: httpd-service
[[email protected] init]# cat mysql.sls
mysql-install:
pkg.installed:
- names:
- mariadb
- mariadb-server
mysql-config:
file.managed:
- name: /etc/my.cnf
- source: salt://init/files/my.cnf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
- pkg: mysql-install
mysql-service:
service.running:
- pkg: mysql-install
- name: mariadb
- enable: True
- require:
- file: mysql-config
[[email protected] init]# mv lamp.sls apache.sls
在prod目錄建立lamp.sls
[[email protected] prod]# cat lamp.sls
include:
- init.apache
- init.mysql
執行salt 'salt-minion01' state.sls lamp saltenv=prod
通過高階狀態管理:修改topfile檔案如下:
prod:
'salt-minion01':- lamp
Jinja模板使用
配置檔案一般都是固定無法靈活多變,實際生產過程中,需要配置檔案靈活多變,不能寫死,有時還需要進行流程控制,這就需要用到jinjia,可以很靈活地進行配置管理及簡化配置過程。
Jinja2模板包含變數和表示式
變數用{{...}}包圍,表示式用{%...%}包圍
看一個簡單的例子
[[email protected] prod]# cat var.sls
{% set var= 'hello world!' %}
test_var:
cmd.run:
- name: echo "{{ var }}"
字串型別
{% set var= 'hello world!' %}
列表型別
{% set list = ['one','two' ] %}
{{ list[1]}}
字典型別
{% set dict = {'first':'value','second':'value1'} %}
{{ dict['first'] }}
Jinja模板使用步驟
- 告訴file狀態模組,需要使用jinja
- template: jinja
2列出引數列表 - defaults:
PORT: 88
3.配置檔案引用jinja模板
{{ PORT }}
配置例項,修改apache埠
httpd-config:
file.managed: - name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
- pkg: httpd-install
- template: jinja
- defaults:
PORT: 8000
files目錄下http配置檔案中將Listen 80改為Listen {{ PORT }}
然後執行salt 'salt-minion01' state.highstate
檢視minion端埠已改動
[[email protected] ~]# netstat -tnlp|grep 8000
tcp6 0 0 :::8000 :::* LISTEN 3915/httpd
- template: jinja
模板支援grains pillar進行賦值
grains方式
通過grains獲取minion端IP
[[email protected] prod]# salt 'salt-minion01' grains.item fqdn_ip4
salt-minion01:
fqdn_ip4:
- 192.168.132.31
如果想在http配置檔案中使用IP:PORT
Listen {{ IPADDR}}:{{ PORT }}
apache檔案中修改
-
defaults:
PORT: 8000
IPADDR: {{ grains['fqdn_ip4'][0]}} ---取列表中的第一個值即IP地址pillar方式:
apache:
IP: {{ grains['fqdn_ip4'][0] }}
PORT: 8008
引用
{{ pillar['apache'][IP] }}
{{ pillar['apache'][port] }}
實際場景中,如系統有centos和ubuntu,都要安裝apache,由於安裝的包不一樣,則可以根據grains靜態資料,使用jinja2流程控制
httpd_install:
pkg.installed:
-
template: jinja
{% if grains['os_family'] == 'Debian' %}- name: apache2
{% elif grains['os_family'] == 'RedHat' %} - name: http
{% endif %}saltstack Job管理
Job概述
salt每次執行任務都會將任務釋出到pub-sub匯流排,minion會對任務作出響應,為區分不同的任務,saltmaster每次釋出一個任務都會為該任務建立一個jobid。
master預設情況下會快取24小時內的所有job的詳細操作
master快取目錄:/var/cache/salt/master/jobs/
minion端每次執行任務都會快取在/var/cache/salt/minion/proc/目錄下,任務執行完成後檔案會被刪除。
在master端執行一個長時間的任務
salt 'salt-minion01' cmd.run "sleep 100"
在minion01上用strings檢視檔案內容
[[email protected] proc]# strings 20181125111411231106
tgt_type
glob
20181125111411231106
salt-minion01
user
root
sleep 100
cmd.run
Job管理
通過salt-run 命令來管理job也可以通過salt util模組
在master中執行一個長時間的命令
salt 'salt-minion01' cmd.run "sleep 1000;echo hello"
然後ctrl+c結束,獲取jobid後登陸檢視
salt 'salt-minion01' saltutil.find_job-id
salt 'salt-minion01' saltutil.kill_job jobid 停掉任務
檢視master上cache的所有job
salt 'salt-minion' saltutil.runner jobs.list_jobs - name: apache2