如何在 Chef Ruby 块中执行 MySQL

How to execute MySQL in Chef Ruby block

好的,我有一个调用 Opscode MySQL 食谱的食谱。

我可以创建数据库,但我不确定如何在 Chef Recipe 中创建具有 read/write 权限的 MySQL 用户。

这是我的食谱:

include_recipe 'percona' #this is an example

mysql_secret = Chef::EncryptedDataBagItem.load_secret("#{node[:percona][:encrypted_data_bag_secret_file]}")
mysql_creds = Chef::EncryptedDataBagItem.load("passwords", "mysql", mysql_secret)
pdns_password='1H@t3D@taB@G$!'
mysql_connection_info = {
  :host => "127.0.0.1",
  :username => 'root',
  :password => mysql_creds["root"]
}

#
# Only write to master pdb01
#
if node.name =~ /pdb01/
    dbs=['serv']
    # Create application database
    dbs.each do |db|
        ruby_block "create_#{db}_db" do
          block do
            %x[mysql -uroot  -e "CREATE DATABASE #{db};"]
          end
          not_if "mysql -u root  -e \"SHOW DATABASES LIKE '#{db}'\" | grep #{db}";
          action :create
        end
    end
end
# Grant mysql privileges
dbs.each do |db|
    ruby_block "add_servo_#{db}permissions" do
        block do
          %x[mysql -u root  -e "GRANT SELECT,INSERT,UPDATE,DELETE \
            ON #{db}.* TO 'serv'@'127.0.0.1' IDENTIFIED BY '#{servo_password}';"]
            end
            not_if "mysql -u root  -e \"SELECT user, host FROM mysql.user\" | \
              grep serv | grep #{db}"
            action :create
        end
end
#
# Create pdb02 slave replication
#

if node.name =~ /pdb02/
    dbs=['serv','serv_app'
    # Create application database
    dbs.each do |db|
        ruby_block "create_#{db}_db" do
          block do
            %x[mysql -uroot  -e "CREATE DATABASE #{db};"]
          end
          not_if "mysql -u root  -e \"SHOW DATABASES LIKE '#{db}'\" | grep #{db}";
          action :create
        end
    end
    dbs.each do |db|
        ruby_block "add_serv_#{db}permissions" do
            block do
              %x[mysql -u root  -e "GRANT SELECT,INSERT,UPDATE,DELETE \
                ON #{db}.* TO 'repl'@'127.0.0.1' IDENTIFIED BY 'replpass';"]
               GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'replpass';
                end
                not_if "mysql -u root  -e \"SELECT user, host FROM mysql.user\" | \
                  grep repl | grep #{db}"
                action :create
            end
    end
end

AND - 它在这里失败:

   SyntaxError
   -----------
   /tmp/kitchen/cache/cookbooks/cb-dataBases/recipes/pdb.rb:55: syntax error, unexpected tIDENTIFIER, expecting ']'

       dbs.each do |db|
          ^
   /tmp/kitchen/cache/cookbooks/cb-dataBases/recipes/pdb.rb:69: syntax error, unexpected '.'
   ...  GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY...
   ...                               ^
   /tmp/kitchen/cache/cookbooks/cb-dataBases/recipes/pdb.rb:69: `@'' is not allowed as an instance variable name
   /tmp/kitchen/cache/cookbooks/cb-dataBases/recipes/pdb.rb:69: syntax error, unexpected $end, expecting keyword_end
   ...ICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'replpass'; 
   ...                               ^

我做错了什么?

您的 ] 写错了行。 %x[] 必须围绕整个命令字符串。