Назад | Перейти на главную страницу

Как заставить cmd.run ответить на приглашение в солевом стеке?

У меня есть сценарий соли, который выполняется с state.sls как это:

salt '*' state.sls foo.bar

В моем сценарии есть вот что:

foo-bar:
  cmd.run:
    - php foo.php bar --delete
    - cwd: /srv/foo

В --delete флаг заставит сценарий сначала усечь базу данных. Моя проблема в том, что он задает вопрос и ожидает ввода.

root@host:/srv/foo# php foo.php bar --delete
This is going to remove all data in the database. Are you sure? [y/n]:

Потому что соль не знает, как ответить, что по истечении времени ожидания она прервется и сделает то, чего я не собирался.

В соль документы на cmd.run ничего не сказал об этом, и я не уверен, что именно гуглить. Я знаю, что в реализации Perl я бы использовал для этого Expect.

Как сказать соли, чтобы она отвечала y?

В последних версиях соли вы можете предоставить cmd.run 'stdin':

A string of standard input can be specified for the command to be run using
the ``stdin`` parameter. This can be useful in cases where sensitive
information must be read from standard input.:

    salt '*' cmd.run "grep f" stdin='one\ntwo\nthree\nfour\nfive\n'

Вы можете создать сценарий для этого и запустить его через cmd.script или даже создать собственный модуль Python.