Ansible: Как изменить пароль root для сервера MySQL путем повторной инициализации сервера

14

Я снабдил свой сервер Ansible playbook. Я использовал пьесу root / bedrock-Ansible .

Одной из задач было настроить сервер MySQL вместе с паролем пользователя root MySQL.

Теперь мне нужно срочно сменить этот пароль. Шаги, которые я предпринял:

  1. Я обновил переменные для Ansible ролей
  2. Я выполнил команду ansible-playbook -i hosts/staging server.ymlдля повторной подготовки сервера

Все задачи были выполнены, как и ожидалось (без изменений), но скрипт завершился неудачно [mariadb | Set root user password]с этим сообщением:

msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

Я предполагаю, что после того, как пароль root MySQL был установлен, повторная настройка сервера не может изменить этот пароль.

Можно ли вообще изменить пароль root MySQL, повторно предоставив сервер Ansible? Какие у меня варианты?

luqo33
источник

Ответы:

15

Проблема, с которой вы столкнулись, заключается в том, что Ansible пытается использовать для входа в систему тот же пароль root, который вы хотите изменить:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_root_password }}"
              state=present

Очевидно, что это никогда не сработает, если вы хотите использовать эту игру, чтобы изменить ее.

Вместо этого вы должны изменить вышеприведенную игру на что-то вроде:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_old_root_password }}"
              state=present

А затем обновите соответствующие файлы инвентаризации, чтобы добавить эту новую переменную.

Итак, group_vars/productionтеперь вы должны содержать:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Похоже, что эта книга воспроизведения использует пароль root в обеих roles/mariadb/tasks/main.ymlкнигах, а также roles/wordpress-setup/tasks/database.yml, возможно, вы захотите запустить всю server.ymlкнигу, чтобы убедиться, что она установлена ​​правильно.

ydaetskcoR
источник
Большое спасибо за отличный ответ. Это определенно путь. В итоге я сбросил пароль администратора в консоли mysqladmin- но это было до того, как я увидел ваш ответ
luqo33
7

Вы можете неправильно использовать ~ / .my.cnf для возможности изменения пароля mysql-root.

Хитрость заключается в том, чтобы иметь задачу «Установить пароль root» (номер 1), которая будет устанавливать пароль. После этого у вас есть задача, которая создает ~ / .my.cnf с правильными учетными данными (номер 2).

В новой системе ~ / .my.cnf отсутствует. Задача №1 создаст пользователя mysql-root с заданными учетными данными. В существующей системе учетные данные из ~ / .my.cnf используются для входа в систему и установки пароля для mysql_root_password . Задача №2 создаст ~ / .my.cnf или перезапишет существующие старые учетные данные ~ / .my.cnf новыми.

Большим преимуществом этого подхода является наличие только одной переменной «mysql_root_password», которая всегда является правильной с точки зрения playbook. В существующих системах ~ / .my.cnf является своего рода хранилищем текущих локальных учетных данных mysql.

- name: Set root user password
  # If .my.cnf already exists, this will cause an mysql-root-password update.
  mysql_user:
    name: root
    password: "{{ mysql_root_password}}"
    check_implicit_admin: true

- name: Create .my.cnf
  template:
   src: "client.my.cnf.j2"
   dest: "/root/.my.cnf"
   owner: root
   group: root
   mode: 0600

с client.my.cnf.j2:

[client]
user=root
password={{ mysql_root_password }}

дальнейшее чтение

Соответствующие заметки из ansible-mysql_user_module-Documentation :

  • Note1:

    Чтобы защитить этого пользователя как часть идемпотентной пьесы, вы должны создать как минимум две задачи: первая должна изменить пароль пользователя root, не предоставляя никаких данных login_user / login_password. Второй должен удалить файл ~ / .my.cnf, содержащий новые корневые учетные данные. Последующие запуски книги воспроизведения завершатся успешно, прочитав новые учетные данные из файла. ansible-mysql_user_module, примечания

  • Заметка 2:

    Когда вы передаете учетные данные, необходимы и login_password, и login_user. Если их нет, модуль попытается прочитать учетные данные из ~ / .my.cnf и, наконец, вернется к использованию имени пользователя MySQL по умолчанию «root» без пароля. ansible-mysql_user_module, примечания

Маркус Шульте
источник
Мне очень нравится этот подход, и он намного лучше, чем версия в моем ответе. Вероятно, это должен быть принятый ответ.
ydaetskcoR
2
Это удобно, но во многих системах на самом деле создано 4 «корневых» пользователя с хостами 127.0.0.1, localhost, :: 1 и любым локальным именем хоста. Вышеуказанное только изменяет root @ localhost, оставляя три другие учетные записи root с пустыми паролями.
Робо
Список всех пользователей , корневые: mysql --database mysql --execute "select host from user where user = 'root';". Этот пост аналогичен этому ответу, но содержит код для установки всех паролей.
Хловдал
2

Для следующего человека, который приходит искать ответы здесь. Хотя принятый ответ верен, вы должны быть очень усердными, если вы используете MySQL 5.7, потому что в mysqld не разрешен анонимный вход в демонизированный режим (сервис). Вместо этого вы ДОЛЖНЫ очистить /var/log/mysqld.log для ВРЕМЕННОГО пароля, который кто-то решил создать, и использовать его в login_password = ydaetskcoR. Эту функцию они решили реализовать в версии 5.7 репозитория dev, поэтому, если вы хотите избежать этого, используйте более старую версию (5.6).

Документация здесь: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-instances-with-ease/

einarc
источник
1

Существует Ansible playbook, используемый для укрепления MySQL.

https://github.com/dev-sec/ansible-mysql-hardening

Это не только изменило пароль root, но также выполняет некоторые дополнительные действия по усилению защиты сервера.

Посмотрите на файл readme.

ww12z
источник
Не похоже, что он обрабатывает изменение пароля root, когда он пуст.
flickerfly