SaltStack: Como alguém pode executar um estado apenas uma vez?

7

Eu tenho que executar um estado apenas uma vez. Não consegui encontrar uma maneira simples de fazer isso.

Agora, o contexto

Eu instalo dois servidores MySQL através do sal. Eu quero fazer um escravo do outro.

Para configurar o escravo, eu preciso obter as informações de status do mestre no final da instalação principal:

SHOW MASTER STATUS;

Agora, posso usar um estado personalizado executando a função mysql.query para obtê-lo.

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

Mas ele será executado toda vez que o highstate for executado para o meu servidor. Assim, dando informações mestre diferentes de cada vez.

Eu tentei usar a existência de um arquivo como sinalizador:

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

Está funcionando, mas eu não estava feliz, pois agora tenho dois estados com falha toda vez.

Minha solução personalizada

Acabei com um novo parâmetro para mystate , flag que cria um arquivo de sinalizador na primeira vez em que é executado e retorna com êxito se o arquivo existir:

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

E a pergunta novamente

Ainda assim, eu gostaria de saber se, e como, alguém executaria um estado apenas uma vez.

    
por Christophe Drevet-Droguet 13.12.2013 / 14:54

2 respostas

14

Você pode definir um grão no servo que indica se o estado do MySQL foi executado antes. Basta adicionar isso ao seu estado:

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

Em seguida, você pode agrupar itens em seu estado que deseja executar apenas uma vez entre uma declaração if:

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

A vantagem deste método é que agora você também pode acompanhar seus Minions que são MySQL-Masters. A desvantagem é que você deve ficar de olho nos grãos para que as informações não sejam perdidas.

    
por 18.02.2014 / 15:31
2

Eu acho que a maneira mais fácil seria colocar esse estado em outro arquivo de estado (mysql_master_status.sls) e não fazer referência a ele no top.sls. Em vez disso, você executa esse estado uma vez usando salt 'target' state.sls mysql_master_status

Thomas

    
por 18.12.2013 / 08:39

Tags