TL; DR
我想使用reactor来调用类似于简单salt '*' state.sls examplestate
我是新的(ish)反盐堆反应堆,我遇到了其中一个功能的问题。
在位于here的反应堆文件中,在"高级状态系统功能"下,有以下示例:
/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
在此示例中,假设我正确地跟踪它,反应堆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。任何帮助表示赞赏。
答案 0 :(得分:2)
我想你想要这个:
/srv/reactor/testdirectory/configure.sls
//------------------------ Machinery:
#include <tuple>
template< class Ret, class... Args >
std::tuple<Args...> m( Ret(Args...) );
//------------------------- Example:
#include <iostream>
#include <typeinfo>
void foo( double );
using namespace std;
auto main()
-> int
{
using Args_tuple = decltype( m( foo ) );
cout << typeid( Args_tuple ).name() << endl;
}
答案 1 :(得分:2)
我实现此目的的方法是将/srv/reactor/testdirectory/configure.sls
更改为以下内容:
{% set postdata = data.get('post', {}) %}
{% if grains['os_family']=="Debian" %}
testifthisworks:
local.state.apply:
- tgt: {{ postdata.tgt }}
- arg:
- transferfile
现在一切正常。