Я пытаюсь использовать Ansible для установки MySQL на сервер Debian, но у меня возникают проблемы, несмотря на то, что я прочитал несколько руководств по этому вопросу и посмотрел на некоторые вопросы здесь. Кроме того, я написал тестовый пример и, конечно, отлично работает, и я не могу понять эффективную разницу.
Моя предназначенная версия представляет собой отдельную задачу mysql.yml, которая включена в большую роль. Я бы предпочел не использовать файл.my.cnf, и я не понимаю, нужно ли это строго (я не использую это в своих обычных установках, я вводил пароли другими способами), но в любом случае, он не работает по-другому. Начальная часть этой задачи выглядит так (работа, выполняемая заранее, не имеет особого значения - установка ключей SSH, выборка нескольких файлов и т.д.):
- name: include variable file for MySQL
include_vars:
file: mysql.yml
- name: Set MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{MySQL_root_pass | quote}}' vtype='password'
become: yes
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{MySQL_root_pass | quote}}' vtype='password'
become: yes
- name: Install MySQL packages.
apt: name="{{item}}" state=present
become: yes
with_items:
- default-mysql-server
- default-mysql-client
- python3-mysqldb
- python-mysqldb
- libdbd-mysql-perl
- name: Create a user for the 'library' db
mysql_user:
login_user: root
login_password: '{{ MySQL_root_pass | quote }}'
name: '{{ library_login_user }}'
password: '{{ library_login_pw }}'
priv: 'library.*:ALL,GRANT'
state: present
Это приводит к следующему результату:
TASK [common : include variable file for MySQL] ********************************
ok: [localhost]
TASK [common : Set MySQL root password before installing] **********************
changed: [localhost]
TASK [common : Confirm MySQL root password before installing] ******************
changed: [localhost]
TASK [common : Install MySQL packages.] ****************************************
ok: [localhost] => (item=[u'default-mysql-server', u'default-mysql-client', u'python3-mysqldb', u'python-mysqldb', u'libdbd-mysql-perl'])
TASK [common : Create a user for the 'library' db] *****************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "unable to connect to database, check login_user and login_password are correct or /home/testuser/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"}
Я не понимаю, что когда я пытаюсь вручную войти в MySQL-сервер с правами root, это не позволит мне - я получаю сообщение об ошибке "Отказано в доступе для пользователя" root @@localhost ", пользуюсь ли я пароль, который у меня есть в файле переменных, или пустой пароль. Поэтому я застрял в установке MySQL, которую я не могу использовать.
С другой стороны, я написал изолированную тестовую книгу с почти идентичным кодом, но просто установил пакеты MySQL (а не другие), и когда я запустил это, я могу войти в систему с правами администратора на сервере, используя пароль, установленный в книге воспроизведения:
- name: install MySQL (only)
hosts: localhost
connection: local
vars:
MySQL_root_pass: foobar
tasks:
- name: Set MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{MySQL_root_pass | quote}}' vtype='password'
become: yes
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{MySQL_root_pass | quote}}' vtype='password'
become: yes
- name: Install MySQL packages.
apt: name="{{item}}" state=present
become: yes
with_items:
- default-mysql-server
- default-mysql-client
(Эта версия может работать точно так же, как написано.)
Каков правильный способ сделать это? Почему моя исходная версия не работает так, что версия тестового сценария отсутствует? Во всех случаях я устанавливаю на виртуальную машину, на которой я возвращаюсь к своему снимку начальной установки, прежде чем запускать Ansible, поэтому ничего не осталось от предыдущего прогона.
Если вы используете debian-пакеты с Stretch, учтите, что аутентификация проходит через пользователя ОС:
С уважением,
root
.