Saltstack概述html
Salt一種全新的基礎設施管理方式,部署輕鬆,在幾分鐘內可運行起來,擴展性好,很容易管理上萬臺服務器,速度夠快,服務器之間秒級通信。node
salt底層採用動態的鏈接總線, 使其能夠用於編配, 遠程執行, 配置管理等等.python
參考中文文檔:http://docs.saltstack.cn/zh_CN/latest/topics/tutorials/starting_states.htmlmysql
參考英文文檔:https://docs.saltstack.com/en/latest/linux
Saltstack運行模式:nginx
Saltstack三大功能:web
Saltstack部署環境準備:正則表達式
一、主機名要固定統一sql
[root@linux-node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.7 linux-node1.example.com linux-node1 10.0.0.8 linux-node2.example.com linux-node2 [root@linux-node1 ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=linux-node1.example.com
並且可以ping通數據庫
要想實現自動化運維,首先要知足PPT原則(流程、人員、工具技術)
Saltstack準備環境
兩臺Centos6.6,10.0.0.7作master,10.0.0.8作minion
一、安裝epel和salt組件
# 安裝epel源 [root@linux-node1 ~]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm # 服務端安裝master [root@linux-node1 ~]# yum -y install salt-master # 爲了作實驗,在服務端也安裝下客戶端 [root@linux-node1 ~]# yum -y install salt-minion # 客戶端安裝minion [root@linux-node2 ~]# yum -y install salt-minion # 設置開機啓動 [root@linux-node1 ~]# chkconfig salt-master on [root@linux-node1 ~]# chkconfig salt-minion on
設置完成後,能夠先講master啓動。而後修改配置文件,須要告訴minion端master是誰。
二、啓動master服務
[root@linux-node1 ~]# /etc/init.d/salt-master start Starting salt-master daemon: [肯定]
三、修改兩臺客戶端的配置文件
[root@linux-node1 ~]# egrep "master: 10.0.0.7|#id" /etc/salt/minion master: 10.0.0.7 #id:
master:master的IP地址
id:默認經過python的方法socket.getfqdn()去獲取fqdn名。因此要求設置好主機名並能解析。也可使用IP地址,看業務需求。
四、啓動minion客戶端。
[root@linux-node1 ~]# /etc/init.d/salt-minion start Starting salt-minion daemon: [肯定] [root@linux-node2 ~]# /etc/init.d/salt-minion start Starting salt-minion daemon: [肯定]
五、minion端的認證
# minion啓動的時候會建立KEY [root@linux-node1 /]# ll /etc/salt/pki/minion/ 總用量 8 -r-------- 1 root root 1679 12月 28 23:04 minion.pem -rw-r--r-- 1 root root 451 12月 28 23:04 minion.pub # master啓動的時候會建立KEY [root@linux-node1 /]# ll /etc/salt/pki/master/ 總用量 28 -r-------- 1 root root 1679 12月 28 22:54 master.pem -rw-r--r-- 1 root root 451 12月 28 22:54 master.pub # 等待贊成的Key [root@linux-node1 /]# ll /etc/salt/pki/master/minions_pre/ 總用量 8 -rw-r--r-- 1 root root 451 12月 28 23:04 linux-node1.example.com -rw-r--r-- 1 root root 451 12月 28 23:03 linux-node2.example.com # 查看須要贊成的Key [root@linux-node1 /]# salt-key Accepted Keys: Denied Keys: Unaccepted Keys: linux-node1.example.com linux-node2.example.com Rejected Keys: # 執行贊成操做 -A 所有贊成 [root@linux-node1 /]# salt-key -A The following keys are going to be accepted: Unaccepted Keys: linux-node1.example.com linux-node2.example.com Proceed? [n/Y] y Key for minion linux-node1.example.com accepted. Key for minion linux-node2.example.com accepted. # -a 匹配的贊成,可使用*通配符 [root@linux-node1 /]# salt-key -a linux*
# 經過認證的主機位置會發生改變,本來在minion_pre下面
[root@linux-node1 /]# tree /etc/salt/pki/master/
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions
│ ├── linux-node1.example.com
│ └── linux-node2.example.com
├── minions_autosign
├── minions_denied
├── minions_pre
└── minions_rejected
其實上面的master下面的minion中的兩個主機名命名的文件是minion端的公鑰(你要是不信本身打開see),同時在master認證經過的時候,master也偷偷的把他的公鑰放到了minion端一份。用事實說話,在minion端上查看。
[root@linux-node2 ~]# ll /etc/salt/pki/minion/ 總用量 12 -rw-r--r-- 1 root root 451 12月 28 23:11 minion_master.pub -r-------- 1 root root 1675 12月 28 23:03 minion.pem -rw-r--r-- 1 root root 451 12月 28 23:03 minion.pub
6:salt-key命令
[root@linux-node1 /]# salt-key --help Actions: -l ARG, --list=ARG List the public keys. The args "pre", "un", and "unaccepted" will list unaccepted/unsigned keys. "acc" or "accepted" will list accepted/signed keys. "rej" or "rejected" will list rejected keys. "den" or "denied" will list denied keys. Finally, "all" will list all keys. -L, --list-all List all public keys. (Deprecated: use "--list all") -a ACCEPT, --accept=ACCEPT Accept the specified public key (use --include-all to match rejected keys in addition to pending keys). Globs are supported. -A, --accept-all Accept all pending keys -r REJECT, --reject=REJECT Reject the specified public key (use --include-all to match accepted keys in addition to pending keys). Globs are supported. -R, --reject-all Reject all pending keys --include-all Include non-pending keys when accepting/rejecting -p PRINT, --print=PRINT Print the specified public key -P, --print-all Print all public keys -d DELETE, --delete=DELETE Delete the specified key. Globs are supported. -D, --delete-all Delete all keys
Saltstack遠程執行
salt命令 ‘client’ 模塊.方法 ‘參數’
[root@linux-node1 /]# salt '*' test.ping linux-node1.example.com: True linux-node2.example.com: True [root@linux-node1 /]# salt '*' cmd.run 'w' linux-node2.example.com: 23:32:17 up 51 min, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 22:41 7:39 0.06s 0.06s -bash linux-node1.example.com: 23:32:17 up 53 min, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 22:40 0.00s 0.85s 0.67s /usr/bin/python root pts/1 10.0.0.1 22:56 35:04 0.00s 0.00s -bash
Saltstack配置管理
一、修改master的配置文件
# 開啓base環境 [root@linux-node1 /]# vim /etc/salt/master 416:file_roots: 417: base: 418: - /srv/salt # 建立目錄 [root@linux-node1 /]# mkdir /srv/salt # 只要改動配置文件就要重啓 [root@linux-node1 /]# /etc/init.d/salt-master restart Stopping salt-master daemon: [肯定] Starting salt-master daemon: [肯定]
2:寫一個apache的安裝sls
[root@linux-node1 salt]# cd /srv/salt/ [root@linux-node1 salt]# cat /srv/salt/apache.sls apache-install: pkg.installed: - names: - httpd - httpd-devel apache-service: service.running: - name: httpd - enable: True - reload: True # 在全部minion端,執行state模塊下的sls方法,運行apache這個狀態 [root@linux-node1 salt]# salt '*' state.sls apache
# 檢查是否安裝成功
[root@linux-node1 salt]# lsof -i:80
apache-install: #ID聲明,聲明是幹什麼用的
pkg.installed: #PKG是一個軟件包狀態模塊,installed是其中的方法
- names: #代表要裝的包的名字,由於是裝多個包
- httpd
- httpd-devel
[root@linux-node1 master]# salt '*' state.sls apache
#使用salt對全部的機器使用state這個模塊下的sls方法來執行apache這個狀態模塊
#若是使用的分目錄的方式,執行的方法是:salt '*' state.sls init.apache
三、使用高級狀態
要有一個入口文件默認是top.sls,不建議修改,且必須放在base環境目錄下。
# top文件,入口文件 [root@linux-node1 salt]# cat /srv/salt/top.sls base: '*.example.com': - apache # 使用高級狀態執行 [root@linux-node1 salt]# salt '*' state.highstate
Saltstack數據系統
Grains and Pillar
Grains裏面收集了minion啓動時候的全部系統信息,存儲在minion端。靜態數據,只有重啓的時候才從新收集。
在minion設置
應用場景:
一、信息查詢
# 查看grains的key [root@linux-node1 salt]# salt 'linux-node1*' grains.ls # 查看grains的全部信息 [root@linux-node1 salt]# salt 'linux-node1*' grains.items # 查詢某個的信息 [root@linux-node1 salt]# salt 'linux-node1*' grains.get fqdn linux-node1.example.com: linux-node1.example.com [root@linux-node1 salt]# salt 'linux-node1*' grains.get os linux-node1.example.com: CentOS
二、主機匹配
# 使用granis來匹配主機 -G 參數, [root@linux-node1 salt]# salt -G os:CentOS cmd.run 'uptime' linux-node2.example.com: 00:28:03 up 1:46, 1 user, load average: 0.00, 0.00, 0.00 linux-node1.example.com: 00:28:03 up 1:48, 2 users, load average: 0.00, 0.00, 0.00 # 編輯minion配置文件,自定義設置角色,我添加一個cgt [root@linux-node1 ~]# vim /etc/salt/minion 82 grains: 83 roles: 84 - webserver 85 - memcache 86 - cgt # 修改配置文件須要重啓服務 [root@linux-node1 ~]# /etc/init.d/salt-minion restart Stopping salt-minion daemon: [肯定] Starting salt-minion daemon: [肯定] # 對角色有cgt的機器進行操做 [root@linux-node1 salt]# salt -G roles:cgt cmd.run 'uptime' linux-node1.example.com: 00:32:41 up 1:53, 2 users, load average: 0.06, 0.02, 0.00
若是你以爲寫在配置文件中不方便,能夠寫在他的一個默認文件中
[root@linux-node1 ~]# vim /etc/salt/grains web:nginx
三、在top.sls中匹配使用
[root@linux-node1 salt]# cat /srv/salt/top.sls base: 'os:CentOS': - match: grain - apache [root@linux-node1 salt]# salt '*' state.highstate
Pillar:給minion指定它想要的數據。
在master端設置的
一、修改配置文件
# 在服務端開啓pillar [root@linux-node1 ~]# vim /etc/salt/master 529 pillar_roots: 530 base: 531 - /srv/pillar 552 pillar_opts: False [root@linux-node1 ~]# mkdir /srv/pillar [root@linux-node1 ~]# /etc/init.d/salt-master restart Stopping salt-master daemon: [肯定] Starting salt-master daemon: [肯定]
二、編寫pillar中的文件
# 編寫一個apache.sls 這是pillar中的,與前面的salt下的文件沒有任何的關係 [root@linux-node1 ~]# cat /srv/pillar/apache.sls {%if grains['os'] == 'CentOS' %} apache: httpd {% elif grains['os'] == 'Debian' %} apache: apache2 {% endif %} # 告訴pillar下面哪些主機能夠來使用apache.sls文件,這是全部主機* [root@linux-node1 ~]# cat /srv/pillar/top.sls base: '*': - apache
三、執行pillar
由於都是centos是系統,因此獲取的都是httpd
[root@linux-node1 ~]# salt '*' pillar.items linux-node2.example.com: ---------- apache: httpd linux-node1.example.com: ---------- apache: httpd
四、用來定位主機
# 對apache:httpd的minion執行命令 [root@linux-node1 ~]# salt -I 'apache:httpd' test.ping No minions matched the target. No command was sent, no jid was assigned. ERROR: No return received # 刷新pillar,grains是須要重啓minion端,pillar是須要刷新 [root@linux-node1 ~]# salt '*' saltutil.refresh_pillar linux-node2.example.com: True linux-node1.example.com: True [root@linux-node1 ~]# salt -I 'apache:httpd' test.ping linux-node2.example.com: True linux-node1.example.com: True
Grains和Pillar的區別
遠程執行
Targeting目標
一、Globbing and regex
匹配minions 經過通配符和正則表達式,與minion ID有關係。
二、Grains
用來匹配minion的grains,是指那些關於minion主機的靜態信息,好比OS,軟件版本,虛擬化,CPU,內存等等。
三、Pillar
經過用戶定義的變量匹配minion主機
四、Subnet/IP Address
經過子網或IP地址匹配minion主機(當前僅支持IPV4)。
五、Compound matching
把上面的所有匹配器組合爲一個表達式。
六、Node groups
在master配置文件中靜態定義minion組,使用:ref:複合 <targeting-compound> 匹配語法。
七、Batching execution
一些命令集在匹配上的minions時只須要執行一次。
Modules模塊
Salt 模塊是遠程執行的基礎。它提供了一系列的功能,好比安裝包,重啓一個服務,運行名稱命令,傳輸文件等等。
用戶權限的限制
# 設置用戶名:larry,和能夠執行的命令 [root@linux-node1 ~]# vim /etc/salt/master 245 client_acl: 246 larry: 247 - test.ping 248 - network.* # 更改權限 [root@linux-node1 sudoers.d]# chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master # 重啓服務 [root@linux-node1 sudoers.d]# /etc/init.d/salt-master restart # 切換到larry用戶執行 [larry@linux-node1 ~]$ salt '*' test.ping linux-node2.example.com: True linux-node1.example.com: True [larry@linux-node1 ~]$ salt '*' cmd.run 'uptime' Failed to authenticate!
Returners
Salt返回接收器(returner)容許把minion的響應保存在各類數據存儲或不一樣的位置,甚至把響應內容顯示在命令行。Returner能夠用來擴展Salt,和新的、定製的接口和支持新的數據庫進行通訊。
以mysql的返回爲例
# 安裝數據庫 [root@linux-node1 ~]# yum -y install mysql-server # 安裝依賴包 [root@linux-node1 ~]# yum -y install python-mysqldb # 啓動數據庫 [root@linux-node1 ~]# /etc/init.d/mysqld start
# 客戶端安裝MySQL-python
[root@linux-node1 ~]# yum -y install MySQL-python
建立相應的表
CREATE DATABASE `salt` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; USE `salt`; DROP TABLE IF EXISTS `jids`; CREATE TABLE `jids` ( `jid` varchar(255) NOT NULL, `load` mediumtext NOT NULL, UNIQUE KEY `jid` (`jid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `salt_returns`; CREATE TABLE `salt_returns` ( `fun` varchar(50) NOT NULL, `jid` varchar(255) NOT NULL, `return` mediumtext NOT NULL, `id` varchar(255) NOT NULL, `success` varchar(10) NOT NULL, `full_ret` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY `id` (`id`), KEY `jid` (`jid`), KEY `fun` (`fun`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `salt_events`; CREATE TABLE `salt_events` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `tag` varchar(255) NOT NULL, `data` varchar(1024) NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `tag` (`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
grant all on salt.* to salt@'10.0.0.0/255.255.255.0' identified by 'salt';
修改配置文件
此種方式是主動去Minion端獲取,推薦使用。
若是不加job_cache,開啓上面的return,就是被動接收。須要客戶端也要修改配置文件,添加一樣的內容。
[root@linux-node1 ~]# vim /etc/salt/master #return: mysql master_job_cache: mysql mysql.host: '10.0.0.7' mysql.user: 'salt' mysql.pass: 'salt' mysql.db: 'salt' mysql.port: 3306
檢查是否生效
[root@linux-node1 ~]# /etc/init.d/salt-master restart [root@linux-node1 ~]# salt '*' saltutil.refresh_pillar linux-node1.example.com: True linux-node2.example.com: True [root@linux-node1 ~]# salt '*' test.ping linux-node2.example.com: True linux-node1.example.com: True # 數據庫中檢查有麼有獲取到數據(主動去minion端獲取) mysql> use salt; mysql> select * from salt_returns;
配置管理
配置管理是經過遠程管理來實現的。
環境配置
# 開啓分別的file_roots [root@linux-node1 ~]# vim /etc/salt/master file_roots: base: - /srv/salt/base test: - /srv/salt/test prod: - /srv/salt/prod # 從新啓動master [root@linux-node1 ~]# /etc/init.d/salt-master restart Stopping salt-master daemon: [肯定] Starting salt-master daemon: [肯定] # 建立路徑 [root@linux-node1 ~]# mkdir /srv/salt/base [root@linux-node1 ~]# mkdir /srv/salt/test [root@linux-node1 ~]# mkdir /srv/salt/prod [root@linux-node1 salt]# ll /srv/salt/base/ 總用量 8 -rw-r--r-- 1 root root 171 12月 28 23:56 apache.sls -rw-r--r-- 1 root root 53 12月 29 00:49 top.sls [root@linux-node1 salt]# tree . ├── base │ ├── apache.sls │ └── top.sls ├── prod └── test
[root@linux-node1 ~]# mkdir /srv/salt/base/files
編寫配置文件
[root@linux-node1 base]# vim dns.sls /etc/resolv.conf: file.managed: - source: salt://files/resolv.conf - user: root - group: root - mode: 644 [root@linux-node1 base]# cp /etc/resolv.conf /srv/salt/base/files/ [root@linux-node1 base]# cd /srv/salt/base/files/ # 作點修改,最下面加點# [root@linux-node1 files]# vim resolv.conf # Generated by NetworkManager nameserver 10.0.0.2 #########
執行狀態
# 執行方式一 # 執行狀態(單獨執行某個狀態) [root@linux-node1 files]# salt '*' state.sls dns # 到minion端查看 [root@linux-node2 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 10.0.0.2 ######### # 執行方式二 # 若是想使用高級狀態執行,須要在top.sls中寫明 [root@linux-node1 files]# vim /srv/salt/base/top.sls base: '*': - dns # 執行高級狀態,從top.sls中讀取,在執行 [root@linux-node1 files]# salt '*' state.highstate
salt語法:YAML
規則一:縮進
兩個空格組成
不要使用tab鍵
規則二:冒號
他的結果是以字典的方式
以冒號結尾和路徑不須要加冒號
以冒號結尾
規則三:短橫線線
表示是一種列表關係(字典中的列表)
短橫線後加空格
jinja模版
jinja模版的建立
# jinja模版 # 有- template: 就表明這個文件就是一個模版文件 # - defaults: 是變量列表 [root@linux-node1 base]# vim dns.sls /etc/resolv.conf: file.managed: - source: salt://files/resolv.conf - user: root - group: root - mode: 644 - template: jinja - defaults: DNS_SERVER: 10.0.0.2
jinja模版的使用
# 模板文件裏面變量使用方式{{ DNS_SERVER }} [root@linux-node1 base]# vim /srv/salt/base/files/resolv.conf # Generated by NetworkManager # nameserver 10.0.0.2 nameserver {{ DNS_SERVER }} # 執行高級狀態 [root@linux-node1 base]# salt '*' state.highstate # minion端查看,nameserver 自動將變量代換 [root@linux-node2 ~]# cat /etc/resolv.conf # Generated by NetworkManager # nameserver 10.0.0.2 nameserver 10.0.0.2
jinja模版中使用Grains
# 使用grains [root@linux-node1 base]# cat /srv/salt/base/files/resolv.conf # Generated by NetworkManager nameserver 10.0.0.2 # {{ grains['fqdn_ip4'] }} # minion端查看 [root@linux-node2 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 10.0.0.2 # ['10.0.0.8']
還能夠在jinja模版中使用執行模塊和Pillar
案例
設置DNS執行文件
[root@linux-node1 base]# cd /srv/salt/base/ [root@linux-node1 base]# mkdir -pv init/files # dns設置 [root@linux-node1 base]# cat /srv/salt/base/init/dns.sls /etc/resolv.conf: file.managed: - source: salt://init/files/resolv.conf - user: root - group: root - mode: 644 [root@linux-node1 base]# cp /etc/resolv.conf /srv/salt/base/init/files/
記錄歷史命令
格式:時間 用戶 命令
[root@linux-node1 base]# cat /srv/salt/base/init/history.sls /etc/profile: file.append: - text: - export HISTTIMEFORMAT="%F %T `whoami`" [root@linux-node1 base]# tree /srv/salt/base/ /srv/salt/base/ ├── init │ ├── dns.sls │ ├── files │ │ └── resolv.conf │ └── history.sls └── top.sls
記錄操做日誌
寫到/var/log/message
[root@linux-node1 init]# cat audit.sls /etc/bashrc: file.append: - text: - export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg";}'
內核調優
使用salt自帶的模塊sysctl
[root@linux-node1 init]# cat sysctl.sls vm.swappiness: sysctl.present: - value: 0 net.ipv4.ip_local_port_range: sysctl.present: - value: 10000 65000 fs.file-max: sysctl.present: - value: 100000
#如何找呢?從/proc/sys/裏面,而後後面的/用.來代替。
將初始化的sls放在一塊兒
[root@linux-node1 init]# cat env_init.sls include: - init.dns - init.history - init.audit - init.sysctl
修改top.sls文件
base環境下init目錄下的env_init.sls
[root@linux-node1 init]# cat /srv/salt/base/top.sls base: '*': - init.env_init
最終呈現結果
[root@linux-node1 base]# tree . ├── init │ ├── audit.sls │ ├── dns.sls │ ├── env_init.sls │ ├── files │ │ └── resolv.conf │ ├── history.sls │ └── sysctl.sls └── top.sls
結果檢查
從新打開minion的tty窗口,分別執行history和去message下面查看,檢測
狀態模塊:狀態間關係
功能:條件判斷,主要用於cmd狀態模塊
經常使用方法:
onlyif:檢查的命令,近當onlyif選項指向的命令返回true時才執行
name定義的命令
unless:用於檢查的命令,僅當unless選項指向的命令返回false時才執行name指向的命令
功能名稱:requisites
功能:處理狀態間關係
經常使用方法:
require #我依賴某個狀態
require_in #我被某個狀態依賴
watch #我關注某個狀態
watch_in #我被某個狀態關注