我需要在另一个小兵身上执行一个脚本。最好的解决方案似乎是Peer Publishing,但the only documentation我能够找到只显示如何通过CLI完成它。
如何在模块中定义以下内容?
salt-call system.example.com publish.publish '*' cmd.run './script_to_run'
答案 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文件的解决方案。