web-dev-qa-db-fra.com

Impossible de créer une base de données MySQL via une insible

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

4
arun mohan

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+

tâches/Main.yml

  # ...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

modèles/my.cnf.j2

[client]
user=root
password={{ mysql.root_db_password }}

par défaut/Main.yml

mysql:
  root_db_password: REDACTED
  hosts:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost
7
maoizm

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.

1
sanzante

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 
}}"'
0
arun mohan