如何从反应堆运行state.sls

时间:2016-07-18 17:56:45

标签: ubuntu-14.04 webhooks salt-stack

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.slssome_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。任何帮助表示赞赏。

2 个答案:

答案 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

现在一切正常。