J'ai installé MySQL 5.7 sur mon systémètre distant. Je dois créer une nouvelle base de données et un nouvel accès utilisateur à cette base de données. Comme il s'agit de MySQL-Community-Server 5.7 Initialement, j'ai à l'origine du mot de passe Grep de /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
Donc, en utilisant un ansible Comment puis-je donner un accès root car je ne trouve aucun module d'utiliser ce mot de passe. Je veux créer un script pour cela. J'ai exécuté le livre de lecture suivant et j'ai eu une erreur
- 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
erreur:
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)\")"}
Aidez-moi à trouver une solution.iam Nouveau sur Ansible.Leso Je veux savoir comment réinitialiser le mot de passe root.
Remarque: j'ai déjà copié .My.cnf pour cibler le nom d'utilisateur et le mot de passe containting pour mysql login.but je l'ai fait manulemment.Je veux vous connecter à l'aide de ce mot de passe temporaire à la première.Comment puis-je le rendre possible
L'installation 'fraîche' de MySQL 5.7 permet des connexions racines locales à l'aide du fichier de prise (point crucial est la ligne login_unix_socket: /var/run/mysqld/mysqld.sock
dans les tâches/main.yml)
Malgré les solutions de contournement "Shell" mentionnées dans d'autres réponses pour cette question et des questions similaires font leur travail - ils ne sont pas idempotents et produisent l'état "changé" qui n'est pas bon.
Les extraits suivants fonctionnent de manière totalement idappotante sur 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
Comme indiqué dans la Notes de module MySQL_DB et mysql_user notes (même texte dans les deux):
Login_Password et Login_User sont nécessaires lorsque vous passez des informations d'identification. Si aucun n'est présent, le module tentera de lire les informations d'identification de ~/.my.cnf et de revenir enfin à l'aide de la connexion par défaut MySQL de 'root' sans mot de passe.
Donc, vous avez plusieurs options:
Passez les informations d'identification à la tâche
- 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 }}
Remplacez db_user et db_user_pass avec vos identifiants d'administrateur d'utilisateur DB.
Mais c'est loin d'optimal, car vous devez mettre des informations d'identification dans chaque tâche MySQL et que vos informations d'identification devraient être dans votre code ansible. Vous pouvez utiliser Vault ansible pour atténuer cela, mais même qu'il y a de meilleures options.
Écrivez un ~/.my.cnf
Fichier avec des informations d'identification
Créer ou éditer ~/.my.cnf
Fichier dans la maison de l'utilisateur (probablement root) avec des informations d'identification MySQL:
[client]
user=root
password="PASSWORD"
(Vous devrez peut-être ajouter d'autres détails de connexion).
La troisième option Je ne suis pas sûr de savoir comment cela fonctionne dans Centos, mais implique principalement que l'utilisateur racine puisse se connecter à MySQL sans utiliser des informations d'identification. Habituellement, il s'appuie sur un fichier /root/-.my.cnf, mais dans Centos peut différer.
Après Googling, j'ai trouvé un moyen de réinitialiser le mot de passe temporaire:
- 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
}}"'