J’ai plusieurs serveurs sous la main dont un “Principal” qui me permet de me connecter en root sur tous les autres par ssh sans avoir à taper de mdp
Tout les serveurs on des instances/cluster mysql
Je dois créer sur tte ces instances un nvlle utilisateur avec certains droits.
Etant donnée la très grande quantité d’instances mon idée à donc été de faire un script pour automatiser cette création.
Toutes les instances ont le même chemin pour y accéder.
Exemple :
Alors depuis le serveur “Principal” :
j’ai fais un script avec un find qui me récupere ttes les instances sur chaques serveurs étant données qu’ils n’ont pas tous les mêmes noms d’instances sauf certains et un grep qui me récupère les ports dans un fichier de conf. (ils sont tous les 2 stockers dans des variables différentes).
ce qui donne un truc du genre
[code]clear
echo "Entrez une IP : "
read IP
ssh ${IP} ‘bash -c “find /data/ ( -name “instance?” -o -name “instance?” -o #etc…) -printf %f\\n”’ > /data/Test/instances[/code]
Ce qui va me créer un fichier instance sous mon serveur Principal avec la liste des instances trouvées.
Ensutie avec une boucle while read je récupère ces infos que je stock dans un tableau. $instance[$i] par exemple, i étant le numéro de ligne.
Et maintenant c’est là où je bloque (à mon avi c’est tout bête), à l’éxécution de la commande :
Je pense que c’est un soucis avec les quotes… Mais je vois pas trop comment faire.
Si quelqu’un a une idée pour résoudre mon problème je prends !
Si vous avez d’autres idées plus rapide et simple pour faire ce que je veux faire je prends aussi !
Ce n’est pas la solution que tu cherche mais une voie à explorer.
Au lieu de tout mettre dans une seule ligne de commande il existe un moyen de passer des commandes à un outil.
L’exemple que j’ai le plus souvent rencontré est avec Oracle et l’outil sqlplus :
sqlplus -s /nolog <<EOF
connect / as sysdba
startup mount
alter database open;
exit;
EOF
Tout ce qui se trouve entre les “EOF” est passésà sqlplus comme si c’était tapé au clavier. Le marqueur “EOF” peut être remplacé par n’importe quoi, “toto” si ça te fait plaisir.
Je pense que tu y gagneras beaucoup en lisibilité.
NB : Évite l’indentation dans le bloc de commande, ça ne sert à rien et peut introduire des problèmes.
cette commande va chercher tous les “trucmuch” et afficher le résultat sous la forme d’un fichier “TrucmuchList” sur le serveur distant avec des retour à la ligne entre chaque résultat.
i=1
j=1
while read aLine
do
trucmuch[$i]=$aLine
i=$(($i+1))
done < /data/TrucmuchList
On va lire ce fichier et sauvegarder les résultats dans un tableau trucmuch[$i]
while test $j != $i
do
echo "${trucmuch[$j]}"
grep -A 0 Port= /data/${trucmuch[$j]}/config/my.conf | cut -c6-
/data/${trucmuch[$j]}/bin/mysql -u root -pMonMDP --socket=/var/run/${trucmuch[$j]}.sock --port=${Port} -e "GRANT SELECT, INSERT, UPDATE, CREATE, RELOAD, SHUTDOWN, #ETC..., TRIGGER ON *.* TO 'NomCompte'@'%' IDENTIFIED BY 'LeMDP';GRANT SELECT, INSERT, UPDATE, CREATE, RELOAD, SHUTDOWN, PROCESS, #ETC..., TRIGGER ON *.* TO 'NomCompte'@'localhost' IDENTIFIED BY 'LeMDP';"
j=$(($j+1))
Pour finir, dans une boucle, on va chercher le Port dans le fichier de conf de chaque trucmuch et ensuite on va éxécuter la commande pour lancer mysql suivis d’un “-e” pour directement éxécuter ma requete.
Voilà, si j’ai pas été clair dites le moi.
Edit : trucmuch correspond aux noms de mes instances.