saltstack使用介紹

longsihua2003發表於2024-09-09

saltstack使用介紹

saltstack是什麼

早期運維人員會根據自己的生產環境來寫特定指令碼完成大量重複性工作,這些指令碼複雜且難以維護。系統管理員面臨的問題主要是1、系統配置管理,2、遠端執行命令,因此誕生了很多開源軟體,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟體擅長維護系統狀態或方便的對大量主機進行批次的命令執行。

  salt靈活性強大,可以進行大規模部署,也能進行小規模的系統部署。salt的設計架構適用於任意數量的伺服器,從少量本地網路系統到跨越數個資料中心,拓撲架構都是c/s模型,配置簡單。

  不管是幾臺、幾百臺、幾千臺伺服器,都可以使用salt在一箇中心節點上進行管控,靈活定位任意伺服器子集來執行命令。

安裝saltstack

安裝python依賴

    pip3 install pyzmq pycryptodome msgpack pyyaml jinja2

安裝saltstack軟體

centos7透過儲存庫和金鑰安裝:官方文件

    # 配置金鑰和儲存桶
    sudo rpm --import https://repo.saltproject.io/salt/py3/redhat/7/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub
    curl -fsSL https://repo.saltproject.io/salt/py3/redhat/7/x86_64/3007.repo | sudo tee /etc/yum.repos.d/salt.repo

    # 清除其他後設資料
    yum clean expire-cache

    # 安裝salt-master/salt-minion
    # 管理主機安裝 salt-master
    # 被管理機器安裝 salt-minion
    sudo yum install salt-master
    sudo yum install salt-minion

關閉系統防護策略

# 關閉防火牆
systemctl disable firewalld
systemctl stop firewalld

# 關閉iptables
iptables -F
# 關閉selinux
sestatus
# 放寬策略
setenforce 0

如果是雲伺服器,記得開放4505(publish_port 提供遠端命令傳送功能)和4506(ret_port 提供認證,檔案服務,結果收集等功能)埠

saltstack部署

進行主salt和從salt配置

注意master和slave的配置都是yaml格式的檔案。(注意yaml對格式要求很嚴格。不能缺少和增加空格)

ps: yaml檔案格式

  • 鍵值對:以鍵值對的形式:key: value (注意key和value之中有一個空格)
  • 列表:一組按次序排列的值。類似於list。- list1 (注意空格)
  • 巢狀字典: 使用key: \n的形式,寫個鍵、冒號、空格然後換行

img

給個例子

salt-master配置檔案:

    # master機器配置檔案位置為/etc/salt/master
    # 檔案內容如下

    #繫結到本地的0.0.0.0地址
    interface: 0.0.0.0
    # 遠端命令傳送埠
    publish_port: 4505
    # 執行salt的使用者
    user: root
    # 認證埠
    ret_port: 4506
    pidfile: /var/run/salt-master.pid
    worker_threads: 5
    # 是否自動接受金鑰
    auto_accept: False

salt-slave配置檔案:

    # slave機器配置檔案位置為/etc/salt/minion
    # 檔案內容如下
    
    # 繫結的主機ip
    master: saltmain
    # 主機ip開放的接受埠
    master_port: 4506
    # 執行salt的使用者
    user: root
    # 我的個人識別id
    id: saltslave
    acceptance_wait_time: 10
    log_file: /var/log/salt/minion

設定dns偽解析

在/etc/hosts當中配置dns解析(方便不用寫主機ip)

    127.0.0.1	localhost

    # The following lines are desirable for IPv6 capable hosts
    ::1	localhost	ip6-localhost	ip6-loopback
    ff02::1	ip6-allnodes
    ff02::2	ip6-allrouters
    127.0.1.1	localhost.vm	localhost
    127.0.1.1	hcss-ecs-b72a	hcss-ecs-b72a

    # 加上最後兩行解析的ip
    124.71.140.179 saltslave
    47.109.190.455 saltmain

