Utilizando módulo Puppetlabs MySQL

1. Módulos da Puppetlabs

Resolvi iniciar uma série de posts para divulgar os excelentes módulos da Puppetlabs, muita gente não os usa e não os conhece. Estes módulos são maduros e bem testados, afinal são construídos de forma coletiva pela comunidade puppet.

Não vale a pena investir tempo reinventando a roda, use estes módulos!

2. Método aplicado

A ideia aqui não é mostrar como se instala e configura o PuppetMaster, isso já foi bem coberto neste blog e nas wikis do meu site, partirei da ideia de que você já tem um ambiente rodando e em produção. Eu simplesmente vou mostrar alguns exemplos de uso do módulo para facilitar a configuração.

3. Entendendo os módulos

Todos os módulos da Puppetlabs tem um arquivo README, este arquivo contém informações mais do que suficientes para entender seu funcionamento e fazer uso dele.

Você vai encontrar os módulos da puppetlabs no Forge e no Github.

No caso do Github existem outros projetos no repositório além dos módulos, normalmente os módulos terão o nome de puppetlabs-module, mas na descrição estará bem claro.

4. Sobre o módulo Puppetlabs MySQL

Este módulo é bastante interessante, particularmente eu o uso para gerenciar todos os meus servidores mysql, ele possui as seguintes classes.

Public classes

Private classes

Cada uma destas classes tem diversos parâmetros, portanto, recomendo uma leitura completa no README do módulo antes de iniciar suas aventuras.

4. Instalando o módulo Mysql

No servidor puppetmaster acesse o diretório de módulos

cd /etc/puppet/modules

E inicie uma busca por módulos da puppetlabs

puppet module search puppetlabs

Veja os módulos disponíveis (filtrado)

puppetlabs-activemq
puppetlabs-apache
puppetlabs-appdirector
puppetlabs-apt
puppetlabs-awsdemo_profiles
puppetlabs-azure
puppetlabs-bacula
puppetlabs-boundary
puppetlabs-ceilometer
puppetlabs-cinder
puppetlabs-cloud_provisioner
puppetlabs-cloudformation
puppetlabs-concat
puppetlabs-corosync
puppetlabs-dashboard
puppetlabs-denyhosts
puppetlabs-dism
puppetlabs-drbd
puppetlabs-f5
puppetlabs-firewall
puppetlabs-gcc
puppetlabs-gce_compute
puppetlabs-git
puppetlabs-glance
puppetlabs-grizzly
puppetlabs-haproxy
puppetlabs-havana
puppetlabs-heat
puppetlabs-horizon
puppetlabs-inifile
puppetlabs-java
puppetlabs-java_ks
puppetlabs-keystone
puppetlabs-kwalify
puppetlabs-lib_puppet
puppetlabs-logentries
puppetlabs-lvm
puppetlabs-mcollective
puppetlabs-mongodb
puppetlabs-motd
puppetlabs-mount_providers
puppetlabs-mrepo
puppetlabs-mssql
puppetlabs-mysql
puppetlabs-neutron
puppetlabs-newrelic
puppetlabs-nginx
puppetlabs-node_gce
puppetlabs-node_openstack
puppetlabs-nodejs
puppetlabs-nova
puppetlabs-ntp
puppetlabs-opennebula
puppetlabs-openstack
puppetlabs-passenger
puppetlabs-pe_gem
puppetlabs-pe_upgrade
puppetlabs-postgresql
puppetlabs-puppetdb
puppetlabs-quantum
puppetlabs-rabbitmq
puppetlabs-razor
puppetlabs-reboot
puppetlabs-registry
puppetlabs-rsync
puppetlabs-ruby
puppetlabs-sqlite
puppetlabs-stdlib
puppetlabs-stunnel
puppetlabs-swift
puppetlabs-tftp
puppetlabs-vcenter
puppetlabs-vcli_rsyslog
puppetlabs-vcsrepo
puppetlabs-vswitch
puppetlabs-win_desktop_shortcut
puppetlabs-xinetd

