Saltstack自動化運維入門
Saltstack
-
• 一、saltstack簡介 -
• -
• 1.簡單介紹 -
• 2.通訊模式 -
• 3.salt minion認證 -
• 二、saltstack安裝 -
• 三、saltstack的配置 -
• 四、配置管理入門實踐 -
• saltstack的state.sls和state.highstate之區別 -
• 五、正則匹配主機 -
• 六、資料系統Grains(客戶端) -
• 七、資料系統Pillar(服務端) -
• 八、遠端執行Targeting -
• 九、配置管理States -
• 十、配置管理LAMP部署env=dev -
• 十一、配置管理狀態關係
==官網:https://docs.saltproject.io/en/latest/==
一、saltstack簡介
1.簡單介紹
saltstack 是基於C/S架構的服務模式,伺服器端叫做Master,客戶端叫作Minion,並且有訊息佇列中的釋出與訂閱(pub/sub)服務模式,minion與master之間透過 ZeroMQ 訊息佇列通訊。Master和Minion端都以守護程序的模式執行,一直 監聽配置檔案裡面定義的ret_port也就是4506埠(接收minion請求)和publish_port也就是4505埠(ZMQ的釋出訊息)。 當minion執行時會自動連線到配置檔案裡面定義的Master地址ret_port埠進行連線認證。採用RSA Key方式確認身份,傳輸採用AES加密,使傳輸的安全性得到保障。
Saltstack執行模式 :
-
• Local -
• Master/Minion -
• Salt SSH
Saltstack三大功能:
-
• 遠端執行(執行遠端命令) -
• 配置管理(狀態管理) -
• 雲管理
2.通訊模式
Salt使用釋出 – 訂閱模式與受管系統進行通訊。 連線由Salt minion發起,這意味著你不需要在這些系統上開啟任何傳入埠(從而減少攻擊向量)。 Salt master使用埠4505和4506,必須開啟端口才能接收訪問連線。

Publisher (埠4505)所有Salt minions都需要建立一個持續連線到他們收聽訊息的釋出者埠。 命令是透過此埠非同步傳送給所有連線,這使命令可以在大量系統上同時執行。
Request Server (埠4506)Salt minions根據需要連線到請求伺服器,將結果傳送給Salt master,並安全地獲取請求的檔案或與特定minion相關的資料值(稱為Salt pillar)。 連線到這個埠的連線在Salt master和Salt minion之間是1:1(不是非同步)。
3.salt minion認證
當minion第一次啟動時,它會在網路中搜索一個名為salt的系統(儘管這可以很容易地更改為IP或不同的主機名)。 當發現時,minion發起握手,然後將公鑰傳送給Salt master。 在初始連線之後,Salt minions的公鑰儲存在伺服器上,並且必須使用salt-key命令(或透過某種自動機制)在Salt master上接受。 這可能是讓新使用者混淆的原因,因為Salt不會提供解密訊息所需的安全金鑰,直到Salt minions的公鑰被接受(這意味著Salt minions在被接受其金鑰之前不會執行任何命令)。 在minion金鑰被salt master接受後,Salt主機 minion會返回其公鑰以及旋轉的AES金鑰,該金鑰用於加密和解密由Salt master傳送的訊息。 返回的AES金鑰使用Salt minion最初發送的公鑰進行加密,因此只能由該Salt minion解密。
二、saltstack安裝
1.下載yum源
wget -P /etc/yum.repos.d https://mirrors.aliyun.com/saltstack/yum/redhat/7.6/x86_64/saltstack-rhel7.repo
2.在master端安裝
yum -y install salt-master
3.在minion端安裝
yum -y install salt-minion
三、saltstack的配置
注意冒號後面要有空格#hostnamectl set-hostname salt01.tianyun.com#vim /etc/hosts
初始化配置配置對應的檔案路徑
master端
在/etc/salt/master下新增修改master: 10.0.100.132user: rootinterface: 0.0.0.0file_roots: base: - /srv/saltpillar_roots: base: - /srv/pillar啟動systemctl start salt-master
minion端
在/etc/salt/minion下新增#這裡要指向salt-master伺服器,可以是IP,也可以是域名,也可以是主機名,如果用的是內部DNS伺服器的話可以用主機名或者域名的形式。master: 10.0.100.132user: rootid: agent1啟動service salt-minion start
檢視所有的金鑰
[root@master]# sudo salt-key --list-all # salt-key -L Accepted Keys:agent1Denied Keys:Unaccepted Keys:Rejected Keys:
接受一個指定金鑰
salt-key --accept=<key>salt-key -a=<key>
接受所有金鑰
salt-key --accept-allsalt-key -A -y
刪除一個指定金鑰
salt-key -d xxx
刪除所有金鑰
salt-key -D
測試常用遠端執行入門
[root@master]# salt '*' test.pingagent1:True# salt 'agent1' test.ping# salt 'agent1' cmd.run 'df -h'# salt -L 'agent2,agent3' cmd.run 'uptime' -L跟多個主機# salt -S '192.168.122.0/24' cmd.run 'uptime'注:master 秘鑰對預設儲存在/etc/salt/pki/master/master.pub /etc/salt/pki/master/master.pemmaster 端認證的公鑰儲存在:/etc/salt/pki/master/minions/minion 秘鑰對預設儲存在/etc/salt/pki/minion/minion.pub /etc/salt/pki/minion/minion.pemminion 存放的master公鑰/etc/salt/pki/minion/minion_master.pubminion_id 預設儲存在/etc/salt/minion_id #?

