web-dev-qa-db-fra.com

Ansible Install MySql 5.7 - Définition du mot de passe de l'utilisateur racine

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: 

  1. Définition du mot de passe vide pour l'utilisateur root mysql_root_password=""
  2. Essayez de supprimer l’utilisateur root puis recréez-le avec Ansible. Je reçois la même erreur probablement parce qu’il essaie d’agir chez l’utilisateur root.
  3. Mettre à jour manuellement le mot de passe root dans mysql. - Cela ne semble pas non plus fonctionner (le mot de passe n'est pas reconnu), sauf si je supprime l'utilisateur root et le recrée avec toutes les autorisations. Le simple fait de mettre à jour le mot de passe de l'utilisateur root ne semble pas avoir changé.

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
5
Jon Robinson

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

6
Jon Robinson

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
0
rahuL