Chef - Instalando o ambiente comum

Fonte: Wikiversidade
Saltar para a navegação Saltar para a pesquisa

Chef é uma plataforma robusta e completa de automação, que transforma infraestrutura em código, ou seja, permite que instalação, manutenção e configuração de ambientes de infraestrutura sejam feitas de formas automáticas. Chef Possui vários módulos que permitem um alto nível de automação em vários níveis de abstração. Para esse tutorial será usado o Chef-Solo para automatização do ambiente de Ruby on Rails. Utilizando chef você garante que todos os desenvolvedores vão ter a mesma versão de todos os itens de configuração necessário, não havendo divergência de ambiente.

Utilizando a ferramenta Vagrant podemos testar nossa configuração antes de irmos para um servidor de produção. Assumindo que temos uma vagrant box instalada e funcional, iremos focar no chef.

Instalando o chef[editar | editar código-fonte]

Para grandes infraestruturas o recomendado é utilizar o chef-server que permite automatizar e manter toda infraestrutura com mais de um servidor e várias receitas diferentes, para casos mais simples o chef-solo é suficiente, para isso nós vamos utilizar uma gem chamada 'knife-solo' que engloba o chef-solo e outros comando úteis.

  • knife solo init é usado para criar uma estrutura de diretorio que é padrao com o Chef e é utilizado para criar e guardar receitas
  • knife solo prepare user@target-node intala o chef em um nó
  • knife solo cook user@target-node atualiza as receitas nesse nó, esse comando é utlizado se voce estiver atualizado a configuracao nesse nó.
  • knife solo bootstrap user@target-node combina o prepare e o cook em comando, utilizado na primeira vez que estiver configurando um nó
  • knife solo clean limpa o nó.

Para instalar essa gem, basta colocar a mesma no seu Gemfile e rodar um bundle install.

Depois o rode o comando knife solo init . para preparar a estrutura de pastas, a comunidade Chef chama essa estrutura de Kitchen.

Administrando dependências[editar | editar código-fonte]

A comunidade chef já tem vários livros de receita preparados e a gem librarian-chef permite manter essas receitas de maneira similar ao bundle.

Coloque a gem librarian-chef no seu Gemfile e rode bundle install.

Depois rode o comando librarian-chef init isso irá criar um Cheffile onde você pode manter suas receitas. Edite o seu Cheffile como no exemplo abaixo.

1 site 'https://supermarket.getchef.com/api/v1'
2 
3 cookbook 'application_ruby'
4 cookbook 'apt'
5 cookbook 'user'
6 cookbook 'ssh_known_hosts'
7 cookbook 'ruby_build'

Execute o comando librarian-chef install para instalar esses cookbooks.

Criando seu livro de receitas e sua própria receita chef[editar | editar código-fonte]

A sintaxe do ruby permite códigos expressivos e fáceis de ler. Nessa receita nós configuramos tudo que é necessário para o nosso rails app funcionar, desde de instalar dependencias do SO até o próprio app.

 1 execute "apt-get update" do #Primeiro roda um apt get update para atualizar todos 
 2   command "apt-get update"  #os pacotes do ubuntu, toda vez que a gente preparar essa receita
 3 end
 4 
 5 # Instala as dependencias necessarias para os proximos passos
 6 %w(git ruby-dev build-essential libsqlite3-dev libssl-dev).each do |pkg|
 7   package pkg
 8 end
 9 
10 # Cria um deployer user, sudoer e com as ssh keys para o github
11 user_account 'deployer' do
12   create_group true
13 end
14 group "sudo" do
15   action :modify
16   members "deployer"
17   append true
18 end
19 cookbook_file "id_rsa" do
20   source "id_rsa"
21   path "/home/deployer/.ssh/id_rsa"
22   group "deployer"
23   owner "deployer"
24   mode 0600
25   action :create_if_missing
26 end
27 cookbook_file "id_rsa.pub" do
28   source "id_rsa.pub"
29   path "/home/deployer/.ssh/id_rsa.pub"
30   group "deployer"
31   owner "deployer"
32   mode 0644
33   action :create_if_missing
34 end
35 
36 # Permite sudo sem senha, isso facilita o deploy com capistrano
37 cookbook_file "sudo_without_password" do
38   source "sudo_without_password"
39   path "/etc/sudoers.d/sudo_without_password"
40   group "root"
41   owner "root"
42   mode 0440
43   action :create_if_missing
44 end
45 
46 # Permite o deployer fazer conexoes SSH
47 cookbook_file "authorized_keys" do
48   source "authorized_keys"
49   path "/home/deployer/.ssh/authorized_keys"
50   group "deployer"
51   owner "deployer"
52   mode 0600
53   action :create
54 end
55 
56 # Adiciona o github como host conhecido para clonar sem requisitar autenticacao
57 ssh_known_hosts_entry 'github.com'
58 
59 # Instala o ruby
60 include_recipe 'ruby_build'
61 
62 ruby_build_ruby '2.1.2'
63 
64 link "/usr/bin/ruby" do
65   to "/usr/local/ruby/2.1.2/bin/ruby"
66 end
67 
68 gem_package 'bundler' do
69   options '--no-ri --no-rdoc'
70 end
71 
72 # Instala a aplicacao rails e configura, db e servidor unicorn
73 include_recipe "runit"
74 application 'capistrano-first-steps' do
75   owner 'deployer'
76   group 'deployer'
77   path '/var/www/capistrano-first-steps'
78   repository 'git@github.com:gotealeaf/capistrano-first-steps.git'
79   rails do
80     bundler true
81     database do
82       adapter "sqlite3"
83       database "db/production.sqlite3"
84     end
85   end
86   unicorn do
87     worker_processes 2
88   end
89 end

