saltStack自動化工具

FuShudi發表於2024-07-12

目錄
  • 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:事件響應系統,根據觸發的事件自動執行預定義的操作。

工作流程

  1. 命令傳送:管理員在 Master 上傳送命令。
  2. 命令分發:Master 將命令分發給目標 Minion。
  3. 命令執行:Minion 接收到命令後執行相應操作。
  4. 結果返回:Minion 將執行結果返回給 Master。
  5. 結果彙總: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-mastersalt-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

這段配置指定了以下內容:

  1. interface 0.0.0.0: Salt Master 監聽所有網路介面上的請求。
  2. 使用埠 4505 來發布訊息,使用埠 4506 來接收 Minion 返回的結果。
  3. 加密通訊的金鑰存放在 /etc/salt/pki/master 目錄中。
  4. Salt 檔案伺服器的根目錄為 /srv/salt/,用於存放 state 檔案和相關資源。
  5. 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:

相關文章