Tecnologia

DevOps na prática: Instalando PostgreSQL compilado com CHEF

Por: , novembro 8, 2013

Este Post tem o intuito de apresentar como instalar e configurar o PostgreSQL 9.3.1 compilado através do CHEF. Além disso, a receita que apresentarei pode ser adicionada para trabalhar com um disco otimizado: RAID / EBS / EBS IO Otimizado / SAS / etc.

Utilizarei o CHEF-SOLO para execução do procedimento, porém, a mesma receita pode ser adicionada para trabalhar com Client/Server.

Preparando o nosso ambiente:

OBS.: realizei os testes em Ubuntu Server.

1 – Instale o client do GIT para baixar a receita

# apt-get install git-core

2 – Instalar o CHEF-SOLO

#curl -L https://www.opscode.com/chef/install.sh | bash
# wget http://github.com/opscode/chef-repo/tarball/master
# tar -zxvf master
# mv opscode-chef-repo-f9d4b0c/ /opt/chef-repo
# mkdir /opt/chef-repo/.chef

3 – Configurar o CHEF-SOLO

Crie o arquivo /opt/chef-repo/.chef/knife.rb e adicione a seguinte linha:

cookbook_path [ '/opt/chef-repo/cookbooks' ]

Crie o arquivo /opt/chef-repo/solo.rb e adicione as seguintes linhas:

file_cache_path "/opt/chef-solo"
cookbook_path "/opt/chef-repo/cookbooks"

4 – Realize o Download da receita

# git clone https://github.com/ximenes/chef_pginstall.git -l /opt/chef-repo/cookbooks/pginstall

5 – Crie o arquivo JSON para execução da receita (/opt/chef-repo/JSON_NAME.json) e adicione a seguinte linha:

{ "run_list": [ "recipe[pginstall]" ] }

6 – Agora, basta executar a receita pginstall baixada do GitHub:

# chef-solo -c /opt/chef-repo/solo.rb -j /opt/chef-repo/JASON_NAME.json

Depois da execução da receita, o PostgreSQL já esta rodando e apto a receber os databases necessários.

Mas a intenção deste Post não somente realizar a instalação do Postgres, mas sim explicar um pouco o funcionamento da ferramenta. Para isso, logo abaixo, estou postando a receita comentada:

#
# Cookbook Name:: pginstall
# Recipe:: PostgreSQL 9.3.1
#
# Copyright 2013, Eduardo Ximenes Soares
#
# All rights reserved - Do Not Redistribute
#
####### Pacotes essênciais para instalação do Postgres Compilado: #######
package "build-essential" do
  action :install
end
package "zlib1g-dev" do
  action :install
end
package "libreadline6-dev" do
  action :install
end
#########################################################################
####### Realizando o download e a instalação do PostgreSQL 9.3.1  #######
bash "download_install_pg" do
  user "root"
  code <<-EOH
    wget http://ftp.postgresql.org/pub/source/v9.3.1/postgresql-9.3.1.tar.gz -O /opt/postgresql-9.3.1.tar.gz
    tar -zxf /opt/postgresql-9.3.1.tar.gz -C /opt/
    (cd /opt/postgresql-9.3.1/ && ./configure --prefix=/usr/local/pgsql9.3.1 && make && make install)
  EOH
end
####### Adicionando arquivo de START do PostgreSQL no /etc/init.d #######
####### Adicionei este item na receita, pois necessita de uma 	  #######
####### configuração específica					  #######
cookbook_file "/etc/init.d/postgresql" do
  source "postgresql"
  mode 0544
  owner "root"
  group "root"
end
####### Criando link simbólico necessário para armazenar os	  #######
####### executáveis do PostgreSQL 				  #######
execute "link_pg" do
  command "ln -s /usr/local/pgsql9.3.1/ /usr/local/pgsql"
end
####### Adicionando o start do PostgreSQL para iniciar	          #######
####### automaticamente						  #######
execute "start_default_pg" do
  command "update-rc.d postgresql defaults"
end
####### Criando o diretório /DATABASE caso ele não exista	  #######
####### Caso no seu servidor tenha RAID ou EBS (AWS) otimizado    #######
####### monte o disco neste diretório, pois ele armazenará 	  #######
####### a estrutura do banco de dados				  #######
directory "/database" do
  owner "postgres"
  group "postgres"
  mode 0755
  action :create
  ignore_failure true
end
####### Criando o usuário postgres				  #######
execute "add_user_pg" do
 command "useradd postgres --home-dir /database --shell /bin/bash"
 ignore_failure true
end
####### Adicionando o PTBR no locale-gen			  #######
####### Arquivo de referência: pasta files/default/locale-gen     #######
cookbook_file "/var/lib/locales/supported.d/local" do
  source "locale-gen"
   mode 0544
  owner "root"
  group "root"
end
####### Lendo as novas configurações de locale			  #######
execute "locale_gen" do
 command "locale-gen"
end
####### Configurando o locale default na máquina		  #######
####### Arquivo de referência: pasta files/default/locale_etc	  #######
cookbook_file "/etc/default/locale" do
  source "locale_etc"
  mode 0554
  owner "root"
  group "root"
end
####### Adicionando o profile no home do usuário Postgres	  #######
####### Arquivo de referência: pasta files/default/profile_pg	  #######
cookbook_file "/database/.profile" do
  source "profile_pg"
  owner "postgres"
  group "postgres"
  mode 0755
end
####### Criando o diretório de armazenamento dos arquivos do PG   #######
directory "/database/data" do
  owner "postgres"
  group "postgres"
  mode 0700
  action :create
end
####### Iniciando o cluster do postgreSQL 			  #######
execute "initdb" do
  command "su postgres -l -c 'initdb'"
  action :run
end
####### Iniciando o serviço do PostgreSQL			  #######
service "postgresql" do
 action :start
end

Neste post foi apresentado a receita do CHEF para maior entendimento de como a ferramenta CHEF funciona. Temos inúmeras receitas espalhadas e normalmente temos dificuldades em executá-la, por isso a necessidade deste entendimento.

Você poderia falar: "eu faço um shell script para isso"

Eu também fazia, mas era só mudar a versão de Kernel que o script quebrava.

A receita esta disponível no Github: https://github.com/ximenes/chef_pginstall/

Pense, se eu precisar de um plano de continuidade, basta executar esta receita do CHEF e restaurar um dump da base de dados!! Para Dev, o sprint 0 reduz bastante também.