如何讓 salt-ssh 在遠端節點上執行本機腳本?

如何讓 salt-ssh 在遠端節點上執行本機腳本?

.::更新已解決::.

在 @wirap 的幫助下,它現在正在工作。我已將腳本目錄符號連結到/etc/salt/states/scripts並使用此test.sls配置,它現在正在工作。

/root/bin/updater/scripts/pam-setup-access:
    file.managed:
      - name: /tmp/pam-setup-access
      - source: salt://scripts/pam-setup-access
      - mode: 0700
run_script:
   cmd.run:
      - name: /tmp/pam-setup-access
   file.absent:
      - name: /tmp/pam-setup-access

我是 salt-ssh 新手,正在查看一些信息這裡關於如何執行駐留在我的管理框 ( /root/bin/updater/scripts/pam-setup-access) 上的腳本,該腳本位於我也具有 root 存取權限的遠端節點上。

我創建了一個state文件(如下),但不確定要將其放置在哪裡。鹽-ssh文件只是提到/etc/salt/master所以我查了一下但是那些文檔似乎特定於 vagrant 和軟體包安裝。

add script:
    file.managed:
    - name: pam-setup-access
    - source: /root/bin/updater/scripts/pam-setup-access

run script:
    cmd.run:
    - name: pam-setup-access

最後,我嘗試簡單地從當前目錄運行狀態文件,如第一個連結所示,但我只是感到惱火。我缺什麼?

# salt-ssh '*' state.apply test.sls 
nod0:
    [CRITICAL] Unable to import msgpack or msgpack_pure python modules
    Function state.apply is not available

nod1:
    [CRITICAL] Unable to import msgpack or msgpack_pure python modules
    Function state.apply is not available

我需要使用 salt-ssh,因為幾個「minions」駐留在與主伺服器 (DMZ) 分開的網路上。據我了解,傳統的 salt 設定需要 Minions 連接到 salt master。

自從發布以來,我已經安裝了 salt-sshsaltstack 倉庫這似乎已經擺脫了msgpack上面的錯誤。我還修改了上面 vagrant 特定連結中的一些範例,masterstates./etc/salt我已將狀態文件(上面)放在/etc/salt/states/test.sls.結果如下。

我按照@wirap的建議在add script和之間添加了下劃線。run script這讓我更進一步,如下圖所示。客戶端或伺服器上的腳本路徑似乎存在一些錯誤。尚未確定。看來我只需要state.apply使用檔案名稱來呼叫.sls(不帶 .sls 副檔名)。

/etc/salt/master:

file_roots:
   base:
      - /etc/salt/states

當我現在啟動 salt-ssh 時,我得到:

# salt-ssh '*' state.apply test
nod0:
----------
          ID: add_script
    Function: file.managed
        Name: pam-setup-access
      Result: False
     Comment: Specified file pam-setup-access is not an absolute path
     Started: 11:53:50.237379
    Duration: 0.602 ms
     Changes:   
----------
          ID: run_script
    Function: cmd.run
        Name: pam-setup-access
      Result: False
     Comment: Command "pam-setup-access" run
     Started: 11:53:50.238629
    Duration: 8.297 ms
     Changes:   
              ----------
              pid:
                  1037
              retcode:
                  127
              stderr:
                  /bin/bash: pam-setup-access: command not found
              stdout:

Summary for nod0
------------
Succeeded: 0 (changed=1)
Failed:    2
------------
Total states run:     2
Total run time:   8.899 ms
nod1:
----------
          ID: add_script
    Function: file.managed
        Name: pam-setup-access
      Result: False
     Comment: Specified file pam-setup-access is not an absolute path
     Started: 11:53:50.476743
    Duration: 0.555 ms
     Changes:   
----------
          ID: run_script
    Function: cmd.run
        Name: pam-setup-access
      Result: False
     Comment: Command "pam-setup-access" run
     Started: 11:53:50.477906
    Duration: 7.5 ms
     Changes:   
              ----------
              pid:
                  30772
              retcode:
                  127
              stderr:
                  /bin/bash: pam-setup-access: command not found
              stdout:

Summary for nod1
------------
Succeeded: 0 (changed=1)
Failed:    2
------------
Total states run:     2
Total run time:   8.055 ms

答案1

  1. 您確定要使用 salt-ssh (「透過 ssh 執行 salt 指令和狀態而不安裝 salt-minion。」)。如果你無法在你的minions上安裝salt-minion,你只需要這樣做
  2. 你把你的州放在哪裡了?通常在 /etc/salt/master 配置中編寫狀態檔案所在的路徑
  3. 不要逐字使用範例中提供的狀態。我很確定你不能有空間身份聲明( add script:)。
  4. 我不知道你的錯誤訊息。這個線程這裡提出以下建議:“msgpack 錯誤非常具有誤導性,因為它完全無關。似乎您的一個 server.conf 檔案在一個 Minion 上具有無效的 utf-8,而該檔案在另一個 Minion 上不存在?”我強烈懷疑您的州 ID 中的空格(“”)。根據我的經驗,如果狀態文件或支柱中存在無效字符,SaltStack 可能會發出相當誤導性的錯誤訊息。

額外提示:

  • 這裡有關如何設定狀態樹的資訊。
  • 也許可以使用已經安裝的 SaltStack(docker、Vagrant?)來學習它的工作原理。由於 UtahDave 在 SaltStack 中非常活躍,我會選擇他的示範(免責聲明:我自己沒有測試過!)

更新:當您使用 file.managed 時:

  • source的參數file.managed是主節點上的路徑(相對於狀態路徑),而不是目標路徑。
  • 您需要指定目標上的路徑,這就是您收到錯誤的原因:“指定的檔案 pam-setup-access 不是絕對路徑”

例子:

/root/bin/updater/scripts/pam-setup-access
   file.managed:
     - source: salt://files/pam-setup-access

是相同的:

some-arbitrary-id
    file.managed:
    - name: /root/bin/updater/scripts/pam-setup-access
    - source: salt://files/pam-setup-access

https://docs.saltstack.com/en/develop/ref/states/all/salt.states.file.html#module-salt.states.file

cmd.run 也是如此。

閱讀一般的SaltStack 教學。當你設計狀態時,使用 salt-ssh 還是 salt 並不重要。不要讓這件事讓你感到困惑。

相關內容