当一个variables被改变时触发一个可信的处理程序

我想在variables发生变化时触发一个处理程序。

例如,我在MySQLconfiguration文件中有innodb-log-file-sizeconfiguration项。 这个项目改变时,我想做几个动作:

  • 确保MySQL正在运行(我们必须从一个稳定的状态开始)
  • 在mysql中运行:SET GLOBAL innodb_fast_shutdown = 0
  • 停止MySQL
  • 将/ var / lib / mysql / ib_logfile [01]移动到备份文件夹
  • 启动MySQL
  • 通过运行MySQL查询来检查MySQL是否正常运行

另见: https : //dba.stackexchange.com/a/1265/3574

我唯一的问题是如何确定一个variables(实际上是一些特定的文本)在configuration文件中被更改。

我对如何解决这个问题的通用方法感兴趣。 对于我的具体情况,我想到了一些解决scheme。

编辑1:我正在使用模板模块。

您应该能够使用incron d来观察文件的更改。 例如(从链接的文件)

_每次在/ var / mail中更改文件时,都需要以完整文件path作为参数运行程序“abc”。 其中一个解决scheme如下:

/var/mail IN_CLOSE_WRITE abc $@/$# 

有incrontab(5)手册页也是有用的,并包含更多的例子。

这将只能告诉你,文件已经改变(close_write),它将无法告诉你什么改变了。 要找出发生了什么变化,我认为你将需要写一些脚本。

对于纯Ansible解决scheme,您可以使用lineinfile模块设置innodb-log-file-size

喜欢这个:

 - 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 

然后,您需要为列出的每个操作创build一个处理程序。 上面的任务只会返回CHANGED并在innodb_log_file_size发生变化时触发configuration的handlers

我假设你正在使用template模块来创buildmysqlconfiguration。 当在configuration文件中通过Ansible设置的任何参数CHANGED时, template模块返回CHANGEDlineinfile模块使您能够触发处理程序进行特定更改。

然而这个策略有不好的副作用,你不能混合使用templatelineinfile模块,因为在随后的Ansible运行中,这两个任务总是返回CHANGED ,因此打破了play的幂等性。

编辑

在思考了一下这个问题之后,我会推荐以下策略:通过command模块检查,通过template创build,通过命令模块再次检查,并通知值是否改变。

 - 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 

根据从其他答案中收到的帮助,我决定将该选项移动到单独的文件中,并在更改此文件时触发重新启动+ log_expansion。 贝娄是细节。

在/etc/my.cnf文件中,我添加了:

 !includedir /etc/my.cnf.d 

在angular色/ mysql /任务/ main.yml我补充说:

 - 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 

angular色/ MySQL的/任务/扩展,InnoDB的日志 – 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 

angular色/ MySQL的/模板/ set_innodb_log_file.cnf.j2:

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