2016-07-18 2 views
0

TL; DRКак я могу запустить state.sls из реактора

Я хочу использовать реактор, чтобы назвать что-то похожее на простой salt '*' state.sls examplestate


Я новичок (МОГ) к реакторам с солью, и у меня проблемы с одной из функций.

В документах реакторных расположенных here, в разделе "Advanced System State, возможностей", есть следующий пример:

/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 оттеняет some_event.sls находится в каталоге реактора. Затем some_event.sls использует runner.state.orchestrate для запуска do_complex_thing.sls.

То, что я пытаюсь сделать, очень похоже, но я не смог заставить его работать. Я бы хотел, чтобы реактор event отправился some_event.sls. В some_event.sls мне просто хотелось бы назвать состояние, которое я написал. Например, простое состояние, которое использует file.managed для перемещения файла от ведущего к миниатюре. Я попытался это ниже:

/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. Любая помощь приветствуется.

ответ

1

Я думаю, что вы хотите, это:

/SRV/реактора/testdirectory/Configure.СЛС

{% set postdata = data.get('post', {}) %} 
{% if grains['os_family']=="Debian" %} 
testifthisworks: 
    local.state.sls: 
    - tgt: {{ postdata.tgt }} 
    - arg: 
     - transferfile 
{% endif %} 
+0

Я пробовал, что и это не сработало (не знаю почему), но у Whytewolf был ответ на IRC. Я отправлю ответ ниже. +1 для добавления local.state.sls. – trueCamelType

+1

Вы можете попробовать удалить строку 'mods' из моего примера и добавить 2 строки раздела' arg', которые вы имеете в следующем примере. Я уверен, что вам не нужен '.init' –

+0

Правильно, я удалил .init (он отлично работает с ним, но да, он не нужен), и он работает так же хорошо , Спасибо за помощь – trueCamelType

1

Как я получил это, чтобы работать было изменить /srv/reactor/testdirectory/configure.sls к следующим:

{% set postdata = data.get('post', {}) %} 
{% if grains['os_family']=="Debian" %} 
testifthisworks: 
    local.state.apply: 
    - tgt: {{ postdata.tgt }} 
    - arg: 
     - transferfile 

А теперь все работает.

Смежные вопросы