salt命令詳解
salt "*" sys.list_modules # 檢視所有模組# salt -hUsage: salt [options] '<target>' <function> [arguments]Options(選項): --version : 檢視saltstack軟體的版本號。 --versions-report : 檢視saltstack軟體以及依賴包的版本號。 -h, --help : 檢視幫助資訊。 --saltfile=SALTFILE:指定saltfile的路徑。 如果沒有透過,將在當前工作目錄中搜索一個。 -c CONFIG_DIR, --config-dir=CONFIG_DIR:指定配置檔案的目錄(預設是/etc/salt/)。 -t TIMEOUT, --timeout=TIMEOUT:指定超時時間預設是5秒。 --hard-crash:捕捉到original異常不退出預設關閉。 -s, --static:以組的形式返回所有minion的資料。 -p, --progress:顯示進度圖,需要progressbar的python包。 --failhard :在第一個執行錯誤返回之後停止批處理。 --async : 非同步執行。 --subset=SUBSET : 對目標minions的隨機子集執行程式. minions在執行前會先驗證是否存在該命名的函式,再去執行 -v, --verbose : 開啟命令詳細,顯示jid和活動的工作查詢 --hide-timeout : 隱藏超時時間。 --show-jid : 顯示任務的jid。 -b BATCH, --batch=BATCH, --batch-size=BATC : 按照百分比執行任務。 -a EAUTH, --auth=EAUTH, --eauth=EAUTH, --external-auth=EAUTH : 指定外部認證方式。 -T, --make-token : 生成master token. --return=RETURNER : 設定一種替代方法。 預設情況下,salt將從命令將返回資料傳送回主伺服器,但返回資料可以重定向到任意數量的系統,資料庫或應用程式。 --return_config=RETURNER_CONF : 指定命令返回的設定檔案。 -d, --doc, --documentation : 檢視指定模式或所有模組文件。 --args-separator=ARGS_SEPARATOR : 指定傳送命令跟命令引數的分隔符,當用戶想把一個命令當作引數傳送給另一個命令執行時。 --summary : 顯示彙總資訊。 --username=USERNAME : 指定外部認證的使用者名稱。 --password=PASSWORD : 指定外部認證的密碼。 --metadata=METADATA : 將元資料傳遞給Salt,用於搜尋作業。Logging Options(日誌相關引數): -l LOG_LEVEL, --log-level=LOG_LEVEL : 指定日誌級別。 --log-file=LOG_FILE : 指定日誌記錄檔案 --log-file-level=LOG_LEVEL_LOGFILE : 日誌檔案日誌記錄級別。'all', 'garbage', 'trace', 'debug', 'info', 'warning', 'error','critical', 'quiet'. 預設: 'warning'.Target Options(目標選擇選項):* -E, --pcre : 正則匹配* -L, --list: 列表匹配,目標表達式將被解釋為以逗號分隔的列表。* -G, --grain: grains匹配。 --grain-pcre :grains加正則匹配。 -N, --nodegroup:組匹配。 -R, --range:範圍匹配。 -C, --compound : 綜合匹配(指定多個匹配,空格隔開)。* -I, --pillar : pillar值匹配。 -J, --pillar-pcre : pillar加正則匹配。 -S, --ipcidr : minions網段地址匹配。Output Options(輸出引數): --out=OUTPUT, --output=OUTPUT : 使用指定的輸出器從'salt'命令列印輸出。 內建的是 'key', 'yaml', 'overstatestage', 'newline_values_only', 'pprint', 'txt', 'raw', 'virt_query', 'compact', 'json', 'highstate', 'nested', 'quiet', 'no_return'. --out-indent=OUTPUT_INDENT, --output-indent=OUTPUT_INDENT : 在空格中列印由提供的值縮排的輸出。 負值停用縮排。 僅適用於支援縮排的輸出器。 --out-file=OUTPUT_FILE, --output-file=OUTPUT_FILE : 輸出到指定檔案。 --out-file-append, --output-file-append : 輸出附加到指定的檔案。 --no-color, --no-colour : 關閉所有的顏色顯示。 --force-color, --force-colour : 強制輸出顏色顯示。 --state-output=STATE_OUTPUT, --state_output=STATE_OUTPUT : 覆蓋配置的state_output值輸出,指定state格式(full, terse, mixed, changes or filter)輸出,預設值是full。salt-key命令詳解# salt-key -hActions: -l ARG, --list=ARG:顯示指定狀態的key(支援正則表示式) -L, --list-all :列出所有公鑰。"--list all"已經棄用。 -a ACCEPT, --accept=ACCEPT: 接受指定的公鑰(除了掛起的金鑰之外,使用--include-all匹配拒絕的金鑰),支援正則表示式。 -A, --accept-all :接收所有等待認證的key。 -r REJECT, --reject=REJECT :拒絕指定等待認證的key(支援正則表示式) -R, --reject-all:拒絕所有等待認證的key。 --include-all: 顯示所有狀態的key。 -p PRINT, --print=PRINT :列印指定的公鑰支援正則表示式。 -P, --print-all:列印所有的公鑰。 -d DELETE, --delete=DELET:刪除指定的key。 -D, --delete-all:刪除所有的key。 -F, --finger-all:顯示所有key的指紋資訊。
查詢模組salt '*' -d|grep ":" |grep disk查詢某個模組擁有的方法salt 'agent1' sys.list_functions test
四、配置管理入門實踐
master端和minion端配置好後 ,
檔案管理
[root@master ~]# mkdir /srv/{salt,pillar}[root@master ~]# cd /srv/salt[root@master salt]# vim host_file.sls/etc/hosts: file.managed: - source: salt://files/hosts - user: root - group: root - mode: 644[root@master salt]# mkdir files[root@master salt]# cd files/[root@master files]# cp /etc/hosts .[root@master files]# pwd/srv/salt/files[root@master files]# cd ..[root@master salt]# pwd/srv/salt[root@master salt]# lsfiles host_file.sls[root@master salt]# salt '*' state.sls host_fileagent1:---------- ID: /etc/hosts Function: file.managed Result: True Comment: File /etc/hosts isin the correct state Started: 18:15:50.497755 Duration: 68.637 ms Changes: Summary for agent1------------Succeeded: 1Failed: 0------------Total states run: 1Total run time: 68.637 ms用name的方式[root@master salt]# vim host_file.slsfile_test: file.managed: - name: /etc/hosts - source: salt://test/123.txt - user: root - group: root - mode: 644

