如何在自己的模块中使用“发布”模块

时间:2013-12-19 09:46:37

标签: salt-stack

我需要在另一个小兵身上执行一个脚本。最好的解决方案似乎是Peer Publishing,但the only documentation我能够找到只显示如何通过CLI完成它。

如何在模块中定义以下内容?

salt-call system.example.com publish.publish '*' cmd.run './script_to_run'

2 个答案:

答案 0 :(得分:4)

您需要salt.client.Caller()API。

#!/usr/bin/env python
import salt.client
salt_call = salt.client.Caller()
salt_call.function('publish.publish', 'web001',
                   'cmd.run', 'logger "publish.publish success"')

您必须以salt用户(通常是root用户)运行上述内容。

然后scoot到web001并确认消息在/ var / log / syslog中。为我工作。

答案 1 :(得分:2)

.sls文件的语法:

salt-call publish.publish \* cmd.run 'cd /*directory* && ./script_to_run.sh:
  cmd.run

替代语法:

execute script on other minion:
  cmd.run
    - name: salt-call publish.publish \* cmd.run 'cd /*directory* && ./script_to_run.sh

我特意做了什么(我需要执行一个命令,但只有当已发布的命令成功执行。发布哪个命令取决于minion的角色):

execute script:
  cmd.run:
    - name: *some shell command here*
    - cwd: /*directory*
    - require:
      - file: *some file here*
    {% if 'role_1' in grains['roles'] -%} 
    - onlyif: salt-call publish.publish \* cmd.run 'cd /*other_directory* && ./script_to_run_A.sh'
    {% elif 'role_2' in grains['roles'] -%}
    - onlyif: salt-call publish.publish \* cmd.run 'cd /*other_directory* && ./script_to_run_B.sh'
    {% endif %}

请记住在“对等发布设置”部分的/ etc / salt / master中启用对等通信:

peer:
  .*:
    - .*

这种配置并不安全,因为它可以让所有小兵都能在同伴中执行所有命令,但我还没有找到正确的语法来根据他们的角色选择小兵。

另一个注意事项是,最好创建一个包含cmd.run的自定义命令然后再启用它,因为启用所有节点相互执行任意脚本是不安全的。

这个答案的本质与Dan Garthwaite相同,但我需要的是一个.sls文件的解决方案。