Я должен выполнить состояние только один раз. Я не мог найти простого способа сделать это.
Устанавливаю два сервера 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
Томас