- SaltStack自動化工具
- 核心概念
- 1. Master 和 Minion
- 2. State
- 3. Pillar
- 4. Grains
- 5. Modules
- 6. Runner
- 7. Reactor
- 工作流程
- 安裝和配置
- 1. 配置hosts解析
- 2. 配置yum源
- 3. saltstack安裝
- 3.1 master節點
- 3.2 minion節點
- 4. 配置saltstack
- 4.1 master節點配置
- 4.2 配置minion節點
- 5. 接受認證公鑰
- 6. 測試
- 7. 定義主機組
- Grains變數
- 模組
- 1. 查詢支援的模組
- 2. 查詢某個模組的具體使用方法
- 3. 被控節點安裝軟體
- 4. 查詢某個模組具體有哪些函式
- 核心概念
SaltStack自動化工具
SaltStack 是一種基礎設施自動化和配置管理工具,廣泛用於管理大型 IT 基礎設施。它能夠自動化配置、部署、管理和監控伺服器及應用程式。
核心概念
1. Master 和 Minion
- Master:SaltStack 的主伺服器,負責管理和控制多個 Minion。Master 傳送命令,收集資料並進行協調。
- Minion:被管理的節點,接收 Master 的命令並執行。Minion 可以是物理伺服器、虛擬機器或容器。
2. State
- State:描述系統應該處於的狀態,通常用 YAML 格式編寫。例如,安裝某個軟體包,配置某個服務。
- State File:儲存 state 的檔案,通常以
.sls
結尾。
3. Pillar
- Pillar:儲存敏感資料和配置資訊,例如密碼、金鑰。Pillar 資料是 Master 特定的,不會被 Minion 共享。
4. Grains
- Grains:靜態資料的集合,描述 Minion 的特性(如作業系統、IP 地址、記憶體等)。
5. Modules
- Modules:功能單元,用於執行特定任務。SaltStack 提供了豐富的內建模組,如執行命令、管理軟體包、使用者等。
6. Runner
- Runner:在 Master 上執行的任務,用於進行一些複雜的管理操作,如管理批次任務、監控等。
7. Reactor
- Reactor:事件響應系統,根據觸發的事件自動執行預定義的操作。
工作流程
- 命令傳送:管理員在 Master 上傳送命令。
- 命令分發:Master 將命令分發給目標 Minion。
- 命令執行:Minion 接收到命令後執行相應操作。
- 結果返回:Minion 將執行結果返回給 Master。
- 結果彙總:Master 彙總並展示執行結果。
安裝和配置
主機名 | 系統 | IP |
---|---|---|
node1 控制節點 | openEuler22.03 | 192.168.200.179 |
node2 被控節點 | openEuler22.03 | 192.168.200.180 |
node3 被控節點 | openEuler22.03 | 192.168.200.172 |
官網提供2種安裝方式 saltStack官網
- bootstrap:自動化安裝
- 透過官網的指令碼可以執行並安裝
- manual:手動安裝
- 配置yum源手動安裝並配置我們採取這種方式
1. 配置hosts解析
這一步可選,如果被管理節點過多的話可以不用做,因為做了反而浪費時間
[root@node01 ~]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.179 node1
192.168.200.180 node2
192.168.200.172 node3
2. 配置yum源
官網有提供yum源,我們使用的是openEuler,選擇RHEL的配置就行
地址
sudo rpm --import https://repo.saltproject.io/salt/py3/redhat/8/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub
curl -fsSL https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
直接執行官網的這2行命令就可以了,但是由於他配置的是國外的地址,我們下載軟體包就會有點慢,我們可以將地址改為國內清華大學的
[root@node3 ~]# cat /etc/yum.repos.d/salt.repo
[salt-repo]
name=Salt repo for RHEL/CentOS 8 PY3
baseurl=https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest
skip_if_unavailable=True
priority=10
enabled=1
enabled_metadata=1
gpgcheck=1
gpgkey=https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest/SALT-PROJECT-GPG-PUBKEY-2023.pub
這個是執行完命令之後幫我們生成的yum源,我們將地址替換掉
[root@node01 ~]# cat /etc/yum.repos.d/salt.repo
[salt-repo]
name=Salt repo for RHEL/CentOS 8 PY3
baseurl=https://mirrors.tuna.tsinghua.edu.cn/saltstack/salt/py3/redhat/8/x86_64/latest/
skip_if_unavailable=True
priority=10
enabled=1
enabled_metadata=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/saltstack/salt/py3/redhat/8/x86_64/latest/SALT-PROJECT-GPG-PUBKEY-2023.pub
然後將yum源的repo檔案傳送到各個節點
Authorized users only. All activities may be monitored and reported.
salt.repo 100% 314 785.3KB/s 00:00
[root@node01 ~]# scp /etc/yum.repos.d/salt.repo node3:/etc/yum.repos.d/
Authorized users only. All activities may be monitored and reported.
salt.repo 100% 314 822.3KB/s 00:00
3. saltstack安裝
3.1 master節點
master節點需要安裝2個包salt-master
和salt-ssh
,直接採用yum安裝
[root@node01 ~]# yum install salt-master salt-ssh -y
3.2 minion節點
minion節點就只需要安裝一個包salt-minion
[root@node02 ~]# yum install salt-minion -y
[root@node03 ~]# yum install salt-minion -y
4. 配置saltstack
4.1 master節點配置
在安裝好master節點所需要的包之後會在/etc/salt
目錄下有一個master檔案,這是預設的配置檔案,我們最好不要去修改它,我們可以將它作為一個模板來抄配置,我們自己的配置檔案可以放在/etc/salt/master.d/
這個目錄下
[root@node01 ~]# vim /etc/salt/master.d/master.conf
interface: 0.0.0.0
publish_port: 4505
ret_port: 4506
pki_dir: /etc/salt/pki/master
file_roots:
base:
- /srv/salt/
pillar_roots:
base:
- /src/pillar
這段配置指定了以下內容:
- interface 0.0.0.0: Salt Master 監聽所有網路介面上的請求。
- 使用埠 4505 來發布訊息,使用埠 4506 來接收 Minion 返回的結果。
- 加密通訊的金鑰存放在
/etc/salt/pki/master
目錄中。 - Salt 檔案伺服器的根目錄為
/srv/salt/
,用於存放 state 檔案和相關資源。 - Pillar 資料存放在
/src/pillar
目錄中。
這是一個yaml格式的配置檔案,不要使用tab鍵,使用空格來縮排,接下來我們啟動master
[root@node01 salt]# mkdir -p /srv/salt/ /src/pillar
[root@node01 salt]# systemctl restart salt-master
4.2 配置minion節點
minion節點同樣的,不要直接去修改/etc/salt/minion
,我們在/etc/salt/minion.d/
目錄下去寫配置
[root@node02 salt]# vim /etc/salt/minion.d/minion.conf
master: 192.168.200.179
id: 192.168.200.180 # 如果你寫的hosts檔案的話這裡可以直接寫主機名
[root@node03 minion.d]# vim minion.conf
master: 192.168.200.179
id: node3
將2中情況都寫了出來,如果你配置了hosts檔案可以採用下面這種方式
啟動minion
[root@node2 minion.d]# systemctl restart salt-minion.service
[root@node3 minion.d]# systemctl restart salt-minion.service
這個時候服務就啟動了,你如果使用systemctl status salt-minion
去看服務的狀態的話,你會發現服務是有報錯的
● salt-minion.service - The Salt Minion
Loaded: loaded (/usr/lib/systemd/system/salt-minion.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2024-07-12 15:55:26 CST; 3min 34s ago
Docs: man:salt-minion(1)
file:///usr/share/doc/salt/html/contents.html
https://docs.saltproject.io/en/latest/contents.html
Main PID: 2504 (python3.10)
Tasks: 7 (limit: 8917)
Memory: 57.2M
CGroup: /system.slice/salt-minion.service
├─ 2504 /opt/saltstack/salt/bin/python3.10 /usr/bin/salt-minion
└─ 2511 "/opt/saltstack/salt/bin/python3.10 /usr/bin/salt-minion MultiMinionProcessManager MinionProcessManager"
Jul 12 15:57:22 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:57:32 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:57:42 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:57:52 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:02 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:12 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:22 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:33 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:43 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before>
Jul 12 15:58:53 node03 salt-minion[2511]: [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before
這個報錯我們不必理會,這是因為我們的master節點還沒有接受他們的公鑰
5. 接受認證公鑰
在接受之前我們可以先檢視一下,在master節點
[root@node01 salt]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
192.168.200.180
node3
Rejected Keys:
這裡顯示沒有接受的公鑰有2個,一個是192.168.200.180,另一個是node3
接下來我們接受公鑰
# 接受某個公鑰
[root@node01 salt]# salt-key -a 192.168.200.180
The following keys are going to be accepted:
Unaccepted Keys:
192.168.200.180
Proceed? [n/Y] y
Key for minion 192.168.200.180 accepted.
[root@node01 salt]# salt-key
Accepted Keys:
192.168.200.180
Denied Keys:
Unaccepted Keys:
node3
Rejected Keys:
# 接受全部公鑰
[root@node01 salt]# salt-key -A
- -a :指定接受某一個公鑰
- -A : 接受全部
- -d: 刪除某一個公鑰
- -D:刪除全部
6. 測試
公鑰都接收好了之後我們來試一下能不能管理節點了
[root@node1 ~]# salt '*' test.ping
node3:
True
192.168.200.180:
True
返回True就代表這個節點OK了
[root@node1 ~]# salt '*' cmd.run 'echo saltstack > /tmp/salt'
192.168.200.180:
node3:
這個命令就是輸出saltstack並且重定向到/tmp/salt這個檔案,我們可以到node2和node3上檢視這個檔案
[root@node1 ~]# salt '*' cmd.run 'cat /tmp/salt'
192.168.200.180:
saltstack
node3:
saltstack
saltstack也可以跟ansible一樣定義主機組,但是定義的方式不用,我們來定義一個看看
7. 定義主機組
在master節點上的/etc/salt/master.d/
下建立一個檔案
[root@node1 ~]# vim /etc/salt/master.d/groups.conf
nodegroups:
webserver:
- 192.168.200.180
- node3
這樣我們就定義了一個webserver的主機組,裡面包含2個主機
對主機組操作是這樣的
[root@node1 ~]# salt -N 'webserver' test.ping
192.168.200.180:
True
node3:
True
需要加上 -N,然後指定主機組的名字
Grains變數
grains變數與ansible的facts變數是差不多的,ansible裡面可以透過setup
模組來收集,saltstack裡則是這樣的
[root@node1 ~]# salt 'node3' grains.items |wc -l
385
內容非常的多,我就擷取一點內容
node3:
----------
biosreleasedate:
11/12/2020
biosvendor:
Phoenix Technologies LTD
biosversion:
6.00
boardname:
440BX Desktop Reference Platform
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
- apic
- sep
- mtrr
……………………省略
我們還可以過濾內容
[root@node1 ~]# salt 'node3' grains.items |grep -A 3 ipv4
ipv4:
- 127.0.0.1
- 192.168.200.172
- 192.168.200.200
或者直接使用自帶的過濾器
[root@node1 ~]# salt 'node3' grains.item
node3:
----------
[root@node1 ~]# salt 'node3' grains.item ipv4
node3:
----------
ipv4:
- 127.0.0.1
- 192.168.200.172
- 192.168.200.200
注意,列出全部的變數是grains.items
,而過濾指定的內容是grains.item
,注意區別
模組
1. 查詢支援的模組
[root@node1 ~]# salt 'node3' sys.list_modules
node3:
- acl
- aliases
- alternatives
- archive
- artifactory
- baredoc
- beacons
- bigip
- btrfs
- buildout
- chroot
- cloud
- cmd
- composer
- config
- consul
- container_resource
- cp
…………省略
我這裡一共是172個模組
[root@node1 ~]# salt 'node3' sys.list_modules |wc -l
172
2. 查詢某個模組的具體使用方法
像ansible裡面的ansible-doc一樣,saltstack也可以查詢模組的具體使用方式
# 查詢pip模組
[root@node1 ~]# salt 'node3' sys.doc pip
執行這個會輸出非常多的內容,你找到你想要的內容然後他裡面是有寫CLI Example
的,你照著他的Example改就好了
3. 被控節點安裝軟體
要安裝軟體包與ansible是不一樣的,ansible裡面你如果控制的是RHEL系列的包是使用yum,Debain系列使用apt,而在saltstack裡則全都是使用pkg模組
# 安裝一個vsftpd
[root@node1 ~]# salt '*' pkg.install pkgs='["vsftpd"]'
node3:
----------
vsftpd:
----------
new:
3.0.3-33.oe2203sp3
old:
192.168.200.180:
----------
vsftpd:
----------
new:
3.0.3-33.oe2203sp3
old:
這樣ftp就被安裝在各個節點上了,如果需要一次性安裝多個則在中括號裡面用逗號隔開,多寫幾個就可以了
如果只需要安裝單個的包也可以這樣寫
[root@node1 ~]# salt '*' pkg.install httpd
192.168.200.180:
----------
apr:
----------
new:
1.7.0-6.oe2203sp3
old:
apr-util:
----------
new:
1.6.1-14.oe2203sp3
old:
httpd:
----------
new:
2.4.51-21.oe2203sp3
old:
httpd-filesystem:
----------
new:
2.4.51-21.oe2203sp3
old:
httpd-tools:
----------
new:
2.4.51-21.oe2203sp3
old:
mailcap:
----------
new:
2.1.53-3.oe2203sp3
old:
mod_http2:
----------
new:
1.15.25-3.oe2203sp3
old:
openEuler-logos-httpd:
----------
new:
1.0-8.oe2203sp3
old:
node3:
----------
apr:
----------
new:
1.7.0-6.oe2203sp3
old:
apr-util:
----------
new:
1.6.1-14.oe2203sp3
old:
httpd:
----------
new:
2.4.51-21.oe2203sp3
old:
httpd-filesystem:
----------
new:
2.4.51-21.oe2203sp3
old:
httpd-tools:
----------
new:
2.4.51-21.oe2203sp3
old:
mailcap:
----------
new:
2.1.53-3.oe2203sp3
old:
mod_http2:
----------
new:
1.15.25-3.oe2203sp3
old:
openEuler-logos-httpd:
----------
new:
1.0-8.oe2203sp3
old:
就是直接在install後面加上需要安裝的軟體包就行了
這裡不需要指定yum或者apt的原因是因為,咱們是在被控節點安裝了agent的,也就是salt-minion這個包,你裝在不同的系統上這個包肯定就會不一樣對吧,所以他是透過這個來區分的,而ansble需要指定是因為ansible是無代理的,直接使用ssh,而不管是RHEL還是Debain都是可以ssh的,所以ansible並不知道你要控制的節點的系統,則需要手動指定
4. 查詢某個模組具體有哪些函式
[root@node1 ~]# salt 'node3' sys.doc pkg |grep ^pkg
pkg.available_version:
pkg.clean_metadata:
pkg.del_repo:
pkg.diff:
pkg.download:
pkg.file_dict:
pkg.file_list:
pkg.get_locked_packages:
pkg.get_repo:
pkg.group_diff:
pkg.group_info:
pkg.group_install:
pkg.group_list:
pkg.groupinstall:
pkg.hold:
pkg.info_installed:
pkg.install:
pkg.latest_version:
pkg.list_downloaded:
pkg.list_holds:
pkg.list_installed_patches:
pkg.list_patches:
pkg.list_pkgs:
pkg.list_repo_pkgs:
pkg.list_repos:
pkg.list_updates:
pkg.list_upgrades:
pkg.mod_repo:
pkg.modified:
pkg.normalize_name:
pkg.owner:
pkg.parse_arch:
pkg.purge:
pkg.refresh_db:
pkg.remove:
pkg.services_need_restart:
pkg.unhold:
pkg.update:
pkg.upgrade:
pkg.upgrade_available:
pkg.verify:
pkg.version:
pkg.version_cmp: