MySQL "my.cnf" variables not updating after Ansible run

JonnySerra asked:

i’m creating a simple Ansible playbook for my Project where i’m installing MySQL on an Ubuntu VM.

As part of this setup i’m creating a custom my.cnf file in /etc/my.cnf and it looks like this after the jinja2 template is done parsing it.

port   = 3306
socket = /var/run/mysqld/mysqld.sock

socket           = /var/run/mysqld/mysqld.sock
log_error        = /var/log/mysql/mysql_error.log
pid-file         = /var/run/mysqld/
general_log      = on
general_log_file = /var/log/mysql/mysql.log

bind-address     =
datadir          = /var/lib/mysql
pid-file         = /var/run/mysqld/
log_error        = /var/log/mysql/mysql_error.log
general_log      = on
general_log_file = /var/log/mysql/mysql.log
socket           = /var/run/mysqld/mysqld.sock
user             = root
port             = 3306

# Disabling Symlinks is recommended for security purposes #

Next, since i’m running Ubuntu i call

service: name=mysql state=started enabled=yes

And everything appears correct, but when i check my variables using

mysqld --verbose --help i find that the variables are wrong, for instance it says general-log is false and symbolic-links is TRUE even though i set it to 0 in this cnf file, same if i run mysql show variables

So, i’ve check that the file exists and is in etc/my.cnf and that it is loaded as mysql --verbose --help reports

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

Might it be a user permissions issue? I believe this my.cnf file belongs to the root user this might be the cause of the issue.

What i really need is some help debugging what might be going wrong as i’m relatively new to this kind of low level MySQL configuration.

Thank you in advance

My answer:

You’re on Ubuntu, which automatically starts services after installation. Thus at the time you ask for it to be enabled and started, it has already been enabled and started. And of course if you run the playbook again while it’s running, it’s already started…

What you need to do is to set up a handler that will restart the service. For instance:

$ cat roles/mysql/handlers/main.yml
- name: restart mysql
  service: name=mysql state=restarted

Then be sure to notify: restart mysql in any task that changes the configuration.

View the full question and any other answers on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.