Mysql recipe on ubuntu


#1

Hi,

I’m using the mysql recipe (
https://github.com/opscode/cookbooks/tree/master/mysql ) with vagrant
and ubuntu 10.04.
The problem I encounter is that this code

execute “mysql-install-privileges” do
command "/usr/bin/mysql -u root
#{node[‘mysql’][‘server_root_password’].empty? ? ‘’ : ‘-p’
}#{node[‘mysql’][‘server_root_password’]} < #{grants_path}"
action :nothing
subscribes :run, resources(“template[#{grants_path}]”), :immediately
end

is run when the mysql daemon is not yet ready. In my own recipe, I
have put this code to wait for mysqld:

execute “wait for mysql” do
action :run
command "i=0 && while ! ps ax | grep mysqld | grep -v grep ; do echo
"waiting… i\" >> /tmp/debug ; sleep 1; i=((i+1)); [ $i -eq 29 ]
&& break; done ; sleep 5; exit 0"
end

but this approach won’t work as mysql-install-privileges is run by a
"subscribes :run".

Is there a way to tell an execute block to wait for a certain
condition? Or am I doing something wrong here, as the recipe is
indicated as being tested with ubuntu 10.04?

Thanks

raphaël


#2

Hi Raphael,

Not sure if this would help your case but this is more for a centos
installation .We had trouble to make sure that we assign the password only
the first time and do certain checks. Basically we wanted it to be
idempotent. We used something to this effect:. It wouldn’t enter this block
if mysql server was already installed and we added definitions to
create/delete DBs and modify passwords.

if ! File.exists?("/var/lib/mysql/mysql/user.MYD")
package “mysql-server” do
action :install
end

service “mysqld” do
action [:start,:enable]
end

execute “creating ‘mysqladmin’ required files at ‘/var/lib/mysql’” do
command "/etc/init.d/mysqld restart >> /tmp/mysql.log"
end

execute “set_password” do
command ""
end
end

thanks
Madhurranjan

On Thu, Aug 18, 2011 at 1:52 PM, Raphael Bauduin rblists@gmail.com wrote:

Hi,

I’m using the mysql recipe (
https://github.com/opscode/cookbooks/tree/master/mysql ) with vagrant
and ubuntu 10.04.
The problem I encounter is that this code

execute “mysql-install-privileges” do
command "/usr/bin/mysql -u root
#{node[‘mysql’][‘server_root_password’].empty? ? ‘’ : ‘-p’
}#{node[‘mysql’][‘server_root_password’]} < #{grants_path}"
action :nothing
subscribes :run, resources(“template[#{grants_path}]”), :immediately
end

is run when the mysql daemon is not yet ready. In my own recipe, I
have put this code to wait for mysqld:

execute “wait for mysql” do
action :run
command "i=0 && while ! ps ax | grep mysqld | grep -v grep ; do echo
"waiting… i\" >> /tmp/debug ; sleep 1; i=((i+1)); [ $i -eq 29 ]
&& break; done ; sleep 5; exit 0"
end

but this approach won’t work as mysql-install-privileges is run by a
"subscribes :run".

Is there a way to tell an execute block to wait for a certain
condition? Or am I doing something wrong here, as the recipe is
indicated as being tested with ubuntu 10.04?

Thanks

raphaël


#3

Hi Madhurranjan,

On Thu, Aug 18, 2011 at 8:20 PM, Madhurranjan Mohaan
maadhuuranjan.m@gmail.com wrote:

Hi Raphael,
Not sure if this would help your case but this is more for a centos
installation .We had trouble to make sure that we assign the password only
the first time and do certain checks. Basically we wanted it to be
idempotent. We used something to this effect:. It wouldn’t enter this block
if mysql server was already installed and we added definitions to
create/delete DBs and modify passwords.

thanks, but this does not apply to my problem. I need the recipe to
wait until the mysql server is ready.

Raph

if ! File.exists?("/var/lib/mysql/mysql/user.MYD")
package “mysql-server” do
action :install
end
service “mysqld” do
action [:start,:enable]
end
execute “creating ‘mysqladmin’ required files at ‘/var/lib/mysql’” do
command "/etc/init.d/mysqld restart >> /tmp/mysql.log"
end
execute “set_password” do
command ""
end
end
thanks
Madhurranjan
On Thu, Aug 18, 2011 at 1:52 PM, Raphael Bauduin rblists@gmail.com wrote:

Hi,

I’m using the mysql recipe (
https://github.com/opscode/cookbooks/tree/master/mysql ) with vagrant
and ubuntu 10.04.
The problem I encounter is that this code

execute “mysql-install-privileges” do
command "/usr/bin/mysql -u root
#{node[‘mysql’][‘server_root_password’].empty? ? ‘’ : ‘-p’
}#{node[‘mysql’][‘server_root_password’]} < #{grants_path}"
action :nothing
subscribes :run, resources(“template[#{grants_path}]”), :immediately
end

is run when the mysql daemon is not yet ready. In my own recipe, I
have put this code to wait for mysqld:

execute “wait for mysql” do
action :run
command "i=0 && while ! ps ax | grep mysqld | grep -v grep ; do echo
"waiting… i\" >> /tmp/debug ; sleep 1; i=((i+1)); [ $i -eq 29 ]
&& break; done ; sleep 5; exit 0"
end

but this approach won’t work as mysql-install-privileges is run by a
"subscribes :run".

Is there a way to tell an execute block to wait for a certain
condition? Or am I doing something wrong here, as the recipe is
indicated as being tested with ubuntu 10.04?

Thanks

raphaël


Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org


#4

On Mon, Aug 22, 2011 at 2:57 PM, Raphael Bauduin rblists@gmail.com wrote:

Hi Madhurranjan,

On Thu, Aug 18, 2011 at 8:20 PM, Madhurranjan Mohaan
maadhuuranjan.m@gmail.com wrote:

Hi Raphael,
Not sure if this would help your case but this is more for a centos
installation .We had trouble to make sure that we assign the password
only
the first time and do certain checks. Basically we wanted it to be
idempotent. We used something to this effect:. It wouldn’t enter this
block
if mysql server was already installed and we added definitions to
create/delete DBs and modify passwords.

thanks, but this does not apply to my problem. I need the recipe to
wait until the mysql server is ready.

Raph

Hi Raph,
you can use this ruby_block resource for that:

*ruby_block “wait for mysql to come up” do
block do
my_sock = TCPSocket.new(‘127.0.0.1’, 3306)
readable = IO.select([my_sock], nil, nil, 5)
if readable
puts (“mysql accepting connections on banner is
#{my_sock.gets}”)
true
else
false
end
rescue
Chef::Log.info ("mysql is not awake after 5 seconds ")
ensure
my_sock && my_sock.close
end
end
end
*
but this block is not idempotent, and will be executed in every run, you may
use the not_if {ps --no-headers -C mysqld} to make this idempotent , or
set the action to :nothing and notify this resource from some other resource
with action run.

hope this helps
ranjib

if ! File.exists?("/var/lib/mysql/mysql/user.MYD")

package “mysql-server” do
action :install
end
service “mysqld” do
action [:start,:enable]
end
execute “creating ‘mysqladmin’ required files at ‘/var/lib/mysql’” do
command "/etc/init.d/mysqld restart >> /tmp/mysql.log"
end
execute “set_password” do
command ""
end
end
thanks
Madhurranjan
On Thu, Aug 18, 2011 at 1:52 PM, Raphael Bauduin rblists@gmail.com
wrote:

Hi,

I’m using the mysql recipe (
https://github.com/opscode/cookbooks/tree/master/mysql ) with vagrant
and ubuntu 10.04.
The problem I encounter is that this code

execute “mysql-install-privileges” do
command "/usr/bin/mysql -u root
#{node[‘mysql’][‘server_root_password’].empty? ? ‘’ : ‘-p’
}#{node[‘mysql’][‘server_root_password’]} < #{grants_path}"
action :nothing
subscribes :run, resources(“template[#{grants_path}]”), :immediately
end

is run when the mysql daemon is not yet ready. In my own recipe, I
have put this code to wait for mysqld:

execute “wait for mysql” do
action :run
command "i=0 && while ! ps ax | grep mysqld | grep -v grep ; do echo
"waiting… i\" >> /tmp/debug ; sleep 1; i=((i+1)); [ $i -eq 29 ]
&& break; done ; sleep 5; exit 0"
end

but this approach won’t work as mysql-install-privileges is run by a
"subscribes :run".

Is there a way to tell an execute block to wait for a certain
condition? Or am I doing something wrong here, as the recipe is
indicated as being tested with ubuntu 10.04?

Thanks

raphaël


Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org


#5

On Mon, Aug 22, 2011 at 12:54 PM, Ranjib Dey ranjibd@thoughtworks.com wrote:

On Mon, Aug 22, 2011 at 2:57 PM, Raphael Bauduin rblists@gmail.com wrote:

Hi Madhurranjan,

On Thu, Aug 18, 2011 at 8:20 PM, Madhurranjan Mohaan
maadhuuranjan.m@gmail.com wrote:

Hi Raphael,
Not sure if this would help your case but this is more for a centos
installation .We had trouble to make sure that we assign the password
only
the first time and do certain checks. Basically we wanted it to be
idempotent. We used something to this effect:. It wouldn’t enter this
block
if mysql server was already installed and we added definitions to
create/delete DBs and modify passwords.

thanks, but this does not apply to my problem. I need the recipe to
wait until the mysql server is ready.

Raph

Hi Raph,
you can use this ruby_block resource for that:

ruby_block “wait for mysql to come up” do
block do
my_sock = TCPSocket.new(‘127.0.0.1’, 3306)
readable = IO.select([my_sock], nil, nil, 5)
if readable
puts (“mysql accepting connections on banner is
#{my_sock.gets}”)
true
else
false
end
rescue
Chef::Log.info ("mysql is not awake after 5 seconds ")
ensure
my_sock && my_sock.close
end
end
end

but this block is not idempotent, and will be executed in every run, you may
use the not_if {ps --no-headers -C mysqld} to make this idempotent , or
set the action to :nothing and notify this resource from some other resource
with action run.

hope this helps
ranjib

Thanks ranjib, I’ll give this a try!

raph

if ! File.exists?("/var/lib/mysql/mysql/user.MYD")
package “mysql-server” do
action :install
end
service “mysqld” do
action [:start,:enable]
end
execute “creating ‘mysqladmin’ required files at ‘/var/lib/mysql’” do
command "/etc/init.d/mysqld restart >> /tmp/mysql.log"
end
execute “set_password” do
command ""
end
end
thanks
Madhurranjan
On Thu, Aug 18, 2011 at 1:52 PM, Raphael Bauduin rblists@gmail.com
wrote:

Hi,

I’m using the mysql recipe (
https://github.com/opscode/cookbooks/tree/master/mysql ) with vagrant
and ubuntu 10.04.
The problem I encounter is that this code

execute “mysql-install-privileges” do
command "/usr/bin/mysql -u root
#{node[‘mysql’][‘server_root_password’].empty? ? ‘’ : ‘-p’
}#{node[‘mysql’][‘server_root_password’]} < #{grants_path}"
action :nothing
subscribes :run, resources(“template[#{grants_path}]”), :immediately
end

is run when the mysql daemon is not yet ready. In my own recipe, I
have put this code to wait for mysqld:

execute “wait for mysql” do
action :run
command "i=0 && while ! ps ax | grep mysqld | grep -v grep ; do echo
"waiting… i\" >> /tmp/debug ; sleep 1; i=((i+1)); [ $i -eq 29 ]
&& break; done ; sleep 5; exit 0"
end

but this approach won’t work as mysql-install-privileges is run by a
"subscribes :run".

Is there a way to tell an execute block to wait for a certain
condition? Or am I doing something wrong here, as the recipe is
indicated as being tested with ubuntu 10.04?

Thanks

raphaël


Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org


Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org