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
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)
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