Vamos instalar o módulo mysql

puppet module install puppetlabs-mysql

Acompanhe a saída

Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forge.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-mysql (v2.2.3)
  └── puppetlabs-stdlib (v4.1.0)

Veja que ele instalou o módulo stdlib que é dependência para este módulo.

5. Utilizando o módulo

Edite o arquivo /etc/puppet/manifests/site.pp e insira as configuações abaixo no node que receberá as configurações para instalação do MYSQL Server.

5.1 Para instalar o Mysql Server

{% codeblock lang:puppet %} node “mysql.hacklab” {

class { 'mysql::server':

	root_password    => 'suasenha',

	override_options => {
		'mysqld' => {
			'connect_timeout'                 => '60',
			'bind_address'                    => '0.0.0.0',
			'max_connections'                 => '100',
			'max_allowed_packet'              => '512M',
			'thread_cache_size'               => '16',
			'query_cache_size'                => '128M',
		}
	}
}

} {% endcodeblock %}

Observe que é uma configuração bastante objetiva e direta, e eu uso a diretiva override_options para definir algumas configurações diretamente no aquivo my.cnf, sem depender dos parâmetros do módulo diretamente. Agora vamos aplicar a configuração.

puppet agent -t

Acompanhe a saída

Info: Retrieving plugin
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/puppet_vardir.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/root_home.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/pe_version.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/facter_dot_d.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Info: Caching catalog for puppet.hacklab
Info: Applying configuration version '1395658656'
Notice: /Stage[main]/Mysql::Server::Install/Package[mysql-server]/ensure: created
Notice: /Stage[main]/Mysql::Server::Config/File[/etc/mysql]/ensure: created
Notice: /Stage[main]/Mysql::Server::Config/File[/etc/my.cnf]/content:
--- /etc/my.cnf	2014-02-12 17:42:13.000000000 -0200
+++ /tmp/puppet-file20140324-2025-10nhr9y-0	2014-03-24 07:58:32.036141657 -0300
@@ -1,10 +1,46 @@
+[client]
+port = 3306
+socket = /var/lib/mysql/mysql.sock
+
+[isamchk]
+key_buffer_size = 16M
+
 [mysqld]
-datadir=/var/lib/mysql
-socket=/var/lib/mysql/mysql.sock
-user=mysql
-# Disabling symbolic-links is recommended to prevent assorted security risks
-symbolic-links=0
+basedir = /usr
+bind_address = 0.0.0.0
+connect_timeout = 60
+datadir = /var/lib/mysql
+expire_logs_days = 10
+key_buffer_size = 16M
+log-error = /var/log/mysqld.log
+max_allowed_packet = 512M
+max_binlog_size = 100M
+max_connections = 1400
+myisam_recover = BACKUP
+pid-file = /var/run/mysqld/mysqld.pid
+port = 3306
+query_cache_limit = 1M
+query_cache_size = 128M
+skip-external-locking
+socket = /var/lib/mysql/mysql.sock
+ssl = false
+ssl-ca = /etc/mysql/cacert.pem
+ssl-cert = /etc/mysql/server-cert.pem
+ssl-key = /etc/mysql/server-key.pem
+thread_cache_size = 16
+thread_stack = 256K
+tmpdir = /tmp
+user = mysql

 [mysqld_safe]
-log-error=/var/log/mysqld.log
-pid-file=/var/run/mysqld/mysqld.pid
+log-error = /var/log/mysqld.log
+nice = 0
+socket = /var/lib/mysql/mysql.sock
+
+[mysqldump]
+max_allowed_packet = 16M
+quick
+quote-names
+
+
+!includedir /etc/mysql/conf.d/

