. У меня установлен mysql 5.7 на моей удаленной системе. Мне нужно создать новую базу данных и новый пользовательский доступ к этой базе данных. . Так как это mysql-community-server 5.7, изначально мне нужно ввести пароль grep из /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
error:
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)\")"}
Помогите мне найти решение. Я новичок в доступе. Также я хочу знать, как сбросить пароль root.
Примечание: я уже скопировал. my.cnf, чтобы указать имя пользователя и пароль для входа в mysql. но я сделал это вручную. Я хочу сначала войти в систему, используя этот временный пароль. Как я могу сделать это возможным
Как указано в примечаниях к модулю mysql_db и примечаниях mysql_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
}}"'
«Свежая» установка 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