it-swarm.com.ru

Ansible Install MySql 5.7 - установка пароля пользователя root

Я недавно обновил свой бродягу с ubuntu/trusty-64 до bento/ubuntu-16.04 . С этим MySQL был обновлен до 5.7 . Я сделал несколько обновлений для моей книги игр, но я застреваю при установке пароля пользователя root. 

В прошлом (до 5.7) было достаточно: 

- name: MySQL | Set the root password.
  mysql_user: 
    name=root 
    Host=localhost
    password={{ mysql_root_password }}
  become: true

В моей пьесе это проверено попыткой удалить анонимного пользователя.

- 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 }}

Тем не менее, теперь мой playbook не работает на этом этапе, возвращая: 

"Доступ запрещен для пользователя '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'\")"}

Я пробовал несколько вещей: 

  1. Установка пароля пустым для пользователя root mysql_root_password=""
  2. Попытка удалить пользователя root, а затем воссоздать его с помощью Ansible. Я получаю ту же ошибку, вероятно, потому что он пытается действовать от имени пользователя root.
  3. Обновление пароля root в MySQL вручную. - Это также не работает (пароль не распознается), если я не удаляю пользователя root и воссоздаю его со всеми разрешениями. Просто обновление пароля пользователя root, похоже, не изменится.

Мой полный MySQL YAML:

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

Я был в состоянии понять это. Суть проблемы связана с mysql 5.7, использующим auth_socket для пользователя root, когда пароль не предоставлен. Смотрите следующее: " Этот плагин не заботится и не нуждается в пароле. Он просто проверяет, подключается ли пользователь с помощью сокета UNIX, а затем сравнивает имя пользователя. "

В этом случае вы не можете обновить пароль, используя:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('test');

И вместо этого должны использовать:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password='test';

Решение 1: Однако Ansible, начиная с версии 2.0.2, не учитывал это. Я смог обойти это, установив пароль до установки 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
  ...

Тем не менее, это также с тех пор было решено Ansible

Решение 2. Самое простое решение - просто обновить Ansible до 2.2.1

6
Jon Robinson

Из того, что я понимаю, в MySQL изменение пароля root необходимо выполнить для localhost, имени сервера и 127.0.0.1, а также для получения полных привилегий. Что-то в этом духе может помочь (Примечание: я проверял это только на MariaDB , а не 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