複製檔案
# salt-cp '*' /etc/hosts /root
安裝nginx
pkg是模組,installed是方法,-names是引數。 相當於 yum install nginx。 require是依賴關係[root@master salt]# pwd/srv/salt[root@master salt]# vim nginx_install.slsnginx-install: pkg.installed: - names: - nginx/etc/hosts: file.managed: - source: salt://files/hosts - user: root - group: root - mode: 644 - require: - pkg: nginx-install service.running: - names: - nginx[root@master salt]# salt '*' state.sls nginx_install

安裝apache
[root@master salt]# vim apache.slsapache-service: pkg.installed: - names: - httpd - mod_ssl service.running: - name: httpd - enable: True[root@master salt]# vim top.sls base:'*': - apache[root@master salt]# salt '*' state.highstate salt '*' state.highstate test=True 表示狀態的同步,test=True表示測試成功與否apache沒安裝就安裝,安裝過的就不用
計劃任務
minute hour daymonth month dayweek[root@master ~]# cd /srv/salt/[root@master salt]# vim crontab.sls/usr/sbin/ntpdate time.aliyun.com >> /dev/null: cron.present: - user: root - minute: '*/5'[root@master salt]# salt '*' cron.list_tab root客戶機檢視[root@localhost ~]# crontab -l# Lines below here are managed by Salt, do not edit# SALT_CRON_IDENTIFIER:/usr/sbin/ntpdate time.aliyun.com >> /dev/null*/5 * * * * /usr/sbin/ntpdate time.aliyun.com >> /dev/null


