Назад | Перейти на главную страницу

Ansible: mysql_user не работает для пользователя без полномочий root

Я пытаюсь настроить простой скрипт Ansible для установки MariaDB. Однако по какой-то причине я могу нормально изменить пароль пользователя root, войти в систему как root с новым паролем при следующем запуске, создать базу данных нормально, но если я попытаюсь использовать mysql_user для любого другого пользователя это всегда терпит неудачу.

Пособие:

---
- hosts: all
  become: true
  remote_user: centos
  vars:
    rootpwd: Password1
    replipwd: Password2
    dbname: tests
  tasks:
  - name: Installing packages
    yum: name={{item}} state=latest
    with_items:
     - mariadb
     - mariadb-server
     - mariadb-devel
  - name: Installing Python module
    pip: name=MySQL-python
  - name: Server configuration
    lineinfile: dest=/etc/my.cnf line={{ item }} mode=0644 create=yes
    with_items:
    - bind-address=0.0.0.0
    - log-bin
    - server_d={{ ansible_all_ipv4_addresses[0].split('.')[3] }}
    - log-basename=log{{ ansible_all_ipv4_addresses[0].split('.')[3] }}
  - name: Restarting services
    service: state=restarted name=mariadb enabled=yes
  - name: Securing root account
    mysql_user: name=root password={{ rootpwd }} priv=*.*:ALL state=present
  - name: Client configuration
    lineinfile: dest=/root/.my.cnf line={{ item }} mode=0600 create=yes
    with_items:
    - "[client]"
    - user=root
    - password={{ rootpwd }}
  - name: Making database
    mysql_db: name={{ dbname }} state=present
  - name: Making replication user
    mysql_user: name=replicate password={{ replipwd }} priv="*.*:REPLICATION SLAVE" state=present host="%"

Бегать:

...
TASK [Restarting services] *****************************************************
task path: /home/centos/.ansible/centos-mariadb.playbook:25
changed: [172.30.1.21] => {"changed": true, "enabled": true, "name": "mariadb", "state": "started"}
changed: [172.30.1.38] => {"changed": true, "enabled": true, "name": "mariadb", "state": "started"}

TASK [Securing root account] ***************************************************
task path: /home/centos/.ansible/centos-mariadb.playbook:27
ok: [172.30.1.38] => {"changed": false, "user": "root"}
ok: [172.30.1.21] => {"changed": false, "user": "root"}

TASK [Client configuration] ****************************************************
task path: /home/centos/.ansible/centos-mariadb.playbook:30
ok: [172.30.1.21] => (item=[client]) => {"backup": "", "changed": false, "item": "[client]", "msg": ""}
ok: [172.30.1.38] => (item=[client]) => {"backup": "", "changed": false, "item": "[client]", "msg": ""}
ok: [172.30.1.21] => (item=user=root) => {"backup": "", "changed": false, "item": "user=root", "msg": ""}
ok: [172.30.1.38] => (item=user=root) => {"backup": "", "changed": false, "item": "user=root", "msg": ""}
ok: [172.30.1.21] => (item=password=Password1) => {"backup": "", "changed": false, "item": "password=Password1", "msg": ""}
ok: [172.30.1.38] => (item=password=Password1) => {"backup": "", "changed": false, "item": "password=Password1", "msg": ""}

TASK [Making database] *********************************************************
task path: /home/centos/.ansible/centos-mariadb.playbook:36
ok: [172.30.1.21] => {"changed": false, "db": "tests"}
ok: [172.30.1.38] => {"changed": false, "db": "tests"}

TASK [Making replication user] *************************************************
task path: /home/centos/.ansible/centos-mariadb.playbook:38
fatal: [172.30.1.21]: FAILED! => {"changed": false, "failed": true, "msg": "(1045, \"Access denied for user 'root'@'localhost' (using password: YES)\")"}
fatal: [172.30.1.38]: FAILED! => {"changed": false, "failed": true, "msg": "(1045, \"Access denied for user 'root'@'localhost' (using password: YES)\")"}

NO MORE HOSTS LEFT *************************************************************

Подключение вручную из оболочки работает нормально:

$ sudo mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.50-MariaDB MariaDB Server

Потеряв много часов, я наконец исправил это. Оказывается, в этой строке 3 ошибки:

- name: Securing root account
  mysql_user: name=root password={{ rootpwd }} priv=*.*:ALL state=present host=localhost

Во-первых, вы могли бы подумать priv предоставит root доступ, но фактически удаляет GRANT доступ, поэтому с этого момента вы не можете создавать новых пользователей. Кроме того, вы могли бы подумать, что это ограничивает доступ только к localhost, но на самом деле создает нового пользователя root с доступом к localhost. Наконец, вы можете подумать, что вы меняете пароль для root, но вы устанавливаете его только для одного пользователя, которого вы только что создали с localhost. Есть еще 4 пользователя root с пустыми паролями.

Вот что мне пришлось сделать:

- name: Securing root account
  mysql_user: name=root password={{ rootpwd }} state=present host=localhost
- name: Remove anonymous users
  raw: mysql -e "DELETE FROM mysql.user WHERE user='';"
- name: Set root permission
  raw: mysql -e "DELETE FROM mysql.user WHERE user='root' AND host!='localhost';"