Info: /Stage[main]/Mysql::Server::Config/File[/etc/my.cnf]: Filebucketed /etc/my.cnf to puppet with sum 8ace886bbe7e274448bc8bea16d3ead6
Notice: /Stage[main]/Mysql::Server::Config/File[/etc/my.cnf]/content: content changed '{md5}8ace886bbe7e274448bc8bea16d3ead6' to '{md5}995ee9b1c5173f66fe1e8adf81d1e0f0'
Notice: /Stage[main]/Mysql::Server::Config/File[/etc/mysql/conf.d]/ensure: created
Notice: /Stage[main]/Mysql::Server::Service/Service[mysqld]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Mysql::Server::Service/Service[mysqld]: Unscheduling refresh on Service[mysqld]
Notice: /Stage[main]/Mysql::Server::Root_password/Mysql_user[root@localhost]/password_hash: defined 'password_hash' as '*686FAFB0D22504AC4005869A48377E6056C40F6A'
Notice: /Stage[main]/Mysql::Server::Root_password/File[/root/.my.cnf]/ensure: defined content as '{md5}c51fe9a952a98fdd64ad44e0f4b9e660'
Notice: Finished catalog run in 53.98 seconds

Veja que o puppet instalou o mysqlserver, ajustou a senha de root, e alterou o arquivo de configuração. Agora verifique se o serviço está rodando

netstat -ntpl|grep 3306
tcp        0      0 0.0.0.0:3306     0.0.0.0:*  OUÇA     2495/mysqld

Tente se conectar no mysql

mysql

Acompanhe

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 74
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>    

Tudo perfeito.

5.2 Criando database, usuário e grant

Abaixo vamos ajustar a configuração do node para criar um banco de dados para a aplicação teampass, já vamos definir o nome do banco, nome de usuário de acesso ao banco, senha do usuário e qual o host autoriado a acessar este banco com estas credenciais.

{% codeblock lang:puppet %} node “mysql.hacklab” {

# instalando mysql server

class { 'mysql::server':
	root_password    => 'suasenha',
	override_options => {
		'mysqld' => {
			'connect_timeout'                 => '60',
			'bind_address'                    => '0.0.0.0',
			'max_connections'                 => '1400',
			'max_allowed_packet'              => '512M',
			'thread_cache_size'               => '16',
			'query_cache_size'                => '128M',
		}
	}
}

# sistema teampass

    mysql::db { 'prod_teampass':
            user     => 'teampass_user',
            password => 'senha_teampass',
            host     => 'teampass.hacklab',
            grant    => ['all'],
    }

} {% endcodeblock %}

Feito os ajustes vamos rodar o puppet

puppet agent -t

Acompanhe a saída

Info: Retrieving plugin
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/puppet_vardir.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/root_home.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/pe_version.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/facter_dot_d.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Info: Caching catalog for puppet.hacklab
Info: Applying configuration version '1395659211'
Notice: /Stage[main]/Main/Node[puppet.hacklab]/Mysql::Db[prod_teampass]/Mysql_database[prod_teampass]/ensure: created
Notice: /Stage[main]/Main/Node[puppet.hacklab]/Mysql::Db[prod_teampass]/Mysql_user[teampass_user@teampass.hacklab]/ensure: created
Notice: /Stage[main]/Main/Node[puppet.hacklab]/Mysql::Db[prod_teampass]/Mysql_grant[teampass_user@teampass.hacklab/prod_teampass.*]/ensure: created
Notice: Finished catalog run in 5.91 seconds

Base criada, usuário criado, grant criado, simples, rápido e fácil.

5.3 Criando usuário gutocarvalho

Agora vamos criar o usuário gutocarvalho, vamos configurar uma senha e determinar o host de origem dos acessos deste usuário.

