Saltstack自動化運維入門
一、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.132 user: root interface:0.0.0.0 file_roots: base: - /srv/salt pillar_roots: base: - /srv/pillar 啟動 systemctl start salt-master
minion端
在/etc/salt/minion下添加 #這里要指向salt-master服務器,可以是IP,也可以是域名,也可以是主機名,如果用的是內部DNS服務器的話可以用主機名或者域名的形式。 master:10.0.100.132 user: root id: agent1 啟動 service salt-minion start
查看所有的密鑰
[root@master]# sudo salt-key --list-all # salt-key -L Accepted Keys: agent1 Denied Keys: Unaccepted Keys: Rejected Keys:
接受一個指定密鑰
salt-key --accept=salt-key -a=
接受所有密鑰
salt-key --accept-all salt-key -A -y
刪除一個指定密鑰
salt-key -d xxx
刪除所有密鑰
salt-key -D
測試常用
遠程執行入門
[root@master]# salt '*' test.ping agent1: 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.pem master 端認證的公鑰存儲在:/etc/salt/pki/master/minions/ minion 秘鑰對默認存儲在/etc/salt/pki/minion/minion.pub /etc/salt/pki/minion/minion.pem minion 存放的master公鑰/etc/salt/pki/minion/minion_master.pub minion_id 默認存儲在/etc/salt/minion_id#?
在這里插入圖片描述
salt命令詳解
salt "*" sys.list_modules # 查看所有模塊 # salt -h Usage: salt [options] '' [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 -h Actions: -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]# ls files host_file.sls [root@master salt]# salt '*' state.sls host_file agent1: ---------- ID: /etc/hosts Function: file.managed Result:True Comment: File /etc/hostsisinthe correct state Started:18:15:50.497755 Duration:68.637ms Changes: Summaryforagent1 ------------ Succeeded:1 Failed: 0 ------------ Total states run: 1 Total run time: 68.637ms 用name的方式 [root@master salt]# vim host_file.sls file_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.sls nginx-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.sls apache-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.html Grains:https://www.cnblogs.com/wangyajian/p/11586990.html pliiar:https://www.cnblogs.com/wangyajian/p/11586998.html state模塊:https://www.cnblogs.com/wangyajian/p/11633678.html state安裝nginx:https://www.cnblogs.com/wangyajian/p/11633828.html highstate:https://www.cnblogs.com/wangyajian/p/11663089.html salt-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/minion grains: roles: - webserver - dbserver deployment: datacenter1 cabinet:13 cab_u:14-15 roles是key,value有webserver和dbserver,數據中心一 [root@agent ~]# systemctl restart salt-minion
在這里插入圖片描述
七、數據系統Pillar(服務端)
Master端設置,提供給Minion端
Pillar在SaltStack中主要作用是存儲和定義配置管理中需要的一些數據,比如軟件版本號、用戶名密碼等信息,它的存儲格式跟Grains類似,都是YAML格式。
[root@master ~]# vim /etc/salt/master pillar_roots: base: - /srv/pillar [root@master ~]# mkdir /srv/pillar [root@master pillar]# vim env_salt01.sls roles: - webserver - dbserver deployment: datacenter1 cabinet:13 cab_u:14-15 [root@master pillar]# vim top.sls base: '*': - 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 Pillar Minion端修改ID:vim /etc/salt/minion_id
SLS文件中使用正則,注意matchpcre: # cat /srv/salt/top.sls base: 'saltstack0[^23].tianyun.com': -match: pcre - apache SLS文件中使用Grains base: '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/master nodegroups: 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/master file_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 prod base基礎環境,所有機器都需要的配置 yum、dns、kernel參數、zabbix agent [root@master salt]# mkdir -p init/files [root@master salt]# vim init/files/resolv.conf nameserver8.8.8.8 nameserver114.114.114.114 [root@master salt]# cd init/ [root@master init]# pwd /srv/salt/init [root@master init]# ls files [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.sls base: '*': - 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-server cp -rf /etc/httpd/conf/httpd.conf /srv/salt/dev/files/ cp -rf /etc/my.cnf /srv/salt/dev/files/ [root@master ~]# vim /etc/salt/master file_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.sls lamp-pkg-install: pkg.installed: - names: - httpd - php - php-mysql - php-gd - gd - mariadb-server httpd-files: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf httpd-service: service.running: - name: httpd - enable:True mysql-files: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnf mysql-service: service.running: - name: mariadb - enable:True [root@master ~]# salt '*' state.sls lamp saltenv=dev [root@master ~]# vim /srv/salt/top.sls base: '*': - init.dns dev: '*': - 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.sls dep-install: pkg.installed: - names: - php httpd-install: pkg.installed: - name: httpd - require: - pkg: dep-install httpd-files: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - require: - pkg: httpd-install httpd-service: service.running: - name: httpd - enable:True - require: - file: httpd-files mysql-files: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnf
watch
[root@master dev]# cat /srv/salt/dev/lamp.sls dep-install: pkg.installed: - names: - php httpd-install: pkg.installed: - name: httpd - require: - pkg: dep-install httpd-files: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - require: - pkg: httpd-install httpd-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_in
watch,reload都寫在服務那
watch_in,如果是寫在文件那。 則在服務寫reload
-
自動化
+關注
關注
29文章
5742瀏覽量
81622 -
端口
+關注
關注
4文章
1045瀏覽量
32715 -
命令
+關注
關注
5文章
728瀏覽量
22673
原文標題:比Ansible更高效?SaltStack自動化運維快速入門指南
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
銳捷助互聯網數據中心網絡自動化、可視化運維
配電自動化實用化運維指標研究
厲害了!山東電力運維自動化平臺正式投運
如何區分Puppet,Ansible,Saltstack的作用特點?
Ansible企業級自動化運維探索的詳細資料說明

評論