J'ai posté à ce sujet sur coderwall , mais je vais reproduire l'amélioration de dennisjac dans les commentaires de mon message d'origine.
L'astuce pour le faire de manière idempotente est de savoir que le module mysql_user chargera un fichier ~/.my.cnf s'il en trouve un.
Je change d'abord le mot de passe, puis copie un fichier .my.cnf avec les informations d'identification du mot de passe. Lorsque vous essayez de l'exécuter une deuxième fois, le module ansible myqsl_user trouvera le .my.cnf et utilisera le nouveau mot de passe.
- hosts: staging_mysql
user: ec2-user
sudo: yes
tasks:
- name: Install MySQL
action: yum name={{ item }}
with_items:
- MySQL-python
- mysql
- mysql-server
- name: Start the MySQL service
action: service name=mysqld state=started
# '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
- name: copy .my.cnf file with root password credentials
template: src=templates/root/.my.cnf dest=/root/.my.cnf owner=root mode=0600
Le modèle .my.cnf ressemble à ceci :
[client]
user=root
password={{ mysql_root_password }}
Modifier :ajout de privilèges comme recommandé par Dhananjay Nene dans les commentaires, et modification de l'interpolation des variables pour utiliser des accolades au lieu du signe dollar .