{% codeblock lang:puppet %} node “mysql.hacklab” {

# instalando mysql server

class { 'mysql::server':
	root_password    => 'suasenha',
	override_options => {
		'mysqld' => {
			'connect_timeout'                 => '60',
			'bind_address'                    => '0.0.0.0',
			'max_connections'                 => '1400',
			'max_allowed_packet'              => '512M',
			'thread_cache_size'               => '16',
			'query_cache_size'                => '128M',
		}
	}
}

# sistema teampass

    mysql::db { 'prod_teampass':
            user     => 'teampass_user',
            password => 'senha_teampass',
            host     => 'teampass.hacklab',
            grant    => ['all'],
    }

# usuario gutocarvalho

    mysql_user{ 'gutocarvalho@10.138.25.102':
            ensure        => present,
            password_hash => mysql_password('minhasenha'),
            require       => Class['mysql::server'],
    }

} {% endcodeblock %}

Vamos aplicar a configuração

puppet agent -t

Acompanhe a saída

Info: Retrieving plugin
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/puppet_vardir.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/root_home.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/pe_version.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/facter_dot_d.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Info: Caching catalog for puppet.hacklab
Info: Applying configuration version '1395659615'
Notice: /Stage[main]/Main/Node[puppet.hacklab]/Mysql_user[gutocarvalho@10.138.25.102]/ensure: created
Notice: Finished catalog run in 5.79 seconds

Veja que o usuário foi criado no mysql.

5.4 Configurando grant para usuário

Agora vamos ver como definir um grant para um usuário, no caso vamos dizer ao puppet que o usuário gutocarvalho terá permissão de SELECT no banco prod_teampass.

{% codeblock lang:puppet %} node “mysql.hacklab” {

# instalando mysql server

class { 'mysql::server':
	root_password    => 'suasenha',
	override_options => {
		'mysqld' => {
			'connect_timeout'                 => '60',
			'bind_address'                    => '0.0.0.0',
			'max_connections'                 => '1400',
			'max_allowed_packet'              => '512M',
			'thread_cache_size'               => '16',
			'query_cache_size'                => '128M',
		}
	}
}

# sistema teampass

    mysql::db { 'prod_teampass':
            user     => 'teampass_user',
            password => 'senha_teampass',
            host     => 'teampass.hacklab',
            grant    => ['all'],
    }

# usuario gutocarvalho

	mysql_user { 'gutocarvalho@10.138.25.102':
            ensure        => present,
            password_hash => mysql_password('minhasenha'),
            require       => Class['mysql::server'],
   }

# grant para usuario gutocarvalho no banco teampass

	mysql_grant { 'gutocarvalho@10.138.25.102/prod_teampass.*':
            user       => 'gutocarvalho@10.138.25.102',
            table      => 'prod_teampass.*',
            privileges => ['SELECT'],
	}

} {% endcodeblock %}

Vamos aplicar a configuração

puppet agent -t

Acompanhe a saída

Info: Retrieving plugin
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/puppet_vardir.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/root_home.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/pe_version.rb
Info: Loading facts in /etc/puppet/modules/stdlib/lib/facter/facter_dot_d.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Info: Caching catalog for puppet.hacklab
Info: Applying configuration version '1395660070'
Notice: /Stage[main]/Main/Node[puppet.hacklab]/Mysql_grant[gutocarvalho@10.138.25.102/prod_teampass.*]/ensure: created
Notice: Finished catalog run in 7.50 seconds

O grant foi criado.

6. Amarrando as pontas

Neste post eu abordei apenas estes três procedimentos, são os mais comuns, os mais usados. Com o que você fez até aqui, já dá para ter uma ideia de como instalar, configurar e utilizar um módulo da puppetlabs.

Observe que a declaração dos recursos no node serve como uma documentação, como o Miguel Filho diz, é uma verdadeira documentação executável, tudo o que você precisa saber sobre esse servidor de banco está ali, e com esse dados você inclusive consegue reconstruir a máquina rapidamente.

O uso do Puppet torna a administração do sgbd um processo limpo, organizado, rápido e eficiente, vale a pena usá-lo.

7. Referências