Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Script não funciona de maneira idempotente - p. 2

Toda vez que o script de provisionamento, da Aula 04 - Atividade 03 do curso de Vagrant/Puppet, é executado no Puppet, é adicionada a linha da variável de ambiente no arquivo /etc/default/tomcat7.

O resultado após 2 execuções seguidas está abaixo, e pode ser visualizado com o comando tail -n 3 /etc/default/tomcat7

#AUTHBIND=no
JAVA_OPTS="$JAVA_OPTS -Dbr.com.caelum.vraptor.environment=production"
JAVA_OPTS="$JAVA_OPTS -Dbr.com.caelum.vraptor.environment=production"

A mesma dúvida foi questionada anteriormente, mas acredito que tenha sido respondido algo que não está relacionado a pergunta, seguindo a tradução dessa resposta no Stack Overflow

Dúvida anterior no fórum da Alura

Dúvida no Stack Overflow

Segue abaixo o arquivo utilizado para o Puppet (web.pp)

exec { 'apt-update':
  command => '/usr/bin/apt-get update'
}

package { ['openjdk-7-jre', 'tomcat7', 'mysql-server']:
  ensure  => installed,
  require => Exec['apt-update'] # Executa após o comando
}

service { 'tomcat7':
  ensure     => running, # Garante um estado ao final da execução
  enable     => true,    # Garante que estará habilitado
  hasstatus  => true,    # Tem a consulta de estado
  hasrestart => true,    # Tem a opção 'restart' 'stop'
  require    => Package['tomcat7'] # Executa após o package
}

service { 'mysql':
  enable     => true,
  ensure     => running,
  hasrestart => true,
  hasstatus  => true,
  require    => Package['mysql-server']
}

exec { 'musicjungle':
  command => 'mysqladmin -u root create musicjungle',
  path    => '/usr/bin:/usr/sbin:/bin:/usr/local/bin',
  unless  => 'mysql -u root musicjungle',
  require => Service['mysql']
}

exec { 'musicjungle-senha':
  command => "mysql -uroot -e \"GRANT ALL PRIVILEGES ON * TO 'musicjungle'@'%' IDENTIFIED BY 'minha-senha';\" musicjungle",
  path    => '/usr/bin:/usr/sbin:/bin:/usr/local/bin',
  unless  => 'mysql -umusicjungle -pminha-senha musicjungle',
  require => Exec['musicjungle']
}

file { '/var/lib/tomcat7/webapps/vraptor-musicjungle.war': # destino do arquivo
  source  => '/vagrant/manifests/vraptor-musicjungle.war', # de onde vai copiar o arquivo
  owner   => 'tomcat7', # define dono do arquivo
  group   => 'tomcat7', # define grupo proprietário
  mode    => '0644',    # Leitura geral, escrita e leitura para o dono
  require => Package['tomcat7'], # Executa após o pacote ter sido instalado
  notify  => Service['tomcat7']  # Notifica o serviço para atualizar caso tenha sido modificado o recurso
}

file_line { "production":
    file => "/etc/default/tomcat7",
    line => "JAVA_OPTS=\"\$JAVA_OPTS -Dbr.com.caelum.vraptor.environment=production\"",
    require => Package["tomcat7"],
    notify => Service["tomcat7"]
}

define file_line($file, $line) {
    exec { "/bin/echo '$line' >> '$file'":
        unless => "/bin/grep -qfx '$(line) '$(file)'"
    }
}

# file_line { 'production':
#   path      => '/etc/default/tomcat7',
#   line      => 'JAVA_OPTS=\"\${JAVA_OPTS} -Dbr.com.caelum.vraptor.environment=production\"'
# }
2 respostas

Oi Wilson, tudo bem? Houve um vagrant destroy antes de tentar executar o script novamente?

Negativo, Wanderson.

Sei que na primeira vez ele funciona corretamente, com um destroy e Up, mas a ideia é o script ser idempotente, é subir a máquina, posteriormente com automatização do script do provisionamento, e não criar linhas repetidas no arquivo.