我怎样才能 运行 state.sls 从反应堆
How can I run state.sls from a reactor
TL;DR
我想用reactor,调用类似简单的东西salt '*' state.sls examplestate
我是 saltstack 反应堆的新手,我遇到了其中一项功能的问题。
在位于 here 的反应器文档中,在 "Advanced State System Capabilities" 下,有以下示例:
/etc/salt/master.d/reactor.conf
# A custom event containing: {"foo": "Foo!", "bar: "bar*", "baz": "Baz!"}
reactor:
- myco/custom/event:
- /srv/reactor/some_event.sls
/srv/reactor/some_event.sls
invoke_orchestrate_file:
runner.state.orchestrate:
- mods: orch.do_complex_thing
- pillar:
event_tag: {{ tag }}
event_data: {{ data | json() }}
/srv/salt/orch/do_complex_thing.sls
{% set tag = salt.pillar.get('event_tag') %}
{% set data = salt.pillar.get('event_data') %}
# Pass data from the event to a custom runner function.
# The function expects a 'foo' argument.
do_first_thing:
salt.runner:
- name: custom_runner.custom_function
- foo: {{ data.foo }}
# Wait for the runner to finish then send an execution to minions.
# Forward some data from the event down to the minion's state run.
do_second_thing:
salt.state:
- tgt: {{ data.bar }}
- sls:
- do_thing_on_minion
- pillar:
baz: {{ data.baz }}
- require:
- salt: do_first_thing
在这个例子中,假设我没看错,reactor event
会触发位于 reactor 目录中的 some_event.sls
。 some_event.sls
然后使用 runner.state.orchestrate 到 运行 do_complex_thing.sls
.
我正在尝试做的事情非常相似,但我无法让它发挥作用。我想让反应堆 event
引爆 some_event.sls
。在 some_event.sls 中,我只想调用我编写的状态。例如,使用 file.managed 将文件从 master 移动到 minion 的简单状态。我在下面尝试过:
/etc/salt/master.d/reactor.conf
reactor:
- 'salt/netapi/hook/test':
- /srv/reactor/testdirectory/configure.sls
/srv/reactor/testdirectory/configure.sls
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
salt.state:
- mods: transferfile.init
- tgt: {{ postdata.tgt }}
{% endif %}
/srv/salt/transferfile/init.sls
/root/testfile.txt:
file.managed:
- source: salt://testfiles/testfile.txt
- makedirs: True
- mode: 700
- template: jinja
在 configure.sls 文件中,我正在尝试使用 salt.state 来启动 state.sls,这无法解决错误 "ReactWrap" object has no attribute salt
当我尝试做同样的事情,但使用原始示例中的 runner.state.orchestrate(我不需要编排)时,它起作用了,但它会将文件移动到我的主机上的 /root/。
我不确定除了 salt.state 之外还能用什么来 运行 state.sls。感谢您的帮助。
我想你想要这个:
/srv/reactor/testdirectory/configure.sls
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
local.state.sls:
- tgt: {{ postdata.tgt }}
- arg:
- transferfile
{% endif %}
我让它工作的方法是将 /srv/reactor/testdirectory/configure.sls
更改为以下内容:
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
local.state.apply:
- tgt: {{ postdata.tgt }}
- arg:
- transferfile
现在一切正常。
TL;DR
我想用reactor,调用类似简单的东西salt '*' state.sls examplestate
我是 saltstack 反应堆的新手,我遇到了其中一项功能的问题。
在位于 here 的反应器文档中,在 "Advanced State System Capabilities" 下,有以下示例:
/etc/salt/master.d/reactor.conf
# A custom event containing: {"foo": "Foo!", "bar: "bar*", "baz": "Baz!"}
reactor:
- myco/custom/event:
- /srv/reactor/some_event.sls
/srv/reactor/some_event.sls
invoke_orchestrate_file:
runner.state.orchestrate:
- mods: orch.do_complex_thing
- pillar:
event_tag: {{ tag }}
event_data: {{ data | json() }}
/srv/salt/orch/do_complex_thing.sls
{% set tag = salt.pillar.get('event_tag') %}
{% set data = salt.pillar.get('event_data') %}
# Pass data from the event to a custom runner function.
# The function expects a 'foo' argument.
do_first_thing:
salt.runner:
- name: custom_runner.custom_function
- foo: {{ data.foo }}
# Wait for the runner to finish then send an execution to minions.
# Forward some data from the event down to the minion's state run.
do_second_thing:
salt.state:
- tgt: {{ data.bar }}
- sls:
- do_thing_on_minion
- pillar:
baz: {{ data.baz }}
- require:
- salt: do_first_thing
在这个例子中,假设我没看错,reactor event
会触发位于 reactor 目录中的 some_event.sls
。 some_event.sls
然后使用 runner.state.orchestrate 到 运行 do_complex_thing.sls
.
我正在尝试做的事情非常相似,但我无法让它发挥作用。我想让反应堆 event
引爆 some_event.sls
。在 some_event.sls 中,我只想调用我编写的状态。例如,使用 file.managed 将文件从 master 移动到 minion 的简单状态。我在下面尝试过:
/etc/salt/master.d/reactor.conf
reactor:
- 'salt/netapi/hook/test':
- /srv/reactor/testdirectory/configure.sls
/srv/reactor/testdirectory/configure.sls
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
salt.state:
- mods: transferfile.init
- tgt: {{ postdata.tgt }}
{% endif %}
/srv/salt/transferfile/init.sls
/root/testfile.txt:
file.managed:
- source: salt://testfiles/testfile.txt
- makedirs: True
- mode: 700
- template: jinja
在 configure.sls 文件中,我正在尝试使用 salt.state 来启动 state.sls,这无法解决错误 "ReactWrap" object has no attribute salt
当我尝试做同样的事情,但使用原始示例中的 runner.state.orchestrate(我不需要编排)时,它起作用了,但它会将文件移动到我的主机上的 /root/。
我不确定除了 salt.state 之外还能用什么来 运行 state.sls。感谢您的帮助。
我想你想要这个:
/srv/reactor/testdirectory/configure.sls
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
local.state.sls:
- tgt: {{ postdata.tgt }}
- arg:
- transferfile
{% endif %}
我让它工作的方法是将 /srv/reactor/testdirectory/configure.sls
更改为以下内容:
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
local.state.apply:
- tgt: {{ postdata.tgt }}
- arg:
- transferfile
现在一切正常。