5分鐘修改為3分鐘,然後再執行一遍[root@master salt]# vim crontab.sls/usr/sbin/ntpdate time.aliyun.com >> /dev/null: cron.present: - user: root - minute: '*/3'[root@master salt]# salt '*' state.sls crontab刪除cron[root@master salt]# vim del_cron.sls/usr/sbin/ntpdate times.aliyun.com >> /dev/null: cron.absent: - name: /usr/sbin/ntpdate times.aliyun.com >> /dev/null[root@master salt]# salt '*' state.sls del_cron
saltstack的state.sls和state.highstate之區別
state.sls預設的執行環境是base環境,但是它並不讀取top.sls(top.sls定義了執行環境以及需要執行的sls)。關於state.sls的官方文件說明如下:
salt.modules.state.sls(mods, saltenv='base', test=None, exclude=None, queue=False, env=None,**kwargs)
這裡saltenv指的是執行環境,預設是base環境。
state.highstate: 這個是全域性的所有環境,以及所有狀態都生效。它會讀取每一個環境的top.sls,並且對所有sls都生效。
五、正則匹配主機
https://www.cnblogs.com/wangyajian/p/11572572.htmlGrains:https://www.cnblogs.com/wangyajian/p/11586990.htmlpliiar:https://www.cnblogs.com/wangyajian/p/11586998.htmlstate模組:https://www.cnblogs.com/wangyajian/p/11633678.htmlstate安裝nginx:https://www.cnblogs.com/wangyajian/p/11633828.htmlhighstate:https://www.cnblogs.com/wangyajian/p/11663089.htmlsalt-key:https://www.cnblogs.com/hanson666/articles/7105197.html
六、資料系統Grains(客戶端)
Minion收集資訊,Master用於並匹配Target Minion端設定,提供給Master端
========== 客戶端自身收集的身份資訊 ==========Grains裡面收集了minion啟動時候的所有系統資訊,儲存在minion端。
[root@master ~]# salt '*' grains.ls 列出所有item[root@master ~]# salt '*' grains.items 獲取所有item值[root@master ~]# salt '*' grains.item os_family[root@master ~]# salt '*' grains.item osrelease[root@master ~]# salt -G 'osrelease:7.8.2003' test.ping[root@master ~]# salt '*' grains.item ipv4[root@master ~]# salt '*' grains.item ip4_interfaces

自定義Grains方法一:vim /etc/salt/minion
伺服器機櫃位置[root@agent ~]# vim /etc/salt/miniongrains: roles: - webserver - dbserver deployment: datacenter1 cabinet: 13 cab_u: 14-15roles是key,value有webserver和dbserver,資料中心一[root@agent ~]# systemctl restart salt-minion

