AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 813206
Accepted
Mircea Vutcovici
Mircea Vutcovici
Asked: 2016-11-05 04:59:22 +0800 CST2016-11-05 04:59:22 +0800 CST 2016-11-05 04:59:22 +0800 CST

Aciona o manipulador ansible quando uma variável é alterada

  • 772

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.

linux centos7 ansible
  • 3 3 respostas
  • 8341 Views

3 respostas

  • Voted
  1. Best Answer
    user9517
    2016-11-05T05:18:43+08:002016-11-05T05:18:43+08:00

    Você deve ser capaz de observar o arquivo em busca de alterações usando o incron d. Por exemplo (da documentação vinculada)

    _Você precisa executar o programa 'abc' com o caminho completo do arquivo como argumento toda vez que um arquivo for alterado em /var/mail. Uma das soluções segue:

    /var/mail IN_CLOSE_WRITE abc $@/$#  
    

    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.

    • 3
  2. Henrik Pingel
    2016-11-05T05:34:51+08:002016-11-05T05:34:51+08:00

    Para uma solução Ansible pura, você pode definir o módulo innodb-log-file-sizewith lineinfile

    Assim:

    - name: Set innodb-log-file-size for MySQL.
      lineinfile:
        dest: /etc/mysql/my.cnf
        line: 'innodb-log-file-size = {{ innodb_log_file_size }}'
      notify: restart mysql
    

    Você precisaria criar um manipulador para cada ação listada. A tarefa acima só retornaria CHANGEDe acionaria o configurado handlersquando o valor de innodb_log_file_sizemudasse.

    Presumo aqui que você esteja usando templateo módulo para criar a configuração do mysql. templatemódulo retorna CHANGEDquando qualquer parâmetro definido via Ansible no arquivo de configuração é alterado. lineinfileO 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 templatee lineinfilemodular porque nas execuções subseqüentes do Ansible, ambas as tarefas sempre retornariam CHANGEDe, portanto, quebrariam a idempotência do jogo.

    editar

    Depois de pensar um pouco sobre o problema, eu recomendaria a seguinte estratégia: verificar via commandmódulo, criar via template, verificar novamente via módulo de comando e notificar se o valor for alterado.

    - name: Register innodb-log-file-size in my.cnf
      command: grep -Fxq "innodb-log-file-size" /etc/mysql/my.cnf
      register: innodb_log_file_size_pre
      always_run: True
      ignore_errors: True
      changed_when: False
    
    - name: Create my.cnf via template.
      template:
        src: my.cnf.j2
        dest: /etc/mysql/my.cnf
    
    - name: Restart mysql service when innodb_log_file_size changed
      debug: msg="Restart mysql to activate innodb_log_file_size change"
      when: innodb_log_file_size_pre !== innodb_log_file_size
      notify: restart mysql
    
    • 3
  3. Mircea Vutcovici
    2016-11-05T11:51:48+08:002016-11-05T11:51:48+08:00

    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:

    !includedir /etc/my.cnf.d
    

    Em funções/mysql/tasks/main.yml eu adicionei:

    - name: Create /etc/my.cnf.d MySQL config dir
      file: state=directory name=/etc/my.cnf.d owner=mysql group=mysql mode="u=rwx,go=rx" setype=mysqld_etc_t
    
    - name: Configure innodb_log_file
      template: dest=/etc/my.cnf.d/set_innodb_log_file.cnf src=set_innodb_log_file.cnf.j2 backup=yes mode="u=rw,go=r"
      when: innodb_log_file_size_mb is defined
      register: innodb_log_file
    
    - name: Expand innodb_log_file
      include: expand-innodb-log-file.yml
      static: no
      when: innodb_log_file.changed
    

    funções/mysql/tasks/expand-innodb-log-file.yml:

    - name: Stop MySQL
      service: name=mysql state=stopped
    
    - name: Rename old log files
      shell: |
        cd /var/lib/mysql/
        for file in ib_logfile*;do
          mv $file remove-me-$file
        done
      when: mysql_minor_version == 5
    
    - name: Start MySQL
      service: name=mysql state=started
    
    - name: Remove old log files
      shell: rm -f /var/lib/mysql/remove-me-ib_logfile*
      args:
        warn: no
      when: mysql_minor_version == 5
    

    funções/mysql/templates/set_innodb_log_file.cnf.j2:

    [mysqld]
    innodb_log_file_size = {{ innodb_log_file_size_mb }}M
    innodb_log_files_in_group = 2
    
    • 0

relate perguntas

  • Protegendo um novo servidor Ubuntu [fechado]

  • (Soft) RAID 6 no Ubuntu 7.10, devo migrar para 8.10?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve