Изменение bind-адреса mysql в скрипте

10

Каков наилучший способ изменить bind-адрес mysql в my.cnf из сценария оболочки? Есть ли способ использовать такой инструмент, как mysqladmin, или я должен использовать sed, или я должен просто добавить его в my.cnf и надеяться, что вторая запись перезаписывает первую (это звучит плохо). Я пытаюсь написать простой поставщик оболочки для vagrant, который запускается после установки mysql-сервера, чтобы разрешить подключения извне vm.

nonsenz
источник

Ответы:

17

В дополнение к сказанному @nonsenz: если вы используете сценарии инициализации puphpet.com, вы можете добавить bash-файл в папку / puphpet / files / startup-always и поместить туда все свои команды. Каждый раз, когда vagrant запускается или перезагружается, он вызывает скрипт:

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

Еще лучше (для более чистого вывода)

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

Это позволило мне подключить мою IDE (PhpStorm) напрямую к базе данных на моей гостевой машине через vagrant. Конечно, я предоставил гостю mysql доступ к «%» и перенаправил порт 3306 гостя на порт (3309) хоста. Предоставление доступа также может быть сделано в этом файле.

Even Better'er (mysql выполнить добавить в)

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
Чукки Нзе
источник
Нижний сценарий был идеальным для меня sudo, за исключением нескольких маленьких битов (коробка CentOS 6.5) - Использование привело к ошибке «извините, у вас должен быть tty» (исправлено просто удалением «sudo» из операторов), и моя служба MySQL была перезапущена с помощью /etc/init.d/mysqld stopи /etc/init.d/mysqld start. Оба из них могут быть просто причудами CentOS, а не ошибками в сценарии.
Адам Уэстбрук
9

Похоже, что sed - это самый простой способ в этом контексте (после чистой установки):

sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf 
nonsenz
источник
2
augtool -s set '/files/etc/mysql/my.cnf/target[ . = "mysqld"]/bind-address 0.0.0.0'

Пакет Ubuntu называется augeas-tools

Питер Чайлдс
источник
Этот ответ нуждается в дополнительном объяснении.
Касперд
Использование Augeas (как отмечено в одном из других ответов) позволяет манипулировать файлами конфигурации. Этот пример показывает, как это делается.
Питер Чайлдс
Попытка использовать этот ответ: -s«автоматически сохранять любые обновления». setэто действие, которое Augeas предпримет с этой линией. /files/etc/mysql/my.cnfнад какой частью / файлом будет работать Augest (он загружает все / etc). /targetявляется («массивом») декодированных значений. [ . = "mysqld"]выбирает тот номер цели, который имеет значение «mysqld». bind-addressполе адреса привязки в разделе «mysqld», а значение после пробела 0.0.0.0- это значение, которое будет установлено.
Майк Лутц
0

Похоже, вы ищете Augeas .

Страница проекта находится здесь, а некоторые документы и примеры здесь. MySQL включен на странице стандартных линз, но, к сожалению, документация ссылается на страницу 404.

Здесь также есть несколько примеров использования его в Puppet .

Ladadadada
источник
выглядит интересно. но я думаю, что прежде чем использовать что-то подобное, просто чтобы изменить адрес привязки, я использую sed :-)
nonsenz
puppetlabs / inifile тоже могут работать, как только вы избавитесь от бродяги и перейдете к профессиональному управлению конфигурацией ...
Майкл Хэмптон
1
Подход sed будет работать только в том случае, если запись уже существует, так как разделы имеют значение в inifile. Подход Augeas будет работать независимо, потому что он поместит запись в правильное положение.
ℝaphink