七、資料系統Pillar(服務端)
Master端設定,提供給Minion端
Pillar在SaltStack中主要作用是儲存和定義配置管理中需要的一些資料,比如軟體版本號、使用者名稱密碼等資訊,它的儲存格式跟Grains類似,都是YAML格式。
[root@master ~]# vim /etc/salt/masterpillar_roots: base: - /srv/pillar[root@master ~]# mkdir /srv/pillar[root@master pillar]# vim env_salt01.slsroles: - webserver - dbserverdeployment: datacenter1cabinet: 13cab_u: 14-15[root@master pillar]# vim top.slsbase:'*': - env_salt01[root@master pillar]# salt '*' saltutil.refresh_pillar[root@master pillar]# salt -I 'roles:webserver' cmd.run 'uptime'[root@master pillar]# salt --pillar 'roles:webserver' cmd.run 'uptime'

八、遠端執行Targeting
和Minion_ID相關:
-
• Globbing(萬用字元) -
• Regex(正則表示式) -
• List(列表)
和Minion_ID無關:
-
• Subnet/IP -
• Grains -
• Pillar -
• Compound matchers(複合匹配) -
• Node groups(節點組)
# salt 'salt01.tianyun.com' test.ping# salt 'salt01*' test.ping正則:*表0到多次?表0到1次[]表任意一個字元[!]# salt -L 'salt01,salt02' cmd.run 'uptime' 列表-L跟多個主機不支援的寫法:# salt -L 'salt01.tianyun.com,salt03*' test.ping# salt -E 'salt0[^14].tianyun.com' test.ping 正則表示非01 04# salt -S '10.0.100.0/24' test.ping 子網# salt -G 'os:Centos' cmd.run 'uptime' 系統自帶Grains# salt -I 'Zabbix_Server' test.ping PillarMinion端修改ID:vim /etc/salt/minion_id
SLS檔案中使用正則,注意match pcre:# cat /srv/salt/top.slsbase:'saltstack0[^23].tianyun.com': - match: pcre - apacheSLS檔案中使用Grainsbase:'os:CentOS': - match: grain - apache
複合匹配
複合匹配# salt -C ‘I@or/and'# salt -C 'I@roles:dbserver and I@delpoyment:datacenter1 and G@os:Centos and [email protected]/24 or E@salt0[13].tianyun.com' cmd.run 'uptime'[root@master ~]# vim /etc/salt/masternodegroups: webs: 'I@roles:dbserver and I@delpoyment:datacenter1 and G@os:Centos and [email protected]/24 or E@salt0[13].tianyun.com'[root@master ~]# salt -N 'webs' test.ping
九、配置管理States
States是SaltStack系統中的配置語言,在日常運維中需要編寫大量的States檔案,例如需要建立一個使用者、安裝一個軟體包、之後管理相應的配置檔案,最後確保服務能正常執行。則需要編寫一些States SLS檔案,即狀態配置檔案去描述和實現相應的功能。States SLS主使用YAML語言,也可以支援使用Python語言編寫。
[root@master ~]# vim /etc/salt/masterfile_roots: base: - /srv/salt/ dev: - /srv/salt/dev/services - /srv/salt/dev/states test: - /srv/salt/test prod: - /srv/salt/prod/services - /srv/salt/prod/states[root@master ~]# systemctl restart salt-master[root@master ~]# cd /srv/salt/[root@master salt]# pwd/etc/salt[root@master salt]# mkdir dev test prodbase基礎環境,所有機器都需要的配置yum、dns、kernel引數、zabbix agent[root@master salt]# mkdir -p init/files[root@master salt]# vim init/files/resolv.confnameserver 8.8.8.8nameserver 114.114.114.114[root@master salt]# cd init/[root@master init]# pwd/srv/salt/init[root@master init]# lsfiles[root@master init]# vim dns.sls/etc/resolv.conf: file.managed: - source: salt://init/files/resolv.conf/etc/resolv.conf 是minion目標檔案.如果下面配了name就不一樣source: salt:// 表示salt的base環境[root@master init]# salt '*' state.sls init.dns env=base 注意這裡是init.dns,直接放在/srv/salt/xx.sls 這樣就不用加init。現在是放在了/srv/salt/init/xx.sls預設也是env=base

