Eu gostaria de acionar um manipulador quando uma variável é alterada.
Por exemplo, eu tenho no arquivo de configuração mysql o item de configuração innodb-log-file-size. Eu gostaria de fazer algumas ações quando este item for alterado:
- garantir que o MySQL esteja em execução (devemos começar a partir de um estado estável)
- execute no mysql: SET GLOBAL innodb_fast_shutdown = 0
- pare o MySQL
- mova /var/lib/mysql/ib_logfile[01] para uma pasta de backup
- iniciar MySQL
- verifique se o MySQL está funcionando bem executando uma consulta MySQL
Veja também: https://dba.stackexchange.com/a/1265/3574
O único problema que tenho é como posso determinar que uma variável (na verdade algum texto específico) foi alterada no arquivo de configuração.
Estou interessado em uma abordagem genérica de como resolver esse problema. Para o meu caso particular, tenho em mente algumas soluções.
Editar 1: estou usando o módulo de modelo.
Você deve ser capaz de observar o arquivo em busca de alterações usando o incron d. Por exemplo (da documentação vinculada)
A página man do incrontab(5) também é útil e contém mais exemplos.
Isso só poderá informar que o arquivo foi alterado (close_write) e não poderá informar o que foi alterado. Para descobrir o que foi alterado, acho que você precisará escrever alguns scripts.
Para uma solução Ansible pura, você pode definir o módulo
innodb-log-file-size
with lineinfileAssim:
Você precisaria criar um manipulador para cada ação listada. A tarefa acima só retornaria
CHANGED
e acionaria o configuradohandlers
quando o valor deinnodb_log_file_size
mudasse.Presumo aqui que você esteja usando
template
o módulo para criar a configuração do mysql.template
módulo retornaCHANGED
quando qualquer parâmetro definido via Ansible no arquivo de configuração é alterado.lineinfile
O módulo permite acionar manipuladores para uma alteração específica.Essa estratégia tem, no entanto, o efeito colateral ruim de que você não pode misturar
template
elineinfile
modular porque nas execuções subseqüentes do Ansible, ambas as tarefas sempre retornariamCHANGED
e, portanto, quebrariam a idempotência do jogo.editar
Depois de pensar um pouco sobre o problema, eu recomendaria a seguinte estratégia: verificar via
command
módulo, criar viatemplate
, verificar novamente via módulo de comando e notificar se o valor for alterado.Com base na ajuda recebida das outras respostas, decidi mover a opção em um arquivo separado e acionar o restart+log_expansion quando esse arquivo for alterado. Abaixo estão os detalhes.
No arquivo /etc/my.cnf, adicionei:
Em funções/mysql/tasks/main.yml eu adicionei:
funções/mysql/tasks/expand-innodb-log-file.yml:
funções/mysql/templates/set_innodb_log_file.cnf.j2: