文章目錄
server1 :192.168.1.11 master端
server2 : 192.168.1.12 minion端
server3 : 192.168.1.13 minion端
saltstack簡介
- saltstack是一個配置管理系統,能夠維護預定義狀態的遠程節點。
- saltstack是一個分佈式遠程執行系統,用來在遠程節點上執行命令和查詢數據。
- saltstack是運維人員提高工作效率、規範業務配置與操作的利器。
Salt的核心功能
-
使命令發送到遠程系統是並行的而不是串行的
-
使用安全加密的協議
-
使用最小最快的網絡載荷
-
提供簡單的編程接口
-
Salt同樣引入了更加細緻化的領域控制系統來遠程執行,使得系統成爲目標不止可以通過主機名,還可以通過系統屬性。
-
區別:
Salt 和ansible 最大的區別在於salt是具有客戶端的,而 ansible 沒有,salt 直接獲取root權限進行訪問
saltstack通信機制
- SaltStack 採用 C/S模式,minion與master之間通過ZeroMQ(輕量級)消息隊列通信,默認監聽4505端口。saltstack的優勢就在於這個ZMQ,它運行起來的速度比ansible快很多
- Salt Master運行的第二個網絡服務就是ZeroMQ REP系統,默認監聽4506端口,就是接受客戶端的回執的。
安裝與配置
-
進入官網下載,或者使用國內的開源鏡像網站(如清華大學鏡像和中科大鏡像網站或者阿里雲)進行下載:
yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
-
設置官方yum倉庫
因爲這條命令會產生一個新的yum源,然而這個yum源的鏡像地址並不是非常快,我們把它換成aliyun的地址,會快一些[root@rhel7 yum.repos.d]# ls redhat.repo salt-latest.repo [root@rhel7 yum.repos.d]# cat salt-latest.repo [salt-latest] name=SaltStack Latest Release Channel for RHEL/Centos $releasever baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/latest ##阿里雲的鏡像地址 failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
更改後查看yum源是否配置好:
[root@rhel7 yum.repos.d]# yum repolist Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. repo id repo name status salt-latest/x86_64 SaltStack Latest Release Channel for RHEL/Centos 7Serv 83 repolist: 83
在server2上做同樣的配置。
master節點配置:server1
[root@rhel7 yum.repos.d]# yum install -y salt-master Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. Resolving Dependencies --> Running transaction check ---> Package salt-master.noarch 0:3000.3-1.el7 will be installed ......省略 --> Finished Dependency Resolution Error: Package: salt-3000.3-1.el7.noarch (salt-latest) ##注意這裏的依賴性並沒有得到解決 Requires: python-markupsafe Error: Package: salt-3000.3-1.el7.noarch (salt-latest) Requires: python-jinja2 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest
解決依賴性,成功安裝
設置自啓動 [root@server1 Downloads]# systemctl enable salt-master Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service. 啓動 [root@server1 Downloads]# systemctl start salt-master 安裝用來查看已經打開的端口的包 [root@server1 Downloads]# yum install -y lsof Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. Nothing to do 接受請求 [root@server1 Downloads]# lsof -i :4506 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 11417 root 23u IPv4 82603 0t0 TCP *:4506 (LISTEN) 消息隊列 [root@server1 Downloads]# lsof -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 11411 root 15u IPv4 82565 0t0 TCP *:4505 (LISTEN)
minion節點配置:server2,server3
yum install -y salt-minion #安裝minion端 vim /etc/salt/minion #對minion端的配置文件進行配置 master: 192.168.1.11 #指定master端 systemctl enable salt-minion #設置自啓動minion systemctl start salt-minion #開啓自啓動
配置完minion端之後,查看master端
[root@server1 Downloads]# lsof -i :4506 #請求消息端口 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14705 root 23u IPv4 104656 0t0 TCP *:4506 (LISTEN) # server2向server1發送的請求 salt-mast 14705 root 30u IPv4 115223 0t0 TCP server1:4506->192.168.1.12:51154 (ESTABLISHED) # server3向server1發送的請求 salt-mast 14705 root 31u IPv4 115229 0t0 TCP server1:4506->192.168.1.13:45888 (ESTABLISHED) [root@server1 Downloads]# lsof -i :4505 #消息隊列 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14699 root 15u IPv4 104627 0t0 TCP *:4505 (LISTEN)
這時master端需要通過key去允許minion端的連接
[root@server1 Downloads]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: server2 server3 Rejected Keys:
同意key:-A允許所有
[root@server1 Downloads]# salt-key -A The following keys are going to be accepted: Unaccepted Keys: server2 server3 Proceed? [n/Y] y Key for minion server2 accepted. Key for minion server3 accepted.
再次查看
[root@server1 Downloads]# salt-key -L Accepted Keys: server2 server3 Denied Keys: Unaccepted Keys: Rejected Keys: #請求隊列 [root@server1 Downloads]# lsof -i :4506 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14705 root 23u IPv4 104656 0t0 TCP *:4506 (LISTEN) #消息隊列(已經建立長鏈接,master發的時候,minion端就可以收到) [root@server1 Downloads]# lsof -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14699 root 15u IPv4 104627 0t0 TCP *:4505 (LISTEN) salt-mast 14699 root 17u IPv4 118817 0t0 TCP server1:4505->192.168.1.12:53022 (ESTABLISHED) salt-mast 14699 root 18u IPv4 118822 0t0 TCP server1:4505->192.168.1.13:41772 (ESTABLISHED)
注意: 當我們更改了主機名時,要及時的去這個文件中更改,或者刪除文件,重啓minion端。因爲salt會去讀文件中的名字
[root@server2 salt]# cat minion_id server2 [root@server2 salt]# pwd /etc/salt
查看更詳細的進程信息:
安裝
[root@server1]# yum install -y python-setproctitle.x86_64
重啓salt
[root@server1]# systemctl restart salt-master.service
[root@server1]# ps ax
...
19546 ? S 0:00 /usr/bin/python /usr/share/PackageKit/helpers/yum/yu
19554 ? Ss 0:00 /usr/bin/python /usr/bin/salt-master ProcessManager
19565 ? S 0:00 /usr/bin/python /usr/bin/salt-master Multiprocessing
消息隊列
19578 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master ZeroMQPubServer
19579 ? S 0:00 /usr/bin/python /usr/bin/salt-master EventPublisher
19582 ? S 0:00 /usr/bin/python /usr/bin/salt-master Maintenance
請求隊列
19583 ? S 0:00 /usr/bin/python /usr/bin/salt-master ReqServer_Proce
維護隊列
19584 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master MWorkerQueue
19585 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-0
19586 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
19593 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master FileserverUpdat
19594 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-2
19595 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-3
19598 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
19897 pts/1 R+ 0:00 ps ax
在master端測試ping在minion端的執行情況:
[root@server1 ~]# salt '*' test.ping #*表示在key中能識別的所有主機
server3:
True
server2:
True
指定key進行測試:
[root@server1 ~]# salt server2 test.ping
server2:
True
我們當前是以超戶身份進行遠程命令:
[root@server1 ~]# salt server2 cmd.run pwd
server2:
/root
[root@server1 ~]# salt server2 cmd.run 'touch /tmp/file'
server2:
[root@server2 yum.repos.d]# ls /tmp/file
/tmp/file
slatstack遠程執行
- 測試連接
- 遠程執行命令
salt命令
salt命令由三個主要部分組成:
salt '<target>' <function> [arguments]
-
target:指定哪些minion,默認的規則是使用glob匹配minion_id
salt '*' test.ping
targets也可以使用正則表達式:
salt -E 'server[1-3]' test.ping
targets也可以指定列表:
salt -L 'server2,server3' test.ping
-
function是module提供的功能,salt內置了大量有效的functions
http://docs.saltstack.cn/ 查看中文手冊 [root@server1 ~]# salt '*' cmd.run 'uname -a' server3: Linux server3 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux server2: Linux server2 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
-
arguments通過空格來界定參數
salt 'server2' sys.doc pkg #查看模塊文檔 salt 'server2' pkg.install httpd salt 'server2' pkg.remove httpd #這樣就很簡單的完成了遠程安裝 [root@server1 ~]# salt 'server2' pkg.remove httpd server2: ---------- httpd: ---------- new: old: 2.4.6-88.el7 [root@server1 ~]# salt 'server2' pkg.install httpd server2: ---------- httpd: ---------- new: 2.4.6-88.el7 old:
命令由4505端口推送,結果由4506接收
salt內置的執行模塊(寫文件時的用法)
http://docs.saltstack.cn/ref/modules/all/index.html
salt的數據都會保存在/var/cache/salt目錄中
[root@server2 yum.repos.d]# cd /var/cache/salt
[root@server2 salt]# tree .
.
└── minion
├── extmods
└── proc
3 directories, 0 files
編寫遠程執行模塊
除了由salt內置的執行模塊,作爲用戶自己也可以再編寫自己的模塊。
配置管理
- salt狀態系統的核心是SLS,或者叫SaLt State文件。
- SLS表示系統將會是什麼樣的一個狀態,而且是以一種很簡單的格式來包含這些數據,常被叫做配置管理。
- sls文件命名:
1.sls文件以“.sls”後綴結尾,但在調用時不用寫此後綴
2.使用子目錄來做組織是個很好的選擇
3.init.sls在一個子目錄裏面表示引導文件,也就表示子目錄本身,所以apache/init.sls文件就是表示apache本身
4.如果同時存在“apache/init.sls”和“apache.sls”文件,則“apache/init.sls”被忽略,“apache.sls”將被用來表示apache
YAML語法
- 規則一:縮進
Salt需要每個縮進級別由兩個空格組成,不要使用tab - 規則二:冒號
字典keys在YMAL中的表現形式是一個以冒號結尾的字符串
my_key:my_value - 規則三:段橫槓
- 想要表示列表項,使用一個段橫槓加一個空格
- list_value_one
-list_value_two
grains與pillar詳解
grains
- grains是saltstack的一個組件,它被存放在minion端
- 當salt-minion啓動時會把數據靜態存儲到grains當中,只有當minion重啓時纔會進行數據的更新
- 由於grains時靜態數據,所以不推薦常去改它
- 應用場景:
信息查詢,可做CMDB
在target中使用,匹配minion
在state模塊中使用,配置管理模塊
信息查詢
用於查詢minion端的IP,FQDN等信息
默認可用的grains
自定義grains項
編寫grains模塊
grains匹配應用
pillar
- 與grains一樣也是一個數據系統,但是應用場景不同
- pillar是將信息動態的存放在master端,主要存放私密,敏感信息(如用戶名,密碼等),而且可以指定某一個minion端纔可以看到對應的信息
- pillar更適合在配置管理中應用
聲明pillar
自定義pillar
數據匹配
Jinja模板
簡介
- Jinja是一種基於python的模板引擎,在sls文件裏可以直接使用jinja模板來做一些操作
- 通過jinja模板可以爲不同服務器定義各自的變量
- 兩種分隔符:{%…%}和{{…}},前者用於執行諸如for循環或賦值的語句,後者把表達式的結果打印到模板上
使用方式
引用變量
Job管理
- master在下發指令任務時,會附帶上產生的jid
- minion在接受到指令開始執行時,會在本地的/var/cache/salt/minion/proc目錄下產生該gid命名的文件,用於在執行過程中,master查看當前任務的執行情況
- 指令執行完畢將結果傳送給master後,刪除該臨時文件