No arquivo metadata.rb dentro do nosso site-cookbooks coloque os cookbooks que o nosso depende.

1 ## Recipe dependencies
2 depends 'application'
3 depends 'application_ruby'
4 depends 'ruby_build'
5 depends 'user'
6 depends 'ssh_known_hosts'

Vamos cozinhar nossa receita![editar | editar código-fonte]

Colocamos no nosso Vagrantfile onde está nossas receitas e qual receita usar e depois é só rodar um vagrant up que ela vai ser executada!

1 config.vm.provision "chef_solo" do |chef|
2     chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
3     chef.add_recipe "rails-stack"
4 end

Exemplo de ambiente Java/Android no ubuntu e distro[editar | editar código-fonte]

O receita a seguir instala:

  1. Chef recipe
  2. JDK 8 - Oracle
  3. Libs: lib32z1, lib32ncurses5, lib32bz2-1.0, lib32stdc++6
  4. Vim
  5. Wget
  6. Git
  7. Android Studio & Android SDK

arquivo: android-environment.rb[editar | editar código-fonte]

# Adding the user Android
user 'android' do
    comment 'Android user'
    uid '1234'
    gid 'root'
    home '/home/android'
    shell '/bin/bash'
    action :create
end

# Creating directory home to android
directory '/home/android/' do
    owner 'android'
    mode '0755'
    action :create
end

# Adding variables to get android studio and sdk
android_studio_version = "2.1.2.0"
android_studio_build = "143.2915827"
android_studio_file = android_studio_version + '/android-studio-ide-' + android_studio_build + '-linux.zip'
android_studio_path = 'https://dl.google.com/dl/android/studio/ide-zips/' + android_studio_file
android_sdk_file = 'android-sdk_r24.4.1-linux.tgz'
android_sdk_path = 'https://dl.google.com/android/' + android_sdk_file


# Adding java repository to source list
file '/etc/apt/sources.list.d/webupd8team-java.list' do
    content 'deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main
deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main'
    mode '0755'
    owner 'root'
    group 'root'
end

# Install jdk oracle
# execute 'apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886'
execute 'add-apt-repository ppa:webupd8team/java'
execute 'apt-get update'
execute "install jdk oracle" do
    command " apt-get install oracle-java8-installer"
    user "root"
    action :run
end

# Install libs needed to run sdk
execute "install libs" do
    command " apt-get install -y --force-yes  lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6"
    user "root"
    action :run
end

# Packages needed
package 'vim'
package 'wget'
package 'git'
package 'unzip'

# Creating directory android on user android
directory '/home/android/android-studio' do
    owner 'android'
    mode '0755'
    action :create
end

# Getting android studio from dl.google
remote_file '/home/android/android-studio/android-studio.zip' do
    source android_studio_path
    owner 'android'
    mode '0755'
    action :create
end

execute "unzip studio" do
    command "unzip /home/android/android-studio/android-studio.zip -d /home/android/android-studio"
    user "android"
    action :run
    not_if {File.exist?("/home/android/android-studio/android-studio")}
end

# Getting android sdk from dl.google
remote_file '/home/android/android-studio/android-sdk.tgz' do
    source android_sdk_path
    owner 'android'
    mode '0755'
    action :create
end

execute "untar sdk" do
    command "tar -xvzf /home/android/android-studio/android-sdk.tgz -C /home/android/android-studio --strip-components=1"
    user "android"
    action :run
    not_if {File.exist?("/home/android/android-studio/tools")}
end

# Update sdk without ui
execute "update sdk" do
    command "/home/android/android-studio/tools/android update sdk --no-ui"
    user "android"
    action :run
end

execute "remove bin file" do
    command"rm -f /usr/bin/android-studio"
    user "root"
    action :run
end

# Make a symbolic link to studio on /usr/bin
execute "adding bin file" do
    command"ln -s /home/android/android-studio/android-studio/bin/studio.sh /usr/bin/android-studio"
    user "root"
    action :run
end

Pra cozinhar a receita rodamos os comandos no terminal:

# Update system
sudo apt-get update

# Install chef
sudo apt-get install -y --force-yes chef

# Run chef recipe
sudo chef-apply android-environment.rb