我想在变量更改时触发处理程序。
例如,我在 mysql 配置文件中有 innodb-log-file-size 配置项。更改此项目时,我想执行一些操作:
- 确保 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
我唯一的问题是如何确定配置文件中的变量(实际上是一些特定的文本)已更改。
我对如何解决这个问题的通用方法感兴趣。对于我的特殊情况,我想到了几个解决方案。
编辑 1: 我正在使用模板模块。
您应该能够使用incron d 查看文件的更改。例如(来自链接的文档)
incrontab (5)手册页也很有用,并包含更多示例。
这只能告诉您文件已更改(close_write),它无法告诉您更改了什么。要找出发生了什么变化,我认为您将需要编写一些脚本。
对于纯 Ansible 解决方案,您可以设置
innodb-log-file-size
with lineinfile模块像这样:
然后,您需要为列出的每个操作创建一个处理程序。上面的任务只会在值改变时返回
CHANGED
并触发配置。handlers
innodb_log_file_size
我在这里假设您正在使用
template
模块来创建 mysql 配置。当配置文件中通过 Ansible 设置的任何参数发生更改时,template
模块会返回。模块使您能够触发特定更改的处理程序。CHANGED
lineinfile
然而,这种策略有一个不好的副作用,你不能混合
template
和lineinfile
模块,因为在随后的 Ansible 运行中,这两个任务总是会返回CHANGED
,因此会破坏该剧的幂等性。编辑
在考虑了这个问题之后,我会推荐以下策略:检查 via
command
模块,创建 viatemplate
,通过命令模块再次检查并通知值是否更改。根据从其他答案收到的帮助,我决定将选项移到一个单独的文件中,并在此文件更改时触发 restart+log_expansion。下面是详细信息。
在 /etc/my.cnf 文件中,我添加了:
在角色/mysql/tasks/main.yml 我添加了:
角色/mysql/tasks/expand-innodb-log-file.yml:
角色/mysql/templates/set_innodb_log_file.cnf.j2: