web-dev-qa-db-fra.com

Installer MySQL avec ansible sur Ubuntu

J'ai un problème pour installer MySQL avec ansible sur un ubuntu vagabond,

Ceci est ma partie MySQL

---
- name: Install MySQL
  apt:
    name: "{{ item }}"
  with_items:
    - python-mysqldb
    - mysql-server

- name: copy .my.cnf file with root password credentials
  template: 
    src: templates/root/.my.cnf
    dest: ~/.my.cnf
    owner: root
    mode: 0600

- name: Start the MySQL service
  service: 
    name: mysql 
    state: started
    enabled: true

  # 'localhost' needs to be the last item for idempotency, see
  # http://ansible.cc/docs/modules.html#mysql-user
- name: update mysql root password for all root accounts
  mysql_user: 
    name: root 
    Host: "{{ item }}" 
    password: "{{ mysql_root_password }}" 
    priv: "*.*:ALL,GRANT"
  with_items:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost 

Et j'ai cette erreur

failed: [default] => (item=vagrant-ubuntu-trusty-64) => {"failed": true, "item": "vagrant-ubuntu-trusty-64"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
failed: [default] => (item=127.0.0.1) => {"failed": true, "item": "127.0.0.1"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
failed: [default] => (item=::1) => {"failed": true, "item": "::1"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
failed: [default] => (item=localhost) => {"failed": true, "item": "localhost"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

mon .my.cnf est

[client]
user=root
password={{ mysql_root_password }}

et une fois copié sur le serveur

[client]
user=root
password=root

Je ne comprends pas pourquoi, ~/.my.cnf est créé

Projet Github

Merci

29
Ajouve

Quand mysql-server est installé sans tête, il n'y a pas de mot de passe. Par conséquent, pour faire .my.cnf travail, il doit avoir une ligne de mot de passe vide. Voici ce que j'ai testé avec un .my.cnf:

[client]
user=root
password=

C'est aussi un peu étrange de mettre .my.cnf dans votre répertoire utilisateur vagrant appartenant à root et uniquement lisible en tant que root.

Après vous être assuré que le mot de passe était vide dans .my.cnf, J'ai pu définir correctement le mot de passe de root dans ces quatre contextes. Notez qu'il ne s'exécute pas après cela, car .my.cnf devrait être mis à jour, il échoue donc au test d'idempotence.

Il y a une note sur la page du module ansible mysql_user qui suggère d'écrire le mot de passe et alors d'écrire le .my.cnf fichier. Si vous faites cela, vous avez besoin d'une clause where pour le mysql_user action (probablement avec une statistique de fichier avant cela).

Encore plus élégant est d'utiliser check_implicit_admin de même que login_user et login_password. C'est magnifiquement idempotent.

Comme troisième moyen, peut-être check_implicit_admin le rend encore plus facile.

Voici mon livre de jeu réussi montrant ce qui précède, testé avec quelques nouveaux serveurs. Un peu fier de ça. Remarque .my.cnf n'est pas nécessaire pour tout cela.

---
- hosts: mysql
  vars:
    mysql_root_password: fart
  tasks:
  - name: Install MySQL
    apt: name={{ item }} update_cache=yes cache_valid_time=3600 state=present
    Sudo: yes
    with_items:
    - python-mysqldb
    - mysql-server
  #- name: copy cnf
  #  copy: src=.my.cnf dest=~/.my.cnf owner=ubuntu mode=0644
  #  Sudo: yes
  - name: Start the MySQL service
    Sudo: yes
    service: 
      name: mysql 
      state: started
      enabled: true
  - name: update mysql root password for all root accounts
    Sudo: yes
    mysql_user: 
      name: root 
      Host: "{{ item }}" 
      password: "{{ mysql_root_password }}"
      login_user: root
      login_password: "{{ mysql_root_password }}"
      check_implicit_admin: yes
      priv: "*.*:ALL,GRANT"
    with_items:
      - "{{ ansible_hostname }}"
      - 127.0.0.1
      - ::1
      - localhost 

(modifier - supprimé my.cnf)

37
tedder42

Voici mon rôle MySQL complet, qui pourrait vous aider.

vars/main.yml :

mysql_root_pass: mypassword #MySQL Root Password

demande/main.yml :

---
 - name: Install the MySQL packages
   apt: name={{ item }} state=installed update_cache=yes
   with_items:
     - mysql-server-5.6
     - mysql-client-5.6
     - python-mysqldb
     - libmysqlclient-dev

 - name: Update MySQL root password for all root accounts
   mysql_user: name=root Host={{ item }} password={{ mysql_root_pass }} state=present
   with_items:
     - "{{ ansible_hostname }}"
     - 127.0.0.1
     - ::1
     - localhost

 - name: Copy the root credentials as .my.cnf file
   template: src=root.cnf.j2 dest=~/.my.cnf mode=0600

 - name: Ensure Anonymous user(s) are not in the database
   mysql_user: name='' Host={{ item }} state=absent
   with_items:
     - localhost
     - "{{ ansible_hostname }}"

 - name: Remove the test database
   mysql_db: name=test state=absent
   notify:
     - Restart MySQL

templates/root.cnf.j2

[client]
user=root
password={{ mysql_root_pass }}

handlers/main.yml

---
 - name: Restart MySQL
   service: name=mysql state=restarted

site.yml

---
- hosts: all
  become: yes
  gather_facts: yes
  roles:
    - mysql

Si vous avez besoin d'aide, veuillez vérifier ce github lien . Merci

12
Arbab Nazar