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

SaltStack: Как можно выполнить состояние только один раз?

Я должен выполнить состояние только один раз. Я не мог найти простого способа сделать это.

Теперь контекст

Устанавливаю два сервера MySQL через соль. Я хочу сделать одного рабом другого.

Чтобы настроить ведомое устройство, мне нужно получить информацию о состоянии ведущего устройства в конце установки ведущего устройства:

SHOW MASTER STATUS;

Теперь я могу использовать настраиваемое состояние, выполняя mysql.query функция, чтобы получить это.

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS

Но он будет выполняться каждый раз, когда на моем сервере выполняется highstate. Таким образом, каждый раз давая различную основную информацию.

Я попытался использовать наличие файла как флаг:

/tmp/only_once:
  file.missing: []
mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
    - require:
      - file: /tmp/only_once

Он работает, но я не был доволен, так как теперь у меня каждый раз два состояния отказа.

Мое индивидуальное решение

Я закончил с новым параметром для mystate, flag которые создают файл флагов при первом запуске и успешно возвращаются, если файл существует:

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
    - flag:  /tmp/only_once

И снова вопрос

Тем не менее, я хотел бы знать, можно ли и как можно выполнить состояние только один раз.

Вы можете установить зерно на миньоне, которое указывает, выполнялось ли ранее состояние MySQL. Просто добавьте это в свой штат:

mysql_master_status:
  mystate.query:
    - query: SHOW MASTER STATUS
  grains.present:
    - name: mysql
    - value: master

Затем вы можете обернуть то, что вы хотите запустить только один раз между оператором if:

{% if salt['grains.get']('mysql') != 'master' %}
...
{% endif %}

Преимущество этого метода в том, что теперь вы также можете отслеживать своих миньонов, которые являются мастерами MySQL. Обратной стороной является то, что вам нужно следить за своими зернами, чтобы информация не потерялась.

Я думаю, что проще всего было бы поместить это состояние в другой файл состояния (mysql_master_status.sls) и не ссылаться на него в top.sls. Вместо этого вы выполняете это состояние один раз, используя соль 'target' state.sls mysql_master_status

Томас