У меня на удаленной системе установлен mysql 5.7. Мне нужно создать новую базу данных и получить доступ нового пользователя к этой базе данных. Поскольку это mysql-community-server 5.7, мне сначала нужно ввести пароль из /var/log/mysqld.log
[root@lamp2 labadmin]# cat /var/log/mysqld.log | grep temporary
2018-01-09T10:57:17.326484Z 1 [Note] A temporary password is generated for
root@localhost: gg%j,opuE3Sm
2018-01-09T10:57:34.471131Z 0 [Note] InnoDB: Creating shared tablespace for
temporary tables
Итак, используя ansible, как мне предоставить root-доступ, поскольку я не могу найти какой-либо модуль для использования этого пароля. Хочу ли я создать для этого сценарий. Я выполнил следующую книгу игр и получил ошибку
- hosts: lamp
remote_user: root
vars:
dbname: wordpressdb
dbuser: wordpressuser
password: REDhat@123
tasks:
- name: installing mysql-python
yum:
name: MySQL-python
state: present
- name: Creating database
mysql_db: name={{ dbname }} state=present
- name: Create db User
mysql_user: name={{ dbuser }} password={{ password }} priv=*.*:ALL
host='localhost' state=present
ошибка:
TASK [Creating database]
*******************************************************
fatal: [52.172.48.12]: FAILED! => {"changed": false, "failed": true, "msg":
"unable to find /root/.my.cnf. Exception message: (1045, \"Access denied
for user 'root'@'localhost' (using password: NO)\")"}
Помогите мне найти решение. Я новичок в ansible. Еще я хочу знать, как сбросить пароль root.
Примечание: я уже скопировал .my.cnf для целевого использования имени пользователя и пароля для входа в mysql. Но я сделал это вручную. Я хочу сначала войти в систему, используя этот временный пароль. Как я могу сделать это возможным
«Свежая» установка MySQL 5.7 позволяет входить в систему локально root с использованием файла сокета (критическим моментом является строка login_unix_socket: /var/run/mysqld/mysqld.sock
в задачах / main.yml)
Несмотря на то, что обходные пути «оболочки», упомянутые в других ответах на этот и аналогичные вопросы, выполняют свою работу - они не идемпотентны и создают «измененное» состояние, что не очень хорошо.
Следующие ниже фрагменты работают полностью идемпотентным образом в Ubuntu 18.04+.
# ...deleted...
- name: Ensure mysql is running and starts on boot
service:
name: mysql
state: started
enabled: yes
become: yes
- name: Ensure mysql root password is updated for all root accounts
mysql_user:
name: root
host: "{{ item }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
password: "{{ mysql.root_db_password }}"
priv: '*.*:ALL,GRANT'
check_implicit_admin: true
loop: "{{ mysql.hosts }}"
become: yes
notify: Restart MySQL
- name: Create `/root/.my.cnf` with root password credentials
template:
src: my.cnf.j2
dest: /root/.my.cnf
owner: root
mode: 0600
become: yes
notify: Restart MySQL
[client]
user=root
password={{ mysql.root_db_password }}
mysql:
root_db_password: REDACTED
hosts:
- "{{ ansible_hostname }}"
- 127.0.0.1
- ::1
- localhost
Как указано в Примечания к модулю mysql_db и mysql_user примечания (тот же текст в обоих):
При передаче учетных данных требуются и login_password, и login_user. Если их нет, модуль попытается прочитать учетные данные из ~ / .my.cnf и, наконец, вернется к использованию учетной записи MySQL по умолчанию «root» без пароля.
Итак, у вас есть несколько вариантов:
Передайте учетные данные задаче
- name: Creating database
mysql_db: name={{ dbname }} state=present login_user={{ DB_USER }} login_password={{ DB_USER_PASS }}
- name: Create db User
mysql_user: name={{ dbuser }} password={{ password }} priv=*.*:ALL
host='localhost' state=present login_user={{ DB_USER }} login_password={{ DB_USER_PASS }}
Замените DB_USER и DB_USER_PASS учетными данными администратора вашей базы данных.
Но это далеко не оптимально, потому что вы должны вводить учетные данные в каждую задачу mysql, и ваши учетные данные должны быть в вашем доступном коде. Ты можешь использовать доступное хранилище чтобы смягчить это, но даже есть варианты получше.
Напиши ~/.my.cnf
файл с учетными данными
Создать или отредактировать ~/.my.cnf
файл в доме пользователя (возможно, root) с учетными данными mysql:
[client]
user=root
password="PASSWORD"
(Возможно, вам потребуется добавить другие детали подключения).
Третий вариант, я не уверен, как он работает в CentOS, но в основном подразумевает, что пользователь root может подключаться к mysql без использования учетных данных. Обычно он полагается на файл /root/-.my.cnf, но в CentOS может отличаться.
После поиска в Google я нашел способ сбросить временный пароль:
- name: Find temporary password
shell: "echo `grep 'temporary.*root@localhost' /var/log/mysqld.log | sed
's/.*root@localhost: //'`"
register: mysql_root_password_temp
tags: register
Set the new password using the temporary password
- name: Set new password from temporary password
shell: 'mysql -e "SET PASSWORD = PASSWORD(''{{ mysql_root_password }}'');"
--connect-expired-password -u root -p"{{ mysql_root_password_temp.stdout
}}"'