重新分別啟動salt-master和salt-minion

  • 鍵入命令重新啟動salt-master和salt-minion
    systemctl restart salt-master
    systemctl restart salt-minion
  • 注意下,可以直接透過檢視status看到這兩個服務啟動有沒有報錯
    systemctl status salt-master
    systemctl status salt-minion

img

img

saltstack統計伺服器資訊

salt金鑰接受

在確定埠開放和配置沒有問題之後,就可以進行這步了。

# 在master機器上執行
[root@saltmain ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
saltslave # 在slave當中設定的id
Rejected Keys:

出現這個情況就是裝置已經連線上了。這個時候其實就是接受到了原本機器的金鑰

# 接受金鑰
[root@saltmain ~]# salt-key -a saltslave
# 或者使用 -A 引數全部接受
salt-key -A

# 然後就可以看到這樣的salt-key列表
[root@saltmain ~]# salt-key -L
Accepted Keys:
saltslave
Denied Keys:
Unaccepted Keys:
Rejected Keys:

# 引數描述
[root@linux-node1 ~]# salt-key -L
Accepted Keys:  #已經接受的key
Denied Keys:    #拒絕的key
Unaccepted Keys:#未加入的key
Rejected Keys:#吊銷的key

#常用引數
-L  #檢視KEY狀態
-A  #允許所有
-D  #刪除所有
-a  #認證指定的key
-d  #刪除指定的key
-r  #登出掉指定key(該狀態為未被認證)

ps.在接受金鑰之前,也可以檢視收到的金鑰是否和slave機器中匹配

# 宿主機
[root@saltmain ~]# salt-key -f saltslave
Accepted Keys:
saltslave:  c9:66:e4:d2:b4:4b:4d:19:b5:c2:9a:0e:81:6c:9b:da:9b:1f:15:b5:30:12:a7:97:40:02:a9:db:fd:ce:9a:bb

# 從屬機
root@saltslave1:~# salt-call --local key.finger
local:
    c9:66:e4:d2:b4:4b:4d:19:b5:c2:9a:0e:81:6c:9b:da:9b:1f:15:b5:30:12:a7:97:40:02:a9:db:fd:ce:9a:bb

salt命令介紹

這裡介紹一些簡單命令,有需要可以檢視某些大佬的模組合集:掘金

    # 萬能命令 cmd模組的run命令去執行命令列
    salt '*' cmd.run 'ls /opt/' # 在所有的子機器當中執行ls /opt/

    # 執行並顯示執行概要(--summary)
    salt --summary '*' cmd.run 'hostname'

    # 測試機器是否聯通
    salt '*' test.ping
    # 測試echo命令
    salt '*' test.echo 'chaoge nb666'

    # 檢視所有模組
    salt '*' sys.list_modules
    # 檢視test模組的所有函式(同樣的也可以檢視cmd模組等等)
    salt '*' sys.list_functions test

    # 安裝包(例如nginx)
    salt 'slave' pkg.install "nginx"
    # 解除安裝包
    salt 'slave' pkg.remove "nginx"
    # 檢視包版本
    salt 'slave' pkg.version "nginx"

    # 啟動服務
    salt 'slave' service.start "nginx"
    # 檢視服務狀態
    salt 'slave' service.status "nginx"
    # 停止服務
    salt 'slave' service.stop "nginx"

    # --out 控制輸出結果
    [root@saltmain ~]# salt --out=json '*' cmd.run_all 'hostname'
    {
        "saltslave": {
            "pid": 158105,
            "retcode": 0,
            "stdout": "saltslave1",
            "stderr": ""
        }
    }
    [root@saltmain ~]# salt --out=yaml '*' cmd.run_all 'hostname'
    saltslave:
        pid: 158112
        retcode: 0
        stderr: ''
        stdout: saltslave1

ps.注意,透過salt執行命令時,linux是不會登入的。這樣的話PATH一般都處於初始狀態

[root@saltmain ~]# salt '*' cmd.run "echo $PATH"
saltslave:
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

如果要檢查或使用其他位置的服務。就使用絕對路徑。

相關文章