Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Outro banco de dados

Eu consegui a automatização da instalação do mysql e a criação do banco de dados. Como faço para outro banco de dados que também vemos no curso do alura como o postgres? Eu fiz um script que instala o postgres com sucesso, mas não consigo criar o banco tão facilmente como mysql, como posso criar um banco de dados postgres e criar usuário e dar acesso ao banco com grant via script puppet?

12 respostas

Oi Fagner,

O que acontece quando você tenta criar o banco ? Ocorre algum erro ? Se sim posta aqui por favor.

Olá Caio, tudo bem.

O erro que ocorre é esse:

err: /Stage[main]/Create::Db/Exec[nome_banco]/returns: change from notrun to 0 failed: psql -u root createdb nome_banco returned 1 instead of one of [0] at /vagrant/modules/postgres/manifests/init.pp:38

Meu script está assim:

class postgres{
    include postgres::install, create::db
}
class postgres::install{
    exec { "apt-update":
        command => "/usr/bin/apt-get update",
    }

    exec { "apt-upgrade":
        command => "/usr/bin/apt-get -y dist-upgrade",
        refreshonly => true,
    }

    package { [ "libpq-dev", "postgresql", "postgresql-contrib", "postgresql-client-common", "sqlite3" ]:
        ensure => present,
        require => [Exec["apt-update"], Exec["apt-upgrade"]],
    }
}

class create::db{
    service { "postgresql":
        ensure => running,
        enable => true,
        hasstatus => true,
        hasrestart => true,
        require => Package["postgresql"]
    }
    exec { "nome_banco":
        command => "psql -u root createdb nome_banco",
        unless => "psql -u root nome_banco",
        path => "/usr/bin",
        require => Service["postgresql"]
    }
}

Class["postgres::install"] -> Class["create::db"]

Como posso resolver isso?

Também queria criar usuário e dá permissão com grant usando o comando: GRANT ALL PRIVILEGES ON DATABASE nome_banco TO nome_banco

Alguém aí pode me ajudar??? Ninguém pode dar um help?

Olá Fagner

Primeiramente desculpe a demora. Dei uma pesquisada sobre a instalação do postgres via puppet, o que achei foi o seguinte: Devido a complexidade para configurar o postgres, foi criado um módulo do puppet para facilitar a nossa vida, o que temos que fazer é baixar e instalar esse cara usando as facilidades do vagrant:

    config.vm.provision :shell do |shell|
        shell.inline = "mkdir -p /etc/puppet/modules;
        puppet module install puppetlabs-postgresql"
    end
    config.vm.provision :puppet do |puppet|
        puppet.manifests_path = "manifests"
        puppet.manifest_file = "postgresql.pp"
    end

O puppet.manifest_file no exemplo é o postgresql.pp mas ficaria na sua preferência, nesse cara deve ter tudo o que ver quer postgresql:

  • Configurações básicas do postgree
class { 'postgresql::server': }
  • Criar o banco de dados :
postgresql::server::db { 'nomeDoBanco':
  user     => 'usuario',
  password => postgresql_password('usuario', 'senha'),
}

Agora a parte chata, configuração de permissões e etc:

postgresql::server::role { 'role':
password_hash => postgresql_password('role', 'mypasswd'),
}

postgresql::server::database_grant { 'test1':
  privilege => 'ALL',
  db        => 'nomeDoBanco',
  role      => 'role',
}

link da documentação (inglês):https://github.com/puppetlabs/puppetlabs-postgresql

Pelo que está escrito na documentação, o banco escolhido vai ter todos privilégios possíveis.

Infelizmente eu não consegui testar esses caras devido a um problema na minha versão do puppet, mas acredito que isso vai poder de ajudar.

Lembrando que isso é o que está sendo usado hoje em dia para vagrant+puppet+postgresql em produção inclusive.

Pode-nos dar um feedback informando se deu certo ?