針對所有主機:
[root@master salt]# pwd/srv/salt[root@master salt]# vim top.slsbase:'*': - init.dns[root@master salt]# salt '*' state.highstate # 基於top.sls

十、配置管理LAMP部署env=dev
1.準備模板檔案
yum -y install httpd php php-mysql php-gd gd mariadb-servercp -rf /etc/httpd/conf/httpd.conf /srv/salt/dev/files/cp -rf /etc/my.cnf /srv/salt/dev/files/[root@master ~]# vim /etc/salt/masterfile_roots: base: - /srv/salt/ dev: - /srv/salt/dev/[root@master dev]# systemctl restart salt-master[root@master salt]# cd dev/[root@master dev]# ls[root@master dev]# mkdir files[root@master dev]# pwd/srv/salt/dev[root@master dev]# cp -rf /etc/httpd/conf/httpd.conf /srv/salt/dev/files/[root@master dev]# cp -rf /etc/my.cnf /srv/salt/dev/files/[root@master dev]# vim lamp.slslamp-pkg-install: pkg.installed: - names: - httpd - php - php-mysql - php-gd - gd - mariadb-serverhttpd-files: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.confhttpd-service: service.running: - name: httpd - enable: Truemysql-files: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnfmysql-service: service.running: - name: mariadb - enable: True[root@master ~]# salt '*' state.sls lamp saltenv=dev[root@master ~]# vim /srv/salt/top.slsbase:'*': - init.dnsdev:'*': - lamp[root@master ~]# salt '*' state.highstate若想狀態觸發,自動重啟,需要用到require
十一、配置管理狀態關係
unless
-
• 主要用於cmd狀態模組,僅當unless選項指向的命令 -
• 返回false時才執行name指向的命令,test -d /usr/local/nginx
re
-
• require 我依賴某個狀態 我依賴誰 -
• require_in 我被某個狀態依賴 誰依賴我
wa
-
• watch 我關注某個狀態【監控】當狀態發生改變,例如我關注的狀態發生改變,restart -
• watch_in 我被某個狀態關注
require
require: 模組名:ID
[root@master dev]# cat /srv/salt/dev/lamp.slsdep-install: pkg.installed: - names: - phphttpd-install: pkg.installed: - name: httpd - require: - pkg: dep-installhttpd-files: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - require: - pkg: httpd-installhttpd-service: service.running: - name: httpd - enable: True - require: - file: httpd-filesmysql-files: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnf
watch
[root@master dev]# cat /srv/salt/dev/lamp.slsdep-install: pkg.installed: - names: - phphttpd-install: pkg.installed: - name: httpd - require: - pkg: dep-installhttpd-files: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - require: - pkg: httpd-installhttpd-service: service.running: - name: httpd - enable: True - require: - file: httpd-files - reload: True# 可選,如果PID不變,選擇reload。預設沒這個的話,只有watch就是restart - watch: - file: httpd-files 只要httpd-files發生變化就變化,改埠,啟動變化也會改mysql-files: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnf[root@master dev]# salt '*' state.sls lamp saltenv=dev
關係,watch_in 與 require_inwatch,reload都寫在服務那watch_in,如果是寫在檔案那。 則在服務寫reload
連結:https://blog.csdn.net/qq_39578545/article/details/114994167?ops_request_misc=%257B%2522request%255Fid%2522%253A%252204b592e965f59785c4e97c61ceed050a%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=04b592e965f59785c4e97c61ceed050a&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-114994167-null-null.142^v102^pc_search_result_base1&utm_term=saltstack%E8%87%AA%E5%8A%A8%E5%8C%96&spm=1018.2226.3001.4187
(版權歸原作者所有,侵刪)
文末福利
就目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。
為了幫助大家早日擺脫繁瑣的基層運維工作,給大家整理了一套高階運維工程師必備技能資料包,內容有多詳實豐富看下圖!
共有 20 個模組





······



以上所有資料獲取請掃碼
備註:最新運維資料

100%免費領取
(後臺不再回復,掃碼一鍵領取)