J'ai récemment mis à niveau mon vagabond de ubuntu/trusty-64 à bento/ubuntu-16.04 . Avec cela, MySQL a été mis à jour à 5.7 . J'ai apporté plusieurs mises à jour à mon playbook, mais je reste bloqué lors de la définition du mot de passe de l'utilisateur root.
Dans le passé (avant le 5.7), il suffisait de:
- name: MySQL | Set the root password.
mysql_user:
name=root
Host=localhost
password={{ mysql_root_password }}
become: true
Dans mon playbook, ceci est testé en essayant de supprimer un utilisateur anonyme.
- name: MySQL | Delete anonymous MySQL server user for {{ server_hostname }}
mysql_user:
name=""
Host="{{ server_hostname }}"
state="absent"
login_user=root
login_password={{ mysql_root_password }}
Cependant, mon livre de lecture échoue à cette étape et renvoie:
"Accès refusé pour l'utilisateur 'root' @ 'localhost'"
TASK [mysql : MySQL | Delete anonymous MySQL server user for vagrant] **********
task path: /Users/jonrobinson/vagrant/survey/playbooks/roles/mysql/tasks/mysql.yml:51
fatal: [vagrant]: FAILED! => {"changed": false, "failed": true, "msg": "unable to connect to database, check login_user and login_password are correct or /home/vagrant/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"}
J'ai essayé plusieurs choses:
mysql_root_password=""
Mon YAML MySQL complet:
---
- name: MySQL | install mysql packages
apt: pkg={{ item }} state=installed
become: true
with_items:
- mysql-client
- mysql-common
- mysql-server
- python-mysqldb
- name: MySQL | create MySQL configuration file
template:
src=my.cnf.j2
dest=/etc/mysql/my.cnf
backup=yes
owner=root
group=root
mode=0644
become: true
- name: MySQL | create MySQLD configuration file
template:
src=mysqld.cnf.j2
dest=/etc/mysql/conf.d/mysqld.cnf
backup=yes
owner=root
group=root
mode=0644
become: true
- name: MySQL | restart mysql
service: name=mysql state=restarted
become: true
- name: MySQL | Set the root password.
mysql_user:
name=root
Host=localhost
password={{ mysql_root_password }}
become: true
- name: MySQL | Config for easy access as root user
template: src=mysql_root.my.cnf.j2 dest=/root/.my.cnf
become: true
- name: MySQL | Config for easy access as root user
template: src=mysql_root.my.cnf.j2 dest={{ home_dir }}/.my.cnf
when: "'{{ user }}' != 'root'"
- name: MySQL | Delete anonymous MySQL server user for {{ server_hostname }}
mysql_user: name="" Host="{{ server_hostname }}" state="absent" login_user=root login_password={{ mysql_root_password }}
- name: MySQL | Delete anonymous MySQL server user for localhost
mysql_user: name="" state="absent" Host=localhost login_user=root login_password={{ mysql_root_password }}
- name: MySQL | Secure the MySQL root user for IPV6 localhost (::1)
mysql_user: name="root" password="{{ mysql_root_password }}" Host="::1" login_user=root login_password={{ mysql_root_password }}
- name: MySQL | Secure the MySQL root user for IPV4 localhost (127.0.0.1)
mysql_user: name="root" password="{{ mysql_root_password }}" Host="127.0.0.1" login_user=root login_password={{ mysql_root_password }}
- name: MySQL | Secure the MySQL root user for localhost domain (localhost)
mysql_user: name="root" password="{{ mysql_root_password }}" Host="localhost" login_user=root login_password={{ mysql_root_password }}
- name: MySQL | Secure the MySQL root user for {{ server_hostname }} domain
mysql_user: name="root" password="{{ mysql_root_password }}" Host="{{ server_hostname }}" login_user=root login_password={{ mysql_root_password }}
- name: MySQL | Remove the MySQL test database
mysql_db: db=test state=absent login_user=root login_password={{ mysql_root_password }}
- name: MySQL | create application database user
mysql_user: name={{ dbuser }} password={{ dbpass }} priv=*.*:ALL Host='%' state=present login_password={{ mysql_root_password }} login_user=root
- name: MySQL | restart mysql
service: name=mysql state=restarted
become: true
J'ai été capable de comprendre. L'essentiel du problème concernait l'utilisation de mysql 5.7 avec auth_socket pour l'utilisateur root sans mot de passe. Voir ce qui suit: " Ce plug-in importe peu et n'a pas besoin de mot de passe. Il vérifie simplement si l'utilisateur se connecte à l'aide d'un socket UNIX, puis compare le nom d'utilisateur. " "
Dans ce cas, vous ne pouvez pas mettre à jour le mot de passe en utilisant:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('test');
Et à la place doit utiliser:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password='test';
Solution 1: Cependant, Ansible, à partir de la version 2.0.2, ne tenait pas compte de cela. J'ai pu contourner ce problème en définissant le mot de passe avant l'installation de MySql
- name: Specify MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_password | quote}}' vtype='password'
become: true
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_password | quote}}' vtype='password'
become: true
- name: MySQL | install mysql packages
apt: pkg={{ item }} state=installed
become: true
with_items:
- mysql-client
- mysql-common
- mysql-server
- python-mysqldb
...
Cependant, Ansible a également répondu à cette question depuis)
Solution 2: La solution la plus simple consiste simplement à mettre à jour Ansible vers la version 2.2.1
D'après ce que j'ai compris, dans MySQL, il est nécessaire de modifier le mot de passe root pour localhost
, le nom d'hôte du serveur et le 127.0.0.1
, ainsi que pour l'ensemble des privilèges. Quelque chose dans ce sens peut aider (Note: je l’ai seulement testé sur MariaDB , et non MySQL ):
tasks:
- name: Set a new root password
mysql_user: check_implicit_admin=yes
login_user=root
login_password={{ mysql_root_password }}
user=root
password={{ NEW_mysql_root_password }}
Host={{ item }}
priv='*.*:ALL,GRANT'
with_items:
- localhost
- 127.0.0.1
- {{ server_hostname }}
notify:
- restart_mariadb
handlers:
- name: restart_mariadb
service: name=mariadb
state=restarted