Olá Caio, desculpe a demora também, mas é que minha questão ficou um bom tempo sem resposta dae pensei que tinham desistido. Mas, obrigado por responder. Vamos a questão, vou tentar implementar dessa forma, é diferente do que até então eu estava trabalhando. Mas antes tenho algumas dúvidas. Esse puppetlabs parece que tem que ser instalado antes, se tem, onde tem que ser instalado, na máquina virtual ou na minha máquina local?

Pelo script, vi que pelo shell ele cria uma pasta chamada modules e depois instala o puppetlabs-postgresql, mas o path ficou na pasta manifests, e onde fica essa pasta manifests? Ela deve ser criada também? Quando?

E o arquivo postgresql.pp onde ele fica? Eu entendi que ele cria um arquivo com o nome que a gente deu, mas onde?

Se eu quisesse além do postgres, instalar outras ferramentas do puppetlabs, onde eles ficariam, em pasta diferentes ou na mesma pasta?

Como executo esses scripts? Pelo curso e em tutoriais, vi que uma vez na máquina virtual você executa os scripts puppet com:

 sudo puppet apply /vagrant/manifests/nome_do_arquivo.pp

ou se tiver trabalhando com módulos (em pastas), basta executar:

sudo puppet apply --modulepath=/vagrant/modules /vagrant/manifests/nome_do_arquivo.pp

Já com o puppetlabs como se executa o script?

No mais é isso, agradeço a atenção Caio, e mais uma vez se puder me ajudar, pois achei interessante essa maneira de trabalhar, mas tenho que conhecer melhor, pesquisei aqui e vi que tem várias outras ferramentas com o puppetlabs.

Oi Fagner, vou tentar responder suas dúvidas:

  • O puppetlabs é instalado na máquina virtual.

  • O manifests_path é para indicar onde vai ficar os arquivos que serão compatilhados, ou seja, vai ficar na sua máquina. Essa parte é parecida com o do curso. ( lembra do web.pp usado no curso ? Fica na pasta manifests)

  • postgresql.pp vai ficar na manifests, assim como o web.pp usada no curso fica também. ( Eu quis separar para ficar mais fácil a manutenção depois, o postgresql exige muita configuração).

  • Se quiser usar outras bibliotecas do puppetlabs o processo é dessa forma :

  • No vagrantfile você vai colocar essa informação:

config.vm.provision :shell do |shell|
        shell.inline = "mkdir -p /etc/puppet/modules;
        puppet module install <nome da lib, tem que ver no site>"
    end

config.vm.provision :puppet do |puppet|
        puppet.manifests_path = "manifests"
        puppet.manifest_file = "<SeuScript.pp>"
    end
  1. Feito isso, assim que você fazer um vagrant up, o vagrant vai fazer toda a instalação da lib. Depois é fazer o ssh e rodar o SeuScript.pp da forma que foi mostrado no curso, como você mesmo apontou :
 sudo puppet apply /vagrant/manifests/seuscript.pp

O esquema de --modulepath eu não conhecia, parece ser bastante interessante.

Faça o teste ai, qualquer coisa nos informe aqui no tópico.

abraços!

Ok Caio, acho que entendi, mas ainda tenho algumas dúvidas. Mas antes, eu testei o script inclusive numa vm com box do puppetlabs que veio com o SO ubuntu 14.04 precise 32bits. Bom, eu adicionei os códigos de provisões no vagrantfile, depois criei a pasta manifests e dentro dela adicionei o arquivo postgresql.pp com o código especificado para criar o banco e dar acesso. Ao acessar a vm e executar o comando de execução do puppet, ele deu um erro:

Error: Evaluation Error: Error while evaluating a Resource Statement, Could not find declared class postgresql::server at /vagrant/manifests/postgresql.pp:1:1 on node localhost

Parece que ele espera no código essa classe ou função postgresql::server que realmente não tem abaixo, só tem as outras como o postgresql::server::db

Agora, voltando a minha dúvida que restou, ele funcionando, se eu criar outros scripts dentro da pasta manifest além do postgresql.pp ele vai executar esses scripts também, e em qual sequencia de execução? Tem como determinar? Obrigado por estar ajudando.

