Chef - Instalando o ambiente comum

Fonte: Wikiversidade

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.

site 'https://supermarket.getchef.com/api/v1'

cookbook 'application_ruby'
cookbook 'apt'
cookbook 'user'
cookbook 'ssh_known_hosts'
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.

execute "apt-get update" do #Primeiro roda um apt get update para atualizar todos 
  command "apt-get update"  #os pacotes do ubuntu, toda vez que a gente preparar essa receita
end

# Instala as dependencias necessarias para os proximos passos
%w(git ruby-dev build-essential libsqlite3-dev libssl-dev).each do |pkg|
  package pkg
end

# Cria um deployer user, sudoer e com as ssh keys para o github
user_account 'deployer' do
  create_group true
end
group "sudo" do
  action :modify
  members "deployer"
  append true
end
cookbook_file "id_rsa" do
  source "id_rsa"
  path "/home/deployer/.ssh/id_rsa"
  group "deployer"
  owner "deployer"
  mode 0600
  action :create_if_missing
end
cookbook_file "id_rsa.pub" do
  source "id_rsa.pub"
  path "/home/deployer/.ssh/id_rsa.pub"
  group "deployer"
  owner "deployer"
  mode 0644
  action :create_if_missing
end

# Permite sudo sem senha, isso facilita o deploy com capistrano
cookbook_file "sudo_without_password" do
  source "sudo_without_password"
  path "/etc/sudoers.d/sudo_without_password"
  group "root"
  owner "root"
  mode 0440
  action :create_if_missing
end

# Permite o deployer fazer conexoes SSH
cookbook_file "authorized_keys" do
  source "authorized_keys"
  path "/home/deployer/.ssh/authorized_keys"
  group "deployer"
  owner "deployer"
  mode 0600
  action :create
end

# Adiciona o github como host conhecido para clonar sem requisitar autenticacao
ssh_known_hosts_entry 'github.com'

# Instala o ruby
include_recipe 'ruby_build'

ruby_build_ruby '2.1.2'

link "/usr/bin/ruby" do
  to "/usr/local/ruby/2.1.2/bin/ruby"
end

gem_package 'bundler' do
  options '--no-ri --no-rdoc'
end

# Instala a aplicacao rails e configura, db e servidor unicorn
include_recipe "runit"
application 'capistrano-first-steps' do
  owner 'deployer'
  group 'deployer'
  path '/var/www/capistrano-first-steps'
  repository 'git@github.com:gotealeaf/capistrano-first-steps.git'
  rails do
    bundler true
    database do
      adapter "sqlite3"
      database "db/production.sqlite3"
    end
  end
  unicorn do
    worker_processes 2
  end
end

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

## Recipe dependencies
depends 'application'
depends 'application_ruby'
depends 'ruby_build'
depends 'user'
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!

config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "rails-stack"
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