Ändern der MySQL-Bindeadresse in einem Skript

10

Was wäre der beste Weg, um die MySQL-Bindungsadresse in der my.cnf von einem Shell-Skript aus zu ändern? Gibt es eine Möglichkeit, ein Tool wie mysqladmin zu verwenden, oder sollte ich sed verwenden oder sollte ich es einfach an my.cnf anhängen und hoffen, dass der zweite Eintrag den ersten überschreibt (dieser klingt krank). Ich versuche, einen einfachen Shell-Provisioner für Vagrant zu schreiben, der nach der Installation von mysql-server ausgeführt wird, um Verbindungen von außerhalb der VM zu ermöglichen.

Nichtpräsenz
quelle

Antworten:

17

Wenn Sie die Bereitstellungsskripte von puphpet.com verwenden, können Sie dem Ordner / puphpet / files / startup-always eine Bash-Datei hinzufügen und alle Ihre Befehle dort ablegen. Jedes Mal, wenn Vagrant startet oder neu lädt, wird das Skript aufgerufen:

mysql.sh

#!/bin/bash

echo "Updating mysql configs in /etc/mysql/my.cnf."

if [ 'sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf' ]; then

    echo "Updated mysql bind address in /etc/mysql/my.cnf to 0.0.0.0 to allow external connections."

    sudo /etc/init.d/mysql stop
    sudo /etc/init.d/mysql start

fi

Noch besser (um eine sauberere Ausgabe zu ermöglichen)

mysql.sh

#!/bin/bash

echo "Updating mysql configs in /etc/mysql/my.cnf."
sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
echo "Updated mysql bind address in /etc/mysql/my.cnf to 0.0.0.0 to allow external connections."
sudo service mysql stop
sudo service mysql start

Dadurch konnte ich meine IDE (PhpStorm) über Vagrant direkt mit der Datenbank auf meinem Gastcomputer verbinden. Natürlich habe ich dem Gast-MySQL-Benutzer Zugriff auf '%' gewährt und Port 3306 auf dem Gast an einen Port (3309) auf dem Host weitergeleitet. Die Zugriffsgewährung kann auch in dieser Datei erfolgen.

Noch besser (MySQL ausführen Add-In)

mysql.sh

#!/bin/bash

echo "Updating mysql configs in /etc/mysql/my.cnf."
sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
echo "Updated mysql bind address in /etc/mysql/my.cnf to 0.0.0.0 to allow external connections."

echo "Assigning mysql user user1 access on %."
sudo mysql -u user1 -pyourpassword --execute "GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%' IDENTIFIED BY 'yourpassword' with GRANT OPTION; FLUSH PRIVILEGES;" yourdatabase
echo "Assigned mysql user user1 access on all hosts."

sudo service mysql stop
sudo service mysql start
Chukky Nze
quelle
Das untere Skript war perfekt für mich, abgesehen von ein paar kleinen Details (CentOS 6.5-Box) - Die Verwendung sudoführte zu einem Fehler "Entschuldigung, Sie müssen einen tty haben" (behoben durch einfaches Entfernen von 'sudo' aus den Anweisungen) und mein MySQL-Dienst wurde mit neu gestartet /etc/init.d/mysqld stopund /etc/init.d/mysqld start. Beides sind möglicherweise nur CentOS-Macken und keine Fehler im Skript.
Adam Westbrook
9

Es sieht so aus, als wäre sed in diesem Zusammenhang der einfachste Weg (nach einer Neuinstallation):

sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf 
Nichtpräsenz
quelle
2
augtool -s set '/files/etc/mysql/my.cnf/target[ . = "mysqld"]/bind-address 0.0.0.0'

Das Ubuntu-Paket heißt 'augeas-tools'

Peter Childs
quelle
Diese Antwort bedarf einer weiteren Erklärung.
Kasperd
Die Verwendung von Augeas (wie in einer der anderen Antworten angegeben) ermöglicht die Bearbeitung von Konfigurationsdateien. Dieses Beispiel zeigt, wie das gemacht wird.
Peter Childs
Vom Versuch, diese Antwort zu verwenden: -sist "Updates automatisch speichern". setDiese Aktion wird Augeas mit dieser Zeile durchführen. /files/etc/mysql/my.cnfWelcher Teil / welche Datei Augest bearbeitet (es werden alle / etc geladen). /targetist ein (? Array?) dekodierter Werte. [ . = "mysqld"]wählt die Zielnummer aus, die den Wert "mysqld" hat. bind-addressist das Feld für die Bindungsadresse im Abschnitt "mysqld", und der Wert nach dem Leerzeichen 0.0.0.0ist der Wert, auf den es gesetzt wird.
Mike Lutz
0

Klingt so, als ob Sie nach Augeas suchen .

Die Projektseite ist hier und einige Dokumentationen und Beispiele sind hier. MySQL ist auf der Seite mit den Standardobjektiven enthalten, aber leider verweist die Dokumentation jetzt auf eine 404-Seite.

Es gibt auch einige Beispiele für die Verwendung in Puppet .

Ladadadada
quelle
sieht interessant aus. aber ich denke, bevor ich so etwas benutze, nur um die
Bindeadresse
Puppetlabs / Inifile könnten auch funktionieren, wenn Sie Vagabunden loswerden und zum professionellen Konfigurationsmanagement wechseln ...
Michael Hampton
1
Der sed-Ansatz funktioniert nur, wenn der Eintrag bereits vorhanden ist, da Abschnitte in der Datei wichtig sind. Der Augeas-Ansatz funktioniert unabhängig davon, da der Eintrag an der richtigen Position platziert wird.
inkaphink