Caio, depois de fazer algumas verificações com relação ao problema, parece que o vagrant não está instalando o puppetlabs-postgresql. Eu entrei na vm e executei o comando puppet module list, em que ele tem que trazer a listagem dos módulos dos puppetlabs instalados, dae ele não trouxe nenhum, ou seja, o vagrant não está instalando o modulo.

Depois já estando na vm eu instalei manualmente o módulo, puppet module install postgresql

Ele instalou normalmente, depois fui executar o script do puppet, e ele me retornou um erro:

Warning: Config file /home/vagrant/.puppetlabs/etc/code/hiera.yaml not found, using Hiera defaults
Warning: Scope(Concat[/etc/postgresql/9.3/main/pg_ident.conf]): The $force parameter to concat is deprecated and has no effect.
Notice: Compiled catalog for localhost in environment production in 1.70 seconds
Error: Parameter user failed on Exec[validate postgres connection for @:5432/postgres]: Only root can execute commands as other users at /home/vagrant/.puppetlabs/etc/code/modules/postgresql/manifests/validate_db_connection.pp:67

Agora eu não sei o que pode está dando errrado, e também como fazer pro vagrant instalar os modulos que são colocados no vagrantfile. Lembrando que ainda também tenho as dúvidas anteriores.

solução!

Oi Fagner

Eu testei o vagrant file que te passei e estava com problema aqui também =[.

Depois de testar aqui, cheguei nesse provision shell :

    config.vm.provision :shell do |shell|
        shell.inline = " sudo apt-get udpate;
        mkdir -p /etc/puppet/modules;
        puppet module install puppetlabs-postgresql"
    end

Pode testar novamente ? Veja que esse cara deve ficar em cima da provision de puppet

No aguardo do seu post, e desculpe a demora.

Olá Caio, tudo jóia? Desculpe a demora em responder, correria... Mas deu certo sim. Na verdade eu utilizei outra box e com ela deu certo, quando executei o vagrant ele instalou os módulos certinho, acho que tem que instalar alguma coisa antes para que ele possa instalar esses módulos. Eu estou tentando agora trabalhar com estrutura de módulos usando esses módulos do puppetlabs, mas não estou conseguindo. Minha estrutura segue esse padrão:

manifests
    nodes.pp
    web.pp
modules
    django
        manifests
            init.pp
        files
            (empty directory)
    postgres
        manifests
            init.pp
        files
            (empty directory)

No vagrantfile eu coloquei a linha:

puppet.module_path = "/vagrant/modules"

E nos arquivos web.pp e nodes.pp eu faço a chamada, sendo que no arquivo web.pp você faz a chamada do nó:

import 'nodes.pp'

No arquivo nodes.pp eu faço os includes dos módulos que eu tenho que são os nomes das classes, no caso por exemplo, o django e o postgres:

node default {
        include django
        include postgres
}

Se executar, com script normal que tenha suas classes apenas pra fazer algo, funciona numa boa. O problema é quando trabalha com módulos do puppetlabs, quando inclui as classes desses módulo, dá erro, o puppet não aceita.

O que eu vi é que normalmente pra executar com estruturas de módulos as classes são declaradas da seguinte forma:

class django {

}

Mas as classes para os módulos do puppetlabs qualquer que seja, são declaradas da seguinte forma:

class { 'django':

}

E dessa forma dá erro, pra eu conseguir fazer executar o script e funcionar, tive que deixar de trabalhar com estrutura de módulos e coloquei tudo em um script só, no caso o web.pp dentro do manifests. Ainda estou verificando como trabalhar com os módulos puppetlabs usando a estrutura de módulos.

Oi fagner

Para ver esse novo problema, você pode criar um novo tópico ? Assim vai ficar mais fácil para as pessoas pesquisar os problemas, ai você marca como solução este e quando você criar um novo podemos ver esse problema com o labs.

abraço

Ah, ok. Vou iniciar outro tópico então, rsrsrs. Foi no impulso aqui. Mas mesmo trabalhando apenas com um script, funcionou, ele criou o banco normal e deu as devidas permissões. Aí fica a dica pro pessoal para trabalhar com os módulos do puppetlabs para instalações e configurações de ferramentas mais complicadas para automatização.