如何让 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文件(如下),但不知道将其放在哪里。salt-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”位于与 master (DMZ) 不同的网络上。据我了解,传统的 salt 设置需要 minions 连接到 salt master。

自发布以来,我已经安装了 salt-sshsaltstack 仓库这似乎已经消除了msgpack上面的错误。我还修改了上面 vagrant 特定链接中的一些示例,在 下添加了一个master文件和states目录/etc/salt。我将状态文件(上面)放在 下/etc/salt/states/test.sls。结果如下。

add script我按照@wirap的建议在和之间添加了下划线run script。这让我更进一步,如下所示。似乎客户端或服务器上的脚本路径存在一些错误。尚不确定。似乎我只需要使用文件state.apply的名称.sls(不带 .sls 扩展名)进行调用。

在/etc/salt/主服务器中:

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(“无需安装 salt-minion 即可通过 ssh 执行 salt 命令和状态。”)。如果您无法在 minions 上安装 salt-minion,则只需这样做
  2. 你把你的状态放在哪里了?通常在 /etc/salt/master 配置中,你写入状态文件所在的路径
  3. 不要逐字逐句地使用示例中提供的状态。我敢肯定,你不能在id 声明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 并不重要。不要让这让您